In this tutorial, Today I will explain to how to add custom mass action to product grid in Magento 2. In Magento 2 admin, Product grid created by ui_component. There are some mass actions already available in Magento 2 product grid. But, if you want to add custom mass action to product grid then, you need to extend product_listing.xml file.
Let’s follow the below steps to add custom mass action to product grid.
You may also like this :
- How to Add Custom Mass Action to Customer Grid in Magento 2
- Magento 2 : How to Add Product Grid in UI Form using UIComponent
- Magento 2 : Remove decimals from quantity in product grid
1) First of all, Let’s assume that you have simple module. Now, create product_listing.xml file at app/code/RH/Helloworld/view/adminhtml/ui_component/ and paste the below code :
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
* Created By : Rohan Hapani
*/
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="is_sale_products">
<settings>
<type>is_sale_products</type>
<label translate="true">Is Salable Product</label>
<actions>
<action name="0">
<type>enabled</type>
<label translate="true">Enable</label>
<url path="helloworld/index/massSalable">
<param name="issalable">1</param>
</url>
</action>
<action name="1">
<type>disable</type>
<label translate="true">Disable</label>
<url path="helloworld/index/massSalable">
<param name="issalable">0</param>
</url>
</action>
</actions>
</settings>
</action>
</massaction>
</listingToolbar>
</listing>
2) After that, Create MassSalable.php file at app/code/RH/Helloworld/Controller/Adminhtml/Index/ and paste the below code to update value :
<?php
/**
* Created By : Rohan Hapani
*/
namespace RH\Helloworld\Controller\Adminhtml\Index;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
class MassSalable extends Action
{
/**
* @var Filter
*/
protected $filter;
/**
* @var CollectionFactory
*/
protected $prodCollFactory;
/**
* @var \Magento\Catalog\Api\ProductRepositoryInterface
*/
protected $productRepository;
/**
* @param Context $context
* @param Filter $filter
* @param CollectionFactory $prodCollFactory
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $prodCollFactory,
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository
) {
$this->filter = $filter;
$this->prodCollFactory = $prodCollFactory;
$this->productRepository = $productRepository;
parent::__construct($context);
}
/**
* Execute action
*
* @return \Magento\Backend\Model\View\Result\Redirect
* @throws \Magento\Framework\Exception\LocalizedException | \Exception
*/
public function execute()
{
$salableValue = $this->getRequest()->getParam('issalable');
$collection = $this->filter->getCollection($this->prodCollFactory->create());
foreach ($collection->getAllIds() as $productId) {
$productDataObject = $this->productRepository->getById($productId);
$productDataObject->setData('is_sale',$salableValue);
$this->productRepository->save($productDataObject);
}
$this->messageManager->addSuccess(__('A total of %1 record(s) have been modified.', $collection->getSize()));
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
return $resultRedirect->setPath('catalog/product/index');
}
}
That’s it !!!
Now, you can set value enable/disable of “Sale” attribute value in product. You can set your custom action based on your requirement.
Output :
I hope this blog is easy to understand about how to add custom mass action to product grid in Magento 2. In case, I missed anything or need to add some information, always feel free to leave a comment in this blog, I’ll get back with proper solution.
Stay Safe and Stay Connected !!