Come unire la raccolta della griglia degli ordini alla tabella personalizzata in Magento2?


12

Sto cercando di aggiungere una nuova colonna per ordinare la griglia in Magento 2.0. Quindi, devo unirmi per ordinare la raccolta della griglia. Come posso raggiungere questo obiettivo ? Perché, in magento2, la griglia utilizza il componente UI.

Risposte:


12

Magento 2 aggiunge colonne personalizzate alla griglia degli ordini cliente,

Per unirti

Magento \ vendite \ Order \ Rete \ Collection

per qualsiasi tabella, utilizzare il plugin sarebbe l'opzione migliore in quanto non si basa su riscritture e rende snello il codice.

Crea il plug-in nel modulo etc / di.xml del tuo modulo

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
    <plugin name="sales_order_additional_columns" type="Vendor\ModuleName\Plugins\AddColumnsSalesOrderGridCollection" sortOrder="100" disabled="false" />
</type>

Quindi, stiamo intercettando

Magento \ Framework \ Visualizza \ elemento \ UIComponent \ FornitoreDati \ CollectionFactory

perché se dai un'occhiata a

Magento \ vendite \ etc \ di.xml

vedresti

Magento \ vendite \ Order \ Rete \ Collection

è stato iniettato in

Magento \ Framework \ Visualizza \ elemento \ UIComponent \ FornitoreDati \ CollectionFactory

Crea una cartella Plugin e una classe plugin nel tuo modulo

<?php namespace Vendor\ModuleName\Plugins;

use Magento\Framework\Message\ManagerInterface as MessageManager;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;

class AddColumnsSalesOrderGridCollection
{
    private $messageManager;
    private $collection;

    public function __construct(MessageManager $messageManager,
        SalesOrderGridCollection $collection
    ) {

        $this->messageManager = $messageManager;
        $this->collection = $collection;
    }

    public function aroundGetReport(
        \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
        \Closure $proceed,
        $requestName
    ) {
        $result = $proceed($requestName);
        if ($requestName == 'sales_order_grid_data_source') {
            if ($result instanceof $this->collection
            ) {
                $select = $this->collection->getSelect();
                $select->join(
                    ["soi" => "sales_order_item"],
                    'main_table.entity_id = soi.order_id AND soi.product_type="simple"',
                    array('weight', 'product_type')
                )
                    ->distinct();

                $select->join(
                    ["soa" => "sales_order_address"],
                    'main_table.entity_id = soa.parent_id AND soa.address_type="shipping"',
                    array('email', 'country_id', 'postcode', 'city', 'telephone')
                )
                    ->distinct();
            }

        }
        return $this->collection;
    }
}

Qui stiamo osservando intorno all'evento del metodo getReport ().

copia

vendor / Magento / module-vendita / view / adminhtml / ui_component / sales_order_grid.xml

nell'ambito del tuo modulo

Venditore / ModuleName / view / adminhtml / ui_component / sales_order_grid.xml

Elimina tutti i contenuti del tuo sales_order_grid.xml copiato poiché non vogliamo sovrascrivere tutti i contenuti.

Inserisci il seguente codice in sales_order_grid.xml del tuo modulo

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

        <!-- sales_order_item weight -->
        <column name="weight">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Weight</item>
                    <item name="sortOrder" xsi:type="number">222</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_item product_type-->
        <column name="product_type">
            <argument name="data" xsi:type="array">
                <item name="options" xsi:type="object">Vendor\ModuleName\Ui\Component\Listing\Column\ProductTypes</item>
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Product Type</item>
                    <item name="sortOrder" xsi:type="number">232</item>
                    <item name="align" xsi:type="string">right</item>
                    <!--<item name="filter" xsi:type="string">select</item>-->
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address country_id -->
        <column name="country_id">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Country ID</item>
                    <item name="sortOrder" xsi:type="number">242</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address post_code -->
        <column name="postcode">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Postcode</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address city -->
        <column name="city">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">City</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

        <!-- sales_order_address telephone -->
        <column name="telephone">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Telephone</item>
                    <item name="sortOrder" xsi:type="number">252</item>
                    <item name="align" xsi:type="string">right</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="visible" xsi:type="boolean">true</item>
                    <!--<item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item>-->
                </item>
            </argument>
        </column>

    </columns>

</listing>

Ora, cancella la cache dalla cartella var / cache o aggiorna la cache. Sarai in grado di vedere le colonne aggiunte nella griglia degli ordini di vendita.


Grazie mille per quello, il mio unico problema (con Magento 2.2.0) era che dovevo aggiungere il prefisso della tabella sulle linee ["soi" => "sales_order_item"]e ["soa" => "sales_order_address"].
David,

