Sie müssen den Router für adminhtml definieren, damit er mit Ihrem benutzerdefinierten Modul funktioniert. Sie können dasselbe unter app \ code {{your_package}} {{your_module}} \ etc \ adminhtml \ route.xml wie folgt definieren:
<?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="orderdelete" frontName="orderdelete">
<module name="Krish_OrderDelete" />
</route>
</router>
</config>
Sie können Ihren eigenen Frontnamen für die Administratorroute definieren. Suchen Sie jetzt in Ihrer UI-XML-Datei, die unter view \ adminhtml \ ui_component unter benutzerdefinierte Massenaktion verfügbar ist, den Elementnamen = "url" und legen Sie den Pfad wie " orderdelete / order / massDelete " fest.
Es sollte funktionieren, wenn Sie es richtig implementieren.
Bitte beziehen Sie sich auf das folgende Modul, das ich entwickelt habe, um eine neue MassDelete-Aktion im Kundenauftragsraster hinzuzufügen (Alle folgenden Dateien sollten sich in Ihrem benutzerdefinierten Modul befinden, dh package_module ).
1. \etc\module.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Krish_OrderDelete" setup_version="1.0.0">
<sequence>
<module name="Magento_Sales"/>
</sequence>
</module>
</config>
2. \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="orderdelete" frontName="orderdelete">
<module name="Krish_OrderDelete" />
</route>
</router>
</config>
3. \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">
<listingToolbar name="listing_top">
<massaction name="listing_massaction">
<action name="order_delete">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="type" xsi:type="string">order_delete</item>
<item name="label" xsi:type="string" translate="true">Delete</item>
<item name="url" xsi:type="url" path="orderdelete/order/massDelete"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Order(s)</item>
<item name="message" xsi:type="string" translate="true">Are you sure you wan\'t to delete selected items?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
**Note: If you will define your action under tag <listingToolbar>, than new mass action will be added as child mass action.**
4. \Controller\Adminhtml\Order\MassDelete.php
<?php
namespace Krish\OrderDelete\Controller\Adminhtml\Order;
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;
use Magento\Sales\Api\OrderManagementInterface;
/**
* Class MassDelete
*/
class MassDelete extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
/**
* @var OrderManagementInterface
*/
protected $orderManagement;
/**
* @param Context $context
* @param Filter $filter
* @param CollectionFactory $collectionFactory
* @param OrderManagementInterface $orderManagement
*/
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
OrderManagementInterface $orderManagement
) {
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
$this->orderManagement = $orderManagement;
}
/**
* Hold selected orders
*
* @param AbstractCollection $collection
* @return \Magento\Backend\Model\View\Result\Redirect
*/
protected function massAction(AbstractCollection $collection)
{
$countDeleteOrder = 0;
$model = $this->_objectManager->create('Magento\Sales\Model\Order');
foreach ($collection->getItems() as $order) {
if (!$order->getEntityId()) {
continue;
}
$loadedOrder = $model->load($order->getEntityId());
$loadedOrder->delete();
$countDeleteOrder++;
}
$countNonDeleteOrder = $collection->count() - $countDeleteOrder;
if ($countNonDeleteOrder && $countDeleteOrder) {
$this->messageManager->addError(__('%1 order(s) were not deleted.', $countNonDeleteOrder));
} elseif ($countNonDeleteOrder) {
$this->messageManager->addError(__('No order(s) were deleted.'));
}
if ($countDeleteOrder) {
$this->messageManager->addSuccess(__('You have deleted %1 order(s).', $countDeleteOrder));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath($this->getComponentRefererUrl());
return $resultRedirect;
}
}
5. \composer.json
{
"name": "krish/magento2-order-delete",
"description": "extension for deleting orders in magento 2",
"type": "magento2-module",
"version": "1.0.0",
"license": [
"OSL-3.0",
"AFL-3.0"
],
"require": {
"php": "~5.5.0|~5.6.0|~7.0.0",
"magento/magento-composer-installer": "*"
},
"extra": {
"map": [
[
"*",
"Krish/OrderDelete"
]
]
}
}
6. \registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Krish_OrderDelete',
__DIR__
);
Innerhalb Ihres Moduls möchten Sie die folgende Datei erstellen:
view/adminhtml/ui_component/sales_order_grid.xml
Mit den folgenden:
Passen Sie den URL-Pfad
<item name="url" ..>sales/order/massDelete</item>
an Ihre Bedürfnisse an.Schauen Sie sich
Magento\Sales\Controller\Adminhtml\Order\MassCancel.php
ein Beispiel an, wie Sie Ihren Controller implementieren!quelle
etc/adminhtml/routes.xml
Datei in Ihrem Modul? Sie können einen Beitrag, den ich über adminhtml geschrieben habe, als Referenz verwenden: ashsmith.io/magento2/module-from-scratch-part-5-adminhtmlNicht "Container", sondern "ListingToolbar" in der XML-Datei, und alles funktioniert.
quelle