Массовое действие Magento2 в сетке заказов на продажу
Я пытаюсь применить массовое действие к sales_order_grid, но ничего не происходит. Я сделал это для того, чтобы:
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>
И имя поставщика/имя_модуля/Контроллер/Adminhtml/Индекс
<?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;
}
}
На самом деле я хочу распечатать определенные поля из всех счетов-фактур заказа в виде единого счета-фактуры для администратора, но моя первая забота - запустить какое-то действие, для этого я использую приведенный выше код на сегодня.
И в 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>
Любая помощь будет признательна.
2 answers
Создайте модуль с именем Vendor_Module, выполнив следующие действия:
Шаг 1: Создать registration.php в разделе:
App/code/Vendor/Module/registration.php
С нижеприведенным содержанием:
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Vendor_Module',
__DIR__
);
Шаг 2: Создайте composer.json в разделе:
Приложение/код/Поставщик/Модуль/композитор.json
С нижеприведенным содержанием:
{
"name": "vendor/module",
"description": "Vendor Module",
"require": {
"php": "~5.6.0|7.0.2|~7.0.6",
"magento/magento-composer-installer": "*"
},
"type": "magento2-module",
"version": "1.0.0",
"license": [
"OSL-3.0",
"AFL-3.0"
],
"extra": {
"map": [
[
"*",
"Vendor/Module"
]
]
}
}
Шаг 3: Создать module.xml в разделе:
App/code/Vendor/Module/etc/module.xml
С нижеприведенным содержанием:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
<module name="Vendor_Module" setup_version="1.0.0">
<sequence>
<module name="Magento_Sales"/>
</sequence>
</module>
</config>
Шаг 4: Создать routes.xml в разделе:
App/code/Vendor/Module/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="ordermass" frontName="ordermass">
<module name="Vendor_Module" />
</route>
</router>
</config>
Шаг 5: Создать MassDelete.php в разделе:
App/code/Vendor/Module/Controller/Adminhtml/Order/MassDelete.php
С приведенными ниже содержание:
<?php
namespace Vendor\Module\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 extends \Magento\Sales\Controller\Adminhtml\Order\AbstractMassAction
{
protected $orderManagement;
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
OrderManagementInterface $orderManagement
) {
parent::__construct($context, $filter);
$this->collectionFactory = $collectionFactory;
$this->orderManagement = $orderManagement;
}
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) cannot be done it .', $countNonDeleteOrder));
} elseif ($countNonDeleteOrder) {
$this->messageManager->addError(__('You done it the order(s).'));
}
if ($countDeleteOrder) {
$this->messageManager->addSuccess(__('We done it %1 order(s).', $countDeleteOrder));
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setPath($this->getComponentRefererUrl());
return $resultRedirect;
}
}
Шаг 6: Создать sales_order_grid.xml в разделе:
App/code/Vendor/Module/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_mass</item>
<item name="label" xsi:type="string" translate="true">Label</item>
<item name="url" xsi:type="url" path="ordermass/order/massDelete"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Label</item>
<item name="message" xsi:type="string" translate="true">Are you sure to do selected items?</item>
</item>
</item>
</argument>
</action>
</massaction>
</listingToolbar>
</listing>
Запустите необходимые команды и протестируйте.
Вам нужно добавить в module.xml
<sequence>
<module name="Magento_Sales"/>
</sequence>
Так что ваш module.xml должно быть
<?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="Vendor_Module" setup_version="1.0.0">
<sequence>
<module name="Magento_Sales"/>
</sequence>
</module>