Weitere Massenaktion im Ordnungsraster in magento2 hinzufügen

7

Ich möchte in magento2 Funktionen zum Löschen von Aufträgen erstellen, kann jedoch keine Massenaktionen im Auftragsraster hinzufügen. Bitte helfen Sie mir beim Erstellen von Funktionen zum Löschen von Bestellungen in magento2. Bitte helfen Sie mir, wenn jemand eine Idee hat.

Bhaskar Choubisa
quelle

Antworten:

13

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__
);
Himmat Paliwal
quelle
Hmm Gute Antwort
Murtuza Zabuawala
11

Innerhalb Ihres Moduls möchten Sie die folgende Datei erstellen: view/adminhtml/ui_component/sales_order_grid.xml

Mit den folgenden:

    <?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>

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.phpein Beispiel an, wie Sie Ihren Controller implementieren!

Ash Smith
quelle
Hallo, ich kann die neue Massenaktion hinzufügen, aber mein Controller funktioniert nicht, wenn ich unser Modul hinzufüge. Wenn ich in "Magento / Sales / Controller / Adminhtml / Order" eingebe, funktioniert es, aber wenn ich unser Modul hinzufüge, dann ist es funktioniert nicht . Bitte helfen Sie mir, wie Sie die Massagefunktion in unserem Controller hinzufügen können.
Bhaskar Choubisa
Haben Sie eine etc/adminhtml/routes.xmlDatei 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-adminhtml
Ash Smith
Hallo Ash, wie wir mit dem obigen Code dynamische Massenaktionen hinzufügen können
Manoj Chowrasiya
Verwenden Sie ListingToolbar anstelle von Container. für mich arbeiten.
Virang Jethva
0

Nicht "Container", sondern "ListingToolbar" in der XML-Datei, und alles funktioniert.

Mateusz Tofilski
quelle