How to Create Product Grid Serialization in Magento 2

Working the smart way is crucial in business and in Magento 2, you require to be smarter to perform actions quickly!

Whenever you create a custom template and want to apply it to a number of products, you need not do it one by one. I have given the code here to implement product grid serialization in Magento 2. It enables a product grid from where you can select specific products at a time to apply a template or an option.

Steps to Create How to apply Product Grid Serialization in Magento 2

1. Create Tabs.php file

protected function _prepareLayout()
{
    $this->addTab(
        'productgrid',
        [
            'label' => __('Select Product'),
            'url' => $this->getUrl('*/*/actionname', ['_current' => true]),
            'class' => 'ajax',
        ]);
}

2. Create your controller xml file.

<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <container name="root" label="Root">
        <block class="Vendor\Extension\Block\Adminhtml\Option\Edit\Tab\Productgrid"
               name="company.module.edit.tab.productgrid"/>
        <block class="Magento\Backend\Block\Widget\Grid\Serializer" name="productgrid_grid_serializer">
            <arguments>
                <argument name="input_names" xsi:type="string">products</argument>
                <argument name="grid_block" xsi:type="string">company.module.edit.tab.productgrid</argument>
                <argument name="callback" xsi:type="string">getSelectedProducts</argument>
                <argument name="input_element_name" xsi:type="string">products</argument>
                <argument name="reload_param_name" xsi:type="string">products</argument>
            </arguments>
        </block>
    </container>
</layout>

3. Controller php action

use Magento\Backend\App\Action\Context;
use Magento\Catalog\Controller\Adminhtml\Product\Builder;
use Magento\Framework\View\Result\LayoutFactory;
use Magento\Catalog\Controller\Adminhtml\Product;

class Productgridextends Product
{
    protected $resultLayoutFactory;
    public function __construct(
        Context $context,
        Builder $productBuilder,
        LayoutFactory $resultLayoutFactory
    )
    {
        parent::__construct($context, $productBuilder);
        $this->resultLayoutFactory = $resultLayoutFactory;
    }
    public function execute()
    {
        $this->productBuilder->build($this->getRequest());
        $resultLayout = $this->resultLayoutFactory->create();
        $resultLayout->getLayout()->getBlock('company.module.edit.tab.productgrid')
            ->setProducts($this->getRequest()->getPost('products', null));
        return $resultLayout;
    }
}

4. Create Productgrid.php

<?php

use Magento\Backend\Block\Template\Context;
use Magento\Backend\Helper\Data;
use Magento\Catalog\Model\ProductFactory;
use Vendor\Extension\Model\OptionFactory;
use Magento\Framework\Registry;

class Productgridextends\Magento\Backend\Block\Widget\Grid\Extended{
    protected $coreRegistry = null;
    protected $productFactory;


    public function __construct(
        Context $context,
        Data $backendHelper,
        ProductFactory $productFactory,
        OptionFactory $optionFactory,
        Registry $coreRegistry,
        array $data = []
    )
    {
        $this->productFactory = $productFactory;
        $this->optionFactory = $optionFactory;
        $this->coreRegistry = $coreRegistry;
        parent::__construct($context, $backendHelper, $data);
    }
    protected function _construct() {
        parent::_construct();
        $this->setId('product_grid');
        $this->setDefaultSort('entity_id');
        $this->setUseAjax(true);
    }
    protected function _addColumnFilterToCollection($column)
    {
        if ($column->getId() == 'products') {
            $productIds = $this->_getSelectedProducts();
            if (empty($productIds)) {
                $productIds = 0;
            }
            if ($column->getFilter()->getValue()) {
                $this->getCollection()->addFieldToFilter('entity_id', ['in' => $productIds]);
            } else {
                if ($productIds) {
                    $this->getCollection()->addFieldToFilter('entity_id', ['nin' => $productIds]);
                }
            }
        } else {
            parent::_addColumnFilterToCollection($column);
        }
        return $this;
    }
    protected function _prepareCollection()    {
        $collection = $this->productFactory->create()->getCollection()->addAttributeToSelect(
            '*'
        );
        $this->setCollection($collection);
       return parent::_prepareCollection();
    }
    protected function _prepareColumns()
    {
        $this->addColumn(
            'products',
            [
                'type' => 'checkbox',
                'field_name' => 'products_id[]',
                'required' => true,
                'values' => $this->_getSelectedProducts(),
                'align' => 'center',
                'index' => 'entity_id',
                'header_css_class' => 'col-select',
                'column_css_class' => 'col-select'
            ]
        );
        $this->addColumn(
            'name',
            [
                'header' => __('Name'),
                'index' => 'name',
                'header_css_class' => 'col-name',
                'column_css_class' => 'col-name'
            ]
        );
        $this->addColumn(
            'sku',
            [
                'header' => __('SKU'),
                'index' => 'sku',
                'header_css_class' => 'col-sku',
                'column_css_class' => 'col-sku'
            ]
        );
        return parent::_prepareColumns();
    }
    public function getGridUrl(){
        return $this->_getData('grid_url') ? $this->_getData('grid_url') : $this->getUrl('*/*/productgrid', ['_current' => true]);
    }
    protected function _getSelectedProducts(){
        $products = array_keys($this->getSelectedProducts());
        return $products;
    }


    public function getSelectedProducts(){
        $tm_id = $this->getRequest()->getParam('id');
        if (!isset($tm_id)) {
            $tm_id = 0;
        }
        $collection = $this->optionFactory->create()->load($tm_id);
        $data = $collection->getProducts();
        $products = explode(',', $data);
        $proIds = array();
        foreach ($products as $product) {
            $proIds[$product] = array('id' => $product);
        }
        return $proIds;
    }
}

Follow these steps and save yourself from the tedious tasks!

Happy Coding!

Table of Contents