Magento 2 Hinzufügen einer neuen Spalte zum Bestellraster


20

Ich habe der Tabelle mit dem sales_orderNamen eine neue Spalte hinzugefügt . export_statusJetzt möchte ich eine neue Spalte für das Bestellraster mit den Daten aus der neuen sales_orderSpalte hinzufügen .

Es ist mir gelungen, eine Spalte zur the sales_order_gridTabelle hinzuzufügen .

$installer->getConnection()->addColumn($installer->getTable("sales_order_grid"), "xml_exported", [
     'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
     'comment' => 'XML Exported'
]);

Wie kann ich jetzt dafür sorgen, dass es im Bestellraster mit dem Wert aus der sales_order export_statusSpalte angezeigt wird?



Ich denke, es gibt einen besseren Weg, dies zu tun, ohne einen Beobachter einsetzen und Ereignisse verwenden zu müssen.
André Ferraz

In diesem Artikel wird das schrittweise Hinzufügen einer Spalte zum
Kundenauftragsraster beschrieben

Probieren Sie die Lösung hier aus. Diese Methode verwendet das Plugin, um Spalten hinzuzufügen.
Asrar

Ich denke, Sie sollten dies überprüfen: Ein gutes Tutorial sivaschenko.com/magento2-sales-order-grid-column
Abid Malik

Antworten:


42

Nachdem ich viel in Magento-Kerncode gebuddelt hatte, fand ich eine Lösung für meine Frage. Anstatt eine Spalte an das Netz über die Datenbank hinzuzufügen, habe ich eine UI - Komponente sales_order_grid.xmlunter[COMPANY]/[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">
    <columns name="sales_order_columns">
        <column name="export_status" class="[COMPANY]\[MODULE]\Ui\Component\Listing\Column\Status">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="label" xsi:type="string" translate="true">XML Exported</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Dann erstellte die UI-Klasse unter [COMPANY]/[MODULE]/Ui/Component/Listing/Column/Status.php

namespace [COMPANY]\[MODULE]\Ui\Component\Listing\Column;

use \Magento\Sales\Api\OrderRepositoryInterface;
use \Magento\Framework\View\Element\UiComponent\ContextInterface;
use \Magento\Framework\View\Element\UiComponentFactory;
use \Magento\Ui\Component\Listing\Columns\Column;
use \Magento\Framework\Api\SearchCriteriaBuilder;

class Status extends Column
{
    protected $_orderRepository;
    protected $_searchCriteria;

    public function __construct(ContextInterface $context, UiComponentFactory $uiComponentFactory, OrderRepositoryInterface $orderRepository, SearchCriteriaBuilder $criteria, array $components = [], array $data = [])
    {
        $this->_orderRepository = $orderRepository;
        $this->_searchCriteria  = $criteria;
        parent::__construct($context, $uiComponentFactory, $components, $data);
    }

    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            foreach ($dataSource['data']['items'] as & $item) {

                $order  = $this->_orderRepository->get($item["entity_id"]);
                $status = $order->getData("export_status");

                switch ($status) {
                    case "0":
                        $export_status = "No";
                        break;
                    case "1";
                        $export_status = "Yes";
                        break;
                    default:
                        $export_status = "Failed";
                        break;

                }

                // $this->getData('name') returns the name of the column so in this case it would return export_status
                $item[$this->getData('name')] = $export_status;
            }
        }

        return $dataSource;
    }
}

Das hat super geklappt. Ich stehe vor einem Problem, bei dem durch diese Anpassung die Symbolleiste des Bestellrasters nach dem Raster gerendert wird. Haben Sie dieses Problem erlebt?
Ian

@ Ian Ich hatte dieses Problem nicht. Welche Version von Magento 2 verwenden Sie?
André Ferraz

2
CE 2.1.1. Ich habe das Problem festgestellt. Mein Modul kam alphabetisch vor Magento_Sales. Ich habe <sequence> mit einer Abhängigkeit zu Magento_Sales hinzugefügt, mein Modul deaktiviert und es dann wieder aktiviert. Dies hat das Problem behoben.
Ian

1
Funktioniert dies auch für Exportoptionen? In meinem Fall hatten exportierte Daten leere Werte.
MagePsycho

