In this article, we will check how to add category column and filter in an efficient way (without using objectManager) to the product grid in the Magento 2 admin.
Let's start it by creating custom module.
You can find complete module on Github
Create folder inside app/code/Magelearn/GridColumn
<?php /** * Copyright © All rights reserved. * See COPYING.txt for license details. */ use Magento\Framework\Component\ComponentRegistrar; ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Magelearn_GridColumn', __DIR__);Add composer.json file in it:
{ "name": "magelearn/module-gridcolumn", "description": "Add Extra column Product's category to the products grid in Magento2 Backend.", "type": "magento2-module", "license": "OSL-3.0", "authors": [ { "email": "info@mage2gen.com", "name": "Mage2Gen" }, { "email": "vijaymrami@gmail.com", "name": "vijay rami" } ], "minimum-stability": "dev", "require": {}, "autoload": { "files": [ "registration.php" ], "psr-4": { "Magelearn\\GridColumn\\": "" } } }
<?xml version="1.0" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Magelearn_GridColumn" setup_version="1.0.0"/> </config>
<?xml version="1.0"?> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <columns name="product_columns" class="Magento\Catalog\Ui\Component\Listing\Columns"> <column name="category_id" class="Magelearn\GridColumn\Ui\Component\Listing\Column\Category"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Magelearn\GridColumn\Model\Category\Categorylist</item> <item name="config" xsi:type="array"> <item name="filter" xsi:type="string">select</item> <item name="add_field" xsi:type="boolean">true</item> <item name="label" xsi:type="string" translate="true">Categories</item> <item name="sortOrder" xsi:type="number">75</item> <item name="dataType" xsi:type="string">select</item> </item> </argument> </column> </columns> </listing>
To Display category name on Product listing grid, we will create our column renderer class.
Create Category.php file inside app/code/Magelearn/GridColumn/Ui/Component/Listing/Column folder.
<?php namespace Magelearn\GridColumn\Ui\Component\Listing\Column; use Magento\Framework\View\Element\UiComponentFactory; use Magento\Framework\View\Element\UiComponent\ContextInterface; class Category extends \Magento\Ui\Component\Listing\Columns\Column { protected $_productRepository; protected $_categoryFactory; public function __construct( ContextInterface $context, UiComponentFactory $uiComponentFactory, \Magento\Catalog\Model\ProductRepository $productRepository, \Magento\Catalog\Model\CategoryFactory $categoryFactory, array $components = [], array $data = [] ) { parent::__construct($context, $uiComponentFactory, $components, $data); $this->_productRepository = $productRepository; $this->_categoryFactory = $categoryFactory; } public function prepareDataSource(array $dataSource) { if (isset($dataSource['data']['items'])) { $fieldName = $this->getData('name'); foreach ($dataSource['data']['items'] as & $item) { $productId = $item['entity_id']; $categories = []; $product = $this->_productRepository->getById($productId); $cats = $product->getCategoryIds(); if (count($cats)) { foreach ($cats as $cat) { $category = $this->_categoryFactory->create()->load($cat); $categories[] = $category->getName(); } } $item[$fieldName] = implode(',', $categories); } } return $dataSource; } }
If you want to just add new column on the admin product listing grid then add these code files.
Just remove highlighted code from view/adminhtml/ui_component/product_listing.xml file.
Now, let we check to give category filter option.
Create Categorylist.php file inside app/code/Magelearn/GridColumn/Model/Category folder.
<?php namespace Magelearn\GridColumn\Model\Category; class CategoryList implements \Magento\Framework\Option\ArrayInterface { public function __construct( \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $collectionFactory ) { $this->_categoryCollectionFactory = $collectionFactory; } public function toOptionArray($addEmpty = true) { $collection = $this->_categoryCollectionFactory->create() ->addAttributeToSelect('name')//->addRootLevelFilter()->load(); ->addAttributeToFilter('level', ['gt' => 1]) //remove root category ->addAttributeToFilter('is_active', ['gt' => 0]); //for active categories $options = []; if ($addEmpty) { $options[] = ['label' => __('-- Please Select a Category --'), 'value' => '']; } foreach ($collection as $category) { $options[] = ['label' => $category->getName(), 'value' => $category->getId()]; } return $options; } }
Now, to display result properly after filter, need to modify default DataProvider for ProductDataProvider.
For that first create di.xml file inside app/code/Magelearn/GridColumn/etc folder.
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider" type="Magelearn\GridColumn\Ui\DataProvider\Product\ProductDataProvider" /> </config>
Now create ProductDataProvider.php file inside app/code/Magelearn/GridColumn/Ui/DataProvider/Product/ folder.
<?php namespace Magelearn\GridColumn\Ui\DataProvider\Product; class ProductDataProvider extends \Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider { public function addFilter(\Magento\Framework\Api\Filter $filter) { if ($filter->getField() == 'category_id') { $this->getCollection()->addCategoriesFilter(array('in' => $filter->getValue())); } elseif (isset($this->addFilterStrategies[$filter->getField()])) { $this->addFilterStrategies[$filter->getField()] ->addFilter( $this->getCollection(), $filter->getField(), [$filter->getConditionType() => $filter->getValue()] ); } else { parent::addFilter($filter); } } }
After adding above files, just run Magento commands:
php bin/magento set:upg
php bin/magento set:d:c
php bin/magento set:s:d -f en_US
php bin/magento c:c
php bin/magento c:f
Now, you can see New column "Categories" will be added in product listing grid and also filter with active categories list be added.
0 Comments On "Add category column and filter in an efficient way to the product grid in the Magento 2 admin"