Ho pensato che funzionasse bene, ma sembra anche incasinare la griglia della fattura. Con il modulo abilitato, l'ID ordine e lo stato sono stranamente vuoti nella griglia della fattura. Qualche idea su cosa potrebbe essere sbagliato?
David,

Grazie per queste informazioni, mi ha aiutato ad aggiungere il nome dell'azienda. Ma come mostrerei le informazioni di fatturazione e spedizione invece della sola spedizione? Posso mostrare 1 o l'altro, ma non riesco a rinominare 'company' per dire 'billing_company' e 'shipping_company' per poter usare in sales_order_grid.xml
RLTcode

1
Ottenere errori nella pagina CMS, nel blocco CMS, nelle griglie Customerm e Creditmemo quando si utilizza la classe plugin, per favore fatemi sapere se esiste una soluzione alternativa per modificare la raccolta della griglia.
Vishal,

Quali errori puoi vedere per la griglia delle fatture e così via?
Asrar, il

9

Quando guardi \Magento\Framework\Data\Collection\AbstractDbmagento2 stesso, fornisci l'operazione di hook per la tua collezione.

protected function _renderFilters()
{
    if ($this->_isFiltersRendered) {
        return $this;
    }

    $this->_renderFiltersBefore(); // Hook for operations before rendering filters

    ....................
}

Quindi, ciò che devi fare è semplicemente aggiungendo nella tua collezione [ NAMESPACE\MODULENAME\Model\ResourceModel\YOUR_CLASSNAME\Grid\Collection]

protected function _renderFiltersBefore() {
    $joinTable = $this->getTable('catalog_product_entity_varchar');
    $this->getSelect()->join($joinTable.' as cpev','main_table.entity_id = cpev.entity_id', array('*'));
    parent::_renderFiltersBefore();
}

ho bisogno di mostrare il mio campo di tabella personalizzato nella griglia di ordine in questo caso ho per mostrarlo?
Pradeep Kumar,

@Keyur Shah Grazie mi aiuta molto.
Rohit Goel,

Sono contento di sapere che ti aiuta :) @RohitGoel Keep aiuta l'altro membro della comunità
Keyur Shah,

Certo :) @KeyurShah adoro aiutare la comunità. Sto creando una griglia senza il tuo componente, puoi dirmi come posso aggiungere una funzione di esportazione in questo.
Rohit Goel,

1
Invece di _renderFiltersBefore, puoi anche sostituire / estendere _initSelect.
Jānis Elmeris,

3

Ho creato la griglia di amministrazione che ha l'unione di due tabelle personalizzate. non puoi farlo utilizzando il tipo virtuale è di.xml, quindi devi seguire questi passaggi e aggiornare il tuo

etc / di.xml,

Model / Resource / Modulename / Collection.php aggiungi join in questo file,

Modello / risorse / Modulename / griglia / Collection.php,

Nel tuo etc / di.xml

<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="namespace_modulename_listing_data_source" xsi:type="string">Namespace\Modulename\Model\Resource\Modulename\Grid\Collection</item>
            </argument>
        </arguments>
</type>
<type name="Namespace\Modulename\Model\Resource\Modulename\Grid\Collection">
    <arguments>
        <argument name="mainTable" xsi:type="string">tablename</argument>
        <argument name="eventPrefix" xsi:type="string">namespace_modulename_grid_collection</argument>
        <argument name="eventObject" xsi:type="string">namespace_grid_collection</argument>
        <argument name="resourceModel" xsi:type="string">Namespace\Modulename\Model\Resource\Modulename</argument>
    </arguments>
</type>

Nel tuo modello / risorsa / nome modulo / collezione.php

<?php
namespace Namespace\Modulename\Model\Resource\Modulename;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{
    /**
     * Define model & resource model
     */
    const YOUR_TABLE = 'tablename';

    public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
    ) {
        $this->_init(
            'Namespace\Modulename\Model\Modulename',
            'Namespace\Modulename\Model\Resource\Modulename'
        );
        parent::__construct(
            $entityFactory, $logger, $fetchStrategy, $eventManager, $connection,
            $resource
        );
        $this->storeManager = $storeManager;
    }
    protected function _initSelect()
    {
        parent::_initSelect();

        $this->getSelect()->joinLeft(
                ['secondTable' => $this->getTable('tablename')],
                'main_table.columnname = secondTable.columnname',
                ['columnname1','columnname2','columnname3']
            );
    }
}
?>

Nel tuo modello / risorsa / nome modulo / griglia / collezione.php

<?php
namespace Namespace\Modulename\Model\Resource\Modulename\Grid;

