Magento 2 Come aggiungere una nuova colonna alla griglia degli ordini


20

Ho aggiunto una nuova colonna alla tabella sales_orderchiamata export_status, ora voglio aggiungere una nuova colonna della griglia dell'ordine con i dati della nuova sales_ordercolonna.

Sono riuscito ad aggiungere una colonna alla the sales_order_gridtabella.

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

Come posso ora renderlo effettivamente visibile nella griglia degli ordini con il valore della sales_order export_statuscolonna?



Penso che ci sia un modo migliore per farlo senza dover implementare un osservatore e utilizzare gli eventi.
André Ferraz,

Questo articolo descrive passo dopo passo l'aggiunta della colonna alla griglia degli ordini di vendita: sivaschenko.com/magento2/2016/03/05/…
Sergii Ivashchenko

Prova qui la soluzione Questo metodo utilizza il plugin per aggiungere colonne.
Asrar,

Penso che dovresti dare un'occhiata: Un buon tutorial sivaschenko.com/magento2-sales-order-grid-column
Abid Malik,

Risposte:


42

Dopo molte ricerche nel codice core di magento ho trovato una soluzione alla mia domanda. Invece di aggiungere una colonna alla griglia tramite il database, ho creato un componente UI sales_order_grid.xmlsotto[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>

Quindi ha creato la classe UI sotto [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;
    }
}

Questo ha funzionato alla grande. Sto affrontando un problema in cui questa personalizzazione provoca il rendering della barra degli strumenti della griglia dell'ordine dopo la griglia. Hai riscontrato questo problema?
Ian,

@Ian non ho avuto questo problema. Quale versione di Magento 2 stai usando?
André Ferraz,

2
CE 2.1.1. Ho determinato il problema. Il mio modulo è arrivato prima di Magento_Sales in ordine alfabetico. Ho aggiunto <sequence> con una dipendenza a Magento_Sales, disabilitato il mio modulo e poi riattivato. Questo ha corretto il problema.
Ian,

1
Funziona anche con le opzioni di esportazione? Nel mio caso i dati esportati avevano valori vuoti.
MagoPsycho,

1
Allo stesso modo Magento 1 è filter_condition_callbackdove puoi aggiungere il tuo filtro personalizzato come da campo. Per favore, non dire "Che cosa vuoi dire?" questa volta;)
MagoPsycho

33

La mia soluzione potrebbe essere un po 'più efficiente poiché segue il modo nativo di aggiungere una colonna alla griglia e non dovrai caricare tutti gli ordini visualizzati nella pagina per ottenere i dati della colonna (utilizzando invece la tabella sales_order_grid ). Quanto sopra è un ottimo esempio di come creare un renderer personalizzato.

vendor / [vendor] / [pacchetto] /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>

Si noti che è necessario abilitare la colonna utilizzando il widget a discesa sopra la griglia dell'ordine prima che appaia.

vendor / [vendor] / [pacchetto] /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>

Esempio di codice di installazione per aggiungere una colonna alla tabella sales_order_grid (utilizzare questo nello script di installazione / aggiornamento). A proposito, lo stesso codice funziona per la tabella 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'
        ]
    );

Spero che sia d'aiuto! :-)


Questa risposta richiede che la colonna sia la tabella sales_order_grid, giusto?
Tero Lahtinen,

@MageParts, quando funzionerà questo script?
SagarPPanchal,

1
ha funzionato per me, grazie: 3 a proposito, in quanto sales_order_grid.xmldovresti chiudere il tag <listing> </listing> o restituirà un errore di xml
fudu,

<argomento name = "colonne"> deve essere sostituito con <argomento name = "colonne" xsi: type = "array"> nel file di: xml. Altrimenti restituirà il seguente errore. "Argomento" dell'elemento del documento non valido: la definizione del tipo è astratta.
Saiid

1

Per creare una nuova colonna nella griglia degli ordini, ho fatto riferimento a Magento Default Module vendor / magento / module-customer-balance

Nel mio caso, la colonna "custom_column" esiste già nella tabella sales_order.

Devo mostrare la colonna 'custom_column' nella griglia dell'ordine

Passaggio 1: aggiungere una nuova colonna nella tabella sales_order_grid

        $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'
                ]
            );
    }

Passaggio 2: file di.xml in app \ code [fornitore] [spazio dei nomi] \ 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>

Passaggio 3: Creare il file di layout sales_order_grid.xml in 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>

Nota: questo è stato testato in Magento versione 2.2.6


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>

Quindi ha creato la classe UI per renderizzarla.

Demo / ExtendedGrid / Ui / Component / elenco / colonna / 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;
   }
}

Non dimenticare di cancellare la cache.


-1

Ho creato un modulo personalizzato che aggiungerà l'attributo personalizzato nell'entità Ordine di vendita e quindi verrà visualizzato nella griglia Ordine di vendita amministratore.

file module.xml per definire il modulo. Codice app \ \ SOCIETA \ MODULO \ 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>

file di.xml 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 per aggiungere l'attributo personalizzato export_status nella tabella del database

App \ code \ SOCIETA \ MODULO \ 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 per aggiungere una colonna personalizzata nella griglia di amministrazione dell'ordine cliente.

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

È possibile scaricare il modulo completo facendo clic sul collegamento seguente http://vdcstaging.co.in/download/add-custom-culumn-to-admin-grid.zip

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.