1
Ebenso Magento 1, filter_condition_callbackwo Sie Ihren eigenen benutzerdefinierten Filter nach Feld hinzufügen können. Bitte sag nicht "Was meinst du?" diesmal;)
MagePsycho

33

Meine Lösung ist möglicherweise effizienter, da sie dem systemeigenen Verfahren zum Hinzufügen einer Spalte zum Raster folgt und Sie nicht jede auf der Seite angezeigte Reihenfolge laden müssen, um die Spaltendaten abzurufen ( stattdessen wird die Tabelle sales_order_grid verwendet). Das obige Beispiel zeigt, wie Sie einen benutzerdefinierten Renderer erstellen.

vendor / [vendor] / [package] /view/adminhtml/ui_component/sales_order_grid.xml

<!-- Add the column "my_column" (My Column) to the sales order grid. -->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<columns name="sales_order_columns">
    <column name="my_column">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="filter" xsi:type="string">text</item>
                <item name="label" xsi:type="string" translate="true">My Column</item>
            </item>
        </argument>
    </column>
</columns>

Bitte beachten Sie, dass Sie die Spalte mit dem Dropdown-Widget über dem Bestellraster aktivieren müssen, bevor sie angezeigt wird.

Hersteller / [Hersteller] / [Paket] /etc/di.xml

<!-- Sync the column "my_column" between the sales_order and sales_order_grid tables -->
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
    <arguments>
        <argument name="columns">
            <item name="my_column" xsi:type="string">sales_order.my_column</item>
        </argument>
    </arguments>
</virtualType>

Beispiel-Setup-Code zum Hinzufügen einer Spalte zur Tabelle sales_order_grid (verwenden Sie diesen Code in Ihrem Installations- / Upgrade-Skript). Der gleiche Code funktioniert übrigens auch für die Tabelle sales_order.

$setup->getConnection()->addColumn(
        $setup->getTable('sales_order_grid'),
        'my_column',
        [
            'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            'length' => 255,
            'nullable' => true,
            'comment' => 'My Column'
        ]
    );

Ich hoffe es hilft! :-)


Diese Antwort setzt voraus, dass die Spalte sales_order_grid ist. Richtig?
Tero Lahtinen

@MageParts, wann funktioniert dieses Skript?
SagarPPanchal

1
hat bei mir funktioniert, danke: 3 btw, in dem sales_order_grid.xmldu dein <listing> </ listing> -Tag schließen solltest, sonst wird ein Fehler von xml
fudu 30.09.18

<argument name = "columns"> sollte in der Datei di: xml durch <argument name = "columns" xsi: type = "array"> ersetzt werden. Andernfalls wird der folgende Fehler zurückgegeben. Ungültiges Dokumentelement 'Argument': Die Typdefinition ist abstrakt.
Saiid

1

Um eine neue Spalte im Bestellraster zu erstellen, habe ich Magento Default Module Hersteller / Magento / Modul-Kunden-Kontostand angegeben

In meinem Fall ist die Spalte 'custom_column' bereits in der Tabelle sales_order vorhanden.

Ich muss die Spalte 'custom_column' im Bestellraster anzeigen

Schritt 1: Fügen Sie eine neue Spalte in die Tabelle sales_order_grid ein

        $connection = $installer->getConnection();
        if ($connection->isTableExists('sales_order_grid')) {
            $connection->addColumn(
                $connection->getTableName('sales_order_grid'),
                'custom_column',
                [
                    "type"      =>  Table::TYPE_TEXT,
                    'default'   =>  null,
                    "comment"   =>  'Custom Column'
                ]
            );
    }

Schritt 2: di.xml-Datei in app \ code [Vendor] [NameSpace] \ etc \ di.xml

 <!-- Adding Columns in sales_order_grid-->
    <virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid">
        <arguments>
            <argument name="columns" xsi:type="array">
                <item name="custom_column" xsi:type="string">sales_order.custom_column</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="Magento\SalesArchive\Model\ResourceModel\Order\Grid">
        <arguments>
            <argument name="columns" xsi:type="array">
                <item name="custom_column" xsi:type="string">sales_order.custom_column</item>
            </argument>
        </arguments>
    </virtualType>