use Magento\Framework\Api\Search\SearchResultInterface;
use Magento\Framework\Search\AggregationInterface;
use Namespace\Modulename\Model\Resource\Modulename\Collection as ModulenameCollection;

/**
 * Class Collection
 * Collection for displaying grid
 */
class Collection extends ModulenameCollection implements SearchResultInterface
{
    /**
     * Resource initialization
     * @return $this
     */
   public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        $mainTable,
        $eventPrefix,
        $eventObject,
        $resourceModel,
        $model = 'Magento\Framework\View\Element\UiComponent\DataProvider\Document',
        $connection = null,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
    ) {
        parent::__construct(
            $entityFactory,
            $logger,
            $fetchStrategy,
            $eventManager,
            $storeManager,
            $connection,
            $resource
        );
        $this->_eventPrefix = $eventPrefix;
        $this->_eventObject = $eventObject;
        $this->_init($model, $resourceModel);
        $this->setMainTable($mainTable);
    }

    /**
     * @return AggregationInterface
     */
    public function getAggregations()
    {
        return $this->aggregations;
    }

    /**
     * @param AggregationInterface $aggregations
     *
     * @return $this
     */
    public function setAggregations($aggregations)
    {
        $this->aggregations = $aggregations;
    }


    /**
     * Get search criteria.
     *
     * @return \Magento\Framework\Api\SearchCriteriaInterface|null
     */
    public function getSearchCriteria()
    {
        return null;
    }

    /**
     * Set search criteria.
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setSearchCriteria(
        \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria = null
    ) {
        return $this;
    }

    /**
     * Get total count.
     *
     * @return int
     */
    public function getTotalCount()
    {
        return $this->getSize();
    }

    /**
     * Set total count.
     *
     * @param int $totalCount
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setTotalCount($totalCount)
    {
        return $this;
    }

    /**
     * Set items list.
     *
     * @param \Magento\Framework\Api\ExtensibleDataInterface[] $items
     *
     * @return $this
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function setItems(array $items = null)
    {
        return $this;
    }
}

?>

Non funzionava
saravanavelu il

funziona bene per me .. qual è l'errore per te?
Ekta Puri,

Errore interno del server. puoi controllare e riformattare il tuo codice
saravanavelu il

posso visualizzare i tuoi file da qualche parte? perché questo ha funzionato perfettamente per me, cercherò ancora di riformattare
Ekta Puri il

etc / di.xml Model / Resource / Modulename / Collection non c'è niente di simile in questo in di.xml
saravanavelu

2

Nella definizione dell'interfaccia utente xml esiste un nodo origine dati simile a questo

<dataSource name="listing_name_data_source">
    <argument name="dataProvider" xsi:type="configurableObject">
        <argument name="class" xsi:type="string">UniqueNameGridDataProvider</argument>
        <argument name="name" xsi:type="string">listing_name_data_source</argument>

dove listing_name_data_sourcepuò essere definito nel tuo di.xmlo semplicemente fare riferimento direttamente a una classe. La classe stessa dovrebbe estendersi Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactorye avere come collectionsargomento la tua raccolta personalizzata. Nel _initSelect()metodo di quella classe di raccolta puoi unire i tuoi tavoli.


1
in sales di.xml mostra Magento \ Sales \ Model \ ResourceModel \ Order \ Grid \ Collection dove quel file non esce da sé, in tal caso non possiamo riscrivere plugin o eventi, o come fare per favore controlla le vendite e ordina codice di raccolta della griglia, spero che chiarisca di più
Pradeep Kumar,

È definito qui github.com/magento/magento2/blob/develop/app/code/Magento/Sales/… ed è un tipo virtuale che si estende da Magento \ Framework \ View \ Element \ UiComponent \ DataProvider \ SearchResult
Kristof presso Fooman

quindi ho per aggiungere unirsi a quella classe. puoi dare un esempio di codice
Pradeep Kumar il


@KristofatFooman hai dato un esempio sbagliato perché è un tipo virtuale, potresti dare un esempio per la raccolta della griglia definita come tipo virtuale?
LucScu,

2

Per chiunque abbia problemi con la soluzione @Asrar basta fare questo:

public function aroundGetReport(
    \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
    \Closure $proceed,
    $requestName
) {
    $result = $proceed($requestName);
    if ($requestName == 'sales_order_grid_data_source_firsty') {
        if ($result instanceof $this->collection
        ) {
            $select = $this->collection->getSelect();
            $select->join(
                ["soi" => "sales_order_item"],
                'main_table.entity_id = soi.order_id',
                array('sku', 'name','item_id')
            )
                ->distinct();
            return $this->collection;
        }

    }
    return $result;
}

Questo sembra funzionare bene per me.

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.