magento2のOrderグリッドにさらに質量アクションを追加する


回答:


13

カスタムモジュールで動作させるには、adminhtmlのルーターを定義する必要があります。同じことをapp \ code {{your_package}} {{your_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="orderdelete" frontName="orderdelete">
            <module name="Krish_OrderDelete" />
        </route>
    </router>
</config>

管理ルートに独自のfrontNameを定義できます。これで、カスタムマスアクションの下のview \ adminhtml \ ui_componentにある ui xmlファイルで、item name = "url"を検索し、「orderdelete / order / massDelete」のようなパスを設定します。

正しく実装すれば機能するはずです。

受注グリッドに新しいMassDeleteアクションを追加するために私が開発した以下のモジュールを参照してください(以下のすべてのファイルはカスタムモジュール、つまり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__
);

うーん良い答え
Murtuza Zabuawala

11

モジュール内で、次のファイルを作成します。 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="../../../../Ui/etc/ui_configuration.xsd">
      <container name="listing_top">
        <massaction name="listing_massaction">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="actions" xsi:type="array">
                        <item name="delete" xsi:type="array">
                            <item name="type" xsi:type="string">delete</item>
                            <item name="label" xsi:type="string" translate="true">Delete</item>
                            <item name="url" xsi:type="string">sales/order/massDelete</item>
                        </item>
                    </item>
                </item>
            </argument>
        </massaction>
    </container>
  </listing>

でURLパスをカスタマイズする <item name="url" ..>sales/order/massDelete</item>必要に応じ。

見てみましょうMagento\Sales\Controller\Adminhtml\Order\MassCancel.php、あなたのコントローラを実装する方法の例については!


こんにちは、私は新しい大量アクションを追加できますが、モジュールに追加したときにコントローラーが機能しません。動作しません。コントローラにMassaction関数を追加する方法を教えてください。
Bhaskar Choubisa

あなたは持っていますetc/adminhtml/routes.xmlあなたのモジュール内のファイルを?私が作成したadminhtmlに関する記事を参照として使用できます:ashsmith.io/magento2/module-from-scratch-part-5-adminhtml
Ash Smith

こんにちはアッシュ、上記のコードを使用してダイナミックマスアクションを追加する方法
Manoj Chowrasiya

コンテナーの代わりにlistingToolbarを使用します。私のために働いています。
Virang Jethva

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.