Массовое действие 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>

Любая помощь будет признательна.

Author: Ajwad Syed, 2018-10-09

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>

Запустите необходимые команды и протестируйте.

 3
Author: Sukumar Gorai, 2018-10-09 13:38:48

Вам нужно добавить в 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>

 0
Author: Rutvee Sojitra, 2018-10-09 13:21:10