I am trying to apply a mass action to sales_order_grid but there is nothing happening. I have done so for is:
vendor_name/module_name/view/adminhtml/ui_component/sales_order_grid.xml
<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<container name="listing_top">
<massaction name="listing_massaction">
<action name="nameofaction">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">testing</item>
<item name="label" xsi:type="string" translate="true">My Label</item>
<item name="url" xsi:type="url" path="multiorderinvoice/index/massorder"/>
</item>
</argument>
</action>
</massaction>
</container>
</listing>
And vendor_name/module_name/Controller/Adminhtml/Index
<?php
namespace Vendor_Name\Module_Name\Controller\Adminhtml\Index;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
class MassOrder extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
/**
* Authorization level of a basic admin session
*/
/**
* @param Context $context
* @param Filter $filter
* @param CollectionFactory $collectionFactory
*/
public function __construct(Context $context, Filter $filter, CollectionFactory $collectionFactory)
{
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
}
/**
* Cancel selected orders
*
* @param AbstractCollection $collection
* @return \Magento\Backend\Model\View\Result\Redirect
*/
protected function massAction(AbstractCollection $collection)
{
$countCancelOrder = 0;
print_r($collection->getAllIds()); //to check the ids
foreach ($collection->getItems() as $order) {
//do your logic here
$countCancelOrder++;
}
$countNonCancelOrder = $collection->count() - $countCancelOrder;
if ($countNonCancelOrder && $countCancelOrder) {
$this->messageManager->addError(__('%1 order(s) cannot be done it .', $countNonCancelOrder));
} elseif ($countNonCancelOrder) {
$this->messageManager->addError(__('You done it the order(s).'));
}
if ($countCancelOrder) {
$this->messageManager->addSuccess(__('We done it %1 order(s).', $countCancelOrder));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath($this->getComponentRefererUrl());
return $resultRedirect;
}
}
Actually I want to get print of specific fields from all order invoices as a single invoice for admin but my first concern is triggering some action, for this I am using above code for now.
And in Vendor_Name/Module_Name/etc/adminhtml/routes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="admin">
<route id="abc" frontName="abc">
<module name="VendorName_ModuleName" before="Magento_Backend" />
</route>
</router>
Any help will be appreciated.
Best Answer
Create a module with name Vendor_Module by following steps:
Step 1: Create registration.php under:
with below content:
Step 2: Create composer.json under:
with below content:
Step 3: Create module.xml under:
with below content:
Step 4: Create routes.xml under:
with below content:
Step 5: Create MassDelete.php under:
with below content:
Step 6: Create sales_order_grid.xml under:
with below content:
Run the required commands and test.