Schritt 3: Erstellen Sie die Layoutdatei sales_order_grid.xml unter app \ code [Vendor] [NameSpace] \ view \ adminhtml \ ui_component

<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="custom_column">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Custom Column</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Hinweis: Dies wurde in Magento Version 2.2.6 getestet


0

Demo / ExtendedGrid / view / adminhtml / ui_component / sales_order_grid.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="new_column_name" class="Demo\ExtendedGrid\Ui\Component\Listing\Column\NewColumnStatus">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="sortable" xsi:type="boolean">false</item>
                    <item name="has_preview" xsi:type="string">1</item>
                    <item name="label" xsi:type="string" translate="true">New Column Name</item>
              </item>
            </argument>
        </column>
    </columns>
</listing>

Dann Erstellt die UI-Klasse, um es zu rendern.

Demo / ExtendedGrid / Ui / Component / Listing / Column / NewColumnStatus.php

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Demo\ExtendedGrid\Ui\Component\Listing\Column;

/**
 * Class  NewColumnStatus
 */
class NewColumnStatus extends \Magento\Ui\Component\Listing\Columns\Column
{

    /**
     * @var string[]
     */
    protected $statuses;

   /**
     * Constructor
     *
     * @param ContextInterface $context
     * @param UiComponentFactory $uiComponentFactory
     * @param CollectionFactory $collectionFactory
     * @param array $components
     * @param array $data
     */
       public function __construct(
        \Magento\Framework\View\Element\UiComponent\ContextInterface $context,
        \Magento\Framework\View\Element\UiComponentFactory $uiComponentFactory,
        \Magento\Framework\UrlInterface $urlBuilder,
        array $components = [],
        array $data = []
    ) {
        $this->urlBuilder = $urlBuilder;
         parent::__construct($context, $uiComponentFactory, $components, $data);
    }


    /**
     * Prepare Data Source
     *
     * @param array $dataSource
     * @return void
     */
    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            foreach ($dataSource['data']['items'] as &$item) {

           //put  the logic here


            }
        }

        return $dataSource;
   }
}

Vergessen Sie nicht, den Cache zu leeren.


-1

Ich habe ein benutzerdefiniertes Modul erstellt, das ein benutzerdefiniertes Attribut in der Entität "Kundenauftrag" hinzufügt und dann im Raster "Kundenauftrag" des Administrators anzeigt.

Datei module.xml zum Definieren des Moduls. app \ code \ COMPANY \ 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="COMPANY_MODULE" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Sales"/>
            <module name="Magento_Quote"/>
            <module name="Magento_Checkout"/>
        </sequence>
    </module>
</config>

di.xml-Datei in app \ code \ COMPANY \ MODULE \ etc \ di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
        <arguments>
            <argument name="columns" xsi:type="array">
                <item name="export_status" xsi:type="string">sales_order.export_status</item>
            </argument>
        </arguments>
    </virtualType>
</config>

InstallData.php, um der Datenbanktabelle das benutzerdefinierte Attribut export_status hinzuzufügen

app \ code \ COMPANY \ MODULE \ Setup \ InstallData.php

<?php

namespace COMPANY\MODULE\Setup;

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    /**
     * EAV setup factory
     *
     * @var EavSetupFactory
     */
    private $eavSetupFactory;

    /**
     * Init
     *
     * @param EavSetupFactory $eavSetupFactory
     */
    public function __construct(EavSetupFactory $eavSetupFactory)
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
        if (version_compare($context->getVersion(), '1.0.0') < 0){      
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $salesSetup = $objectManager->create('Magento\Sales\Setup\SalesSetup');
            $salesSetup->addAttribute('order', 'export_status', ['type' =>'varchar']);
            $quoteSetup = $objectManager->create('Magento\Quote\Setup\QuoteSetup'); 
        }
    }
}

sales_order_grid.xml zum Hinzufügen einer benutzerdefinierten Spalte im Kundenauftrags-Administratorraster.

<?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">
    <columns name="sales_order_columns">
        <column name="export_status">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">XML Exported</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Sie können das gesamte Modul herunterladen, indem Sie auf den folgenden Link klicken: http://vdcstaging.co.in/download/add-custom-culumn-to-admin-grid.zip

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.