Magento2 – Add Export Functionality in Admin Custom Grid Using Block File

admincustomerexportgridmagento2

I have create custom grid in customer information.
Create export functionality in custom admin grid without template file and ui component

Meetanshi\OrderHistory\view\adminhtml\layout\module_index_custom.xml

<?xml version="1.0"?>

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/layout_generic.xsd">
    <container name="root" label="Root">
        <block class="Vendor\Module\Block\Adminhtml\Edit\Tab\View\Demo" name="custom_tabs" />
    </container>
</layout>

Vendor\Module\Block\Adminhtml\Edit\Tab\View\Demo.php

<?php

namespace Vendor\Module\Block\Adminhtml\Edit\Tab\View;

use Magento\Backend\Block\Template\Context;
use Magento\Backend\Helper\Data;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\Framework\Registry;

class Demo extends \Magento\Backend\Block\Widget\Grid\Extended
{

protected $coreRegistry;

protected $orderFactory;

public function __construct(
    Context $context,
    \Magento\Framework\App\Request\Http $request,
    Data $backendHelper,
    CollectionFactory $orderFactory,
    Registry $coreRegistry,
    array $data = []
) {
    $this->request = $request;
    $this->orderFactory = $orderFactory;
    $this->coreRegistry = $coreRegistry;
    parent::__construct($context, $backendHelper, $data);
}

protected function _construct()
{
    parent::_construct();
    $this->setId('custom_order_grid');
    $this->setUseAjax(true);
}

protected function _prepareCollection()
{
    $collection = $this->orderFactory->create()->addFieldToSelect(
        'increment_id'
    )->addFieldToSelect(
        'status'
    )->addFieldToSelect(
        'total_qty_ordered'
    )->addFieldToSelect(
        'base_discount_amount'
    )->addFieldToSelect(
        'subtotal'
    )->addFieldToSelect(
        'grand_total'
    )->addFieldToFilter(
        'customer_id',
        $this->_request->getParam('id')
    );

    $this->setCollection($collection);
    return parent::_prepareCollection();
}

protected function _prepareColumns()
{
    $this->addColumn(
        'increment_id',
        [
            'header' => __('Order ID'),
            'sortable' => true,
            'index' => 'increment_id'
        ]
    );
    $this->addColumn(
        'status',
        [
            'header' => __('Status'),
            'index' => 'status'
        ]
    );

    return parent::_prepareColumns();
}

public function getGridUrl()
{
    return $this->getUrl('module/*/custom', ['_current' => true]);
}

}

Best Answer

Add the following line before return parent::_prepareColumns():

$this->addExportType('*/*/exportCsv', __('CSV'));

Create new controller for creating csv. Here is the sample:

<?php
namespace VendorName\ModuleName\Controller\Adminhtml\Index;

use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\Response\Http\FileFactory;
use Vendor\Module\Block\Adminhtml\Edit\Tab\View\Demo;
use Magento\Framework\View\Result\PageFactory;

class ExportCsv extends Action
{
    /**
     * @var FileFactory
     */
    private $fileFactory;

    /**
     * @var PageFactory
     */
    private $resultPageFactory;

    /**
     * ExportCsv constructor.
     * @param Context $context
     * @param FileFactory $fileFactory
     * @param PageFactory $resultPageFactory
     */
    public function __construct(
        Context $context,
        FileFactory $fileFactory,
        PageFactory $resultPageFactory
    ) {
        $this->fileFactory = $fileFactory;
        $this->resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }

    public function execute()
    {
        $resultPage = $this->resultPageFactory->create();
        $grid = $resultPage->getLayout()->createBlock(Demo::class);
        $fileName   = "export.csv";
        return $this->fileFactory->create($fileName, $grid->getCsvFile(), DirectoryList::VAR_DIR);
    }
}

You need to adjust with your module.

Related Topic