Magento2 में कस्टम टेबल में ऑर्डर ग्रिड संग्रह में शामिल होने के लिए कैसे?


12

मैं Magento 2.0 में ग्रिड ऑर्डर करने के लिए एक नया कॉलम जोड़ने की कोशिश कर रहा हूं। तो, मुझे ग्रिड कलेक्शन ऑर्डर करने के लिए जॉइनिंग करने की जरूरत है। इसे कैसे प्राप्त किया जा सकता है ? क्योंकि, magento2 में, ग्रिड UI घटक का उपयोग करता है।

जवाबों:


12

Magento 2 बिक्री आदेश ग्रिड में कस्टम कॉलम जोड़ें,

शामिल होना

Magento \ बिक्री \ आदेश \ ग्रिड \ संग्रह

किसी भी तालिका में, प्लगइन का उपयोग करना सबसे अच्छा विकल्प होगा क्योंकि यह फिर से लिखना पर निर्भर नहीं करता है और कोड को दुबला बनाता है।

अपने मॉड्यूल के आदि / di.xml में प्लगइन बनाएं

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

इसलिए, हम इंटरसेप्ट कर रहे हैं

Magento \ फ्रेमवर्क \ देखें \ तत्व \ UIComponent \ dataProvider \ CollectionFactory

क्योंकि अगर आप एक नज़र डालते हैं

Magento \ बिक्री \ आदि \ di.xml

तुम देखोगे

Magento \ बिक्री \ आदेश \ ग्रिड \ संग्रह

में इंजेक्ट किया गया था

Magento \ फ्रेमवर्क \ देखें \ तत्व \ UIComponent \ dataProvider \ CollectionFactory

अपने मॉड्यूल में एक प्लगइन फ़ोल्डर और एक प्लगइन वर्ग बनाएं

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

यहाँ हम getReport () विधि की घटना के आसपास देख रहे हैं ।

प्रतिलिपि

विक्रेता / Magento / मॉड्यूल बिक्री / देखें / adminhtml / ui_component / sales_order_grid.xml

आपके मॉड्यूल के दायरे के लिए

विक्रेता / ModuleName / देखें / adminhtml / ui_component / sales_order_grid.xml

अपने कॉपी किए गए sales_order_grid.xml की सभी सामग्री हटा दें क्योंकि हम सभी सामग्रियों को ओवरराइड नहीं करना चाहते हैं।

अपने मॉड्यूल के 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">

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

अब, var / cache folder से cache को डिलीट करें या अपने cache को रिफ्रेश करें। आप अपने जोड़े गए कॉलम को विक्रय आदेश ग्रिड में देख पाएंगे।


उस एक के लिए बहुत धन्यवाद, मेरा एकमात्र मुद्दा (मैगेंटो 2.2.0 के साथ) यह था कि मुझे लाइनों पर तालिका उपसर्ग जोड़ना था ["soi" => "sales_order_item"]और ["soa" => "sales_order_address"]
डेविड

मुझे लगा कि यह ठीक काम कर रहा है, लेकिन यह इनवॉइस ग्रिड के साथ भी गड़बड़ी लगती है .. मॉड्यूल सक्षम होने के साथ, ऑर्डर आईडी और स्थिति चालान ग्रिड में अजीब तरह से खाली हैं .. क्या गलत हो सकता है पर कोई विचार?
डेविड

इस जानकारी के लिए धन्यवाद, इसने मुझे कंपनी का नाम जोड़ने में मदद की है। लेकिन मैं केवल शिपिंग के बजाय बिलिंग और शिपिंग जानकारी कैसे दिखाऊंगा? मैं 1 या दूसरे को दिखा सकता हूं, लेकिन सेल्स_ऑर्डर_ग्रिड.xml
RLTcode

1
प्लगइन वर्ग का उपयोग करते समय सीएमएस पृष्ठ, सीएमएस ब्लॉक, ग्राहक और क्रेडिटमेमो ग्रिड में त्रुटियां हो रही हैं, कृपया मुझे बताएं कि क्या ग्रिड संग्रह को संशोधित करने के लिए कोई वैकल्पिक समाधान है।
विशाल

इनवॉइस ग्रिड और आदि के लिए आप क्या त्रुटियाँ देख सकते हैं?
असरार

9

जब आप \Magento\Framework\Data\Collection\AbstractDbmagento2 को देखते हैं तो अपने संग्रह के लिए हुक संचालन प्रदान करते हैं।

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

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

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

तो, आपको अपने संग्रह में जोड़कर ऐसा करने की आवश्यकता है [ 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();
}

मुझे इस मामले में अपने कस्टम टेबल फील्ड को ऑर्डर ग्रिड में दिखाने की जरूरत है?
प्रदीप कुमार

@ कीयूर शाह धन्यवाद यह मुझे बहुत मदद करता है।
रोहित गोयल

सुनने के लिए है कि यह आप में मदद करता है खुशी है कि :) @RohitGoel रखें अन्य समुदाय के सदस्य मदद करता है
Keyur शाह

ज़रूर :) @KeyurShah मैं समुदाय की मदद करना पसंद करता हूं। मैं ui घटक के बिना एक ग्रिड बना रहा हूं, क्या आप मुझे बता सकते हैं कि मैं इसमें एक निर्यात सुविधा कैसे जोड़ सकता हूं।
रोहित गोयल

1
इसके बजाय _renderFiltersBefore, आप ओवरराइड / विस्तार भी कर सकते हैं _initSelect
जानिस एल्मरिस

3

मैंने एडमिन ग्रिड बनाया जिसमें दो कस्टम टेबल शामिल हैं। आप वर्चुअल प्रकार का उपयोग करके ऐसा नहीं कर सकते di.xml है, इसलिए आपको इन चरणों का पालन करने और अपने को अपडेट करने की आवश्यकता है

etc / di.xml,

मॉडल / संसाधन / मोडुलनेम / संग्रह। एफपी इस फाइल में शामिल हों,

मॉडल / संसाधन / Modulename / ग्रिड / Collection.php,

अपने आदि / 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>

अपने मॉडल / संसाधन / मोड्यूलनाम / संग्रह में। पीपी

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

अपने मॉडल / संसाधन / मोडुलनेम / ग्रिड / संग्रह में। पीपी

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

?>

यह काम नहीं कर रहा था
सरवानावेलु

मेरे लिए ठीक काम करता है .. आपके लिए क्या त्रुटि है?
एकता पुरी

आंतरिक सर्वर त्रुटि। क्या आप अपने कोड की जाँच और सुधार कर सकते हैं
saravanavelu

क्या मैं आपकी फाइलें कहीं देख सकता हूं? क्योंकि इसने मेरे लिए पूरी तरह से काम किया, फिर भी मैं फिर से सुधार की कोशिश करूंगा
एकता पुरी

आदि / di.xml मॉडल / संसाधन / मोडुलनेम / संग्रह di.xml में ऐसा कुछ भी नहीं है
saravanavelu

2

यूआई परिभाषा xml में इसके समान एक डेटा स्रोत नोड है

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

जहाँ listing_name_data_sourceआपके में परिभाषित किया जा सकता है di.xmlया सिर्फ एक वर्ग को सीधे देखें। वर्ग Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactoryको collectionsअपने कस्टम संग्रह से तर्क के रूप में विस्तार करना चाहिए । उस संग्रह कक्षा की _initSelect()विधि में आप अपनी सारणी में शामिल हो सकते हैं।


1
बिक्री di.xml में यह Magento \ Sales \ Model \ ResourceModel \ Order \ Grid \ Collection दिखा रहा है, जहाँ वह फ़ाइल स्वयं नहीं बाहर निकलती है, उस स्थिति में हम प्लगइन या ईवेंट को फिर से नहीं लिख सकते हैं, ओ इसे कैसे करें कृपया विक्रय डि और ऑर्डर की जांच करें ग्रिड कलेक्शन कोड, मुझे आशा है कि यह अधिक स्पष्ट होगा
प्रदीप कुमार

इसे यहाँ परिभाषित किया गया है github.com/magento/magento2/blob/develop/app/code/Magento/Sales/… और एक आभासी प्रकार है जो Magento \ फ्रेमवर्क \ View \ Element \ UiComponent \ DataProvider \ SearchResult
से विस्तृत है

फिर उस वर्ग में शामिल होने के लिए हो। यदि आप उदाहरण कोड देते हैं
प्रदीप कुमार

यहाँ एक उदाहरण के रूप में शामिल होने के लिए github.com/magento/magento2/blob/develop/app/code/Magento/… जैसा कि इस initSlect github.com/magento/magento2/blob/develop/app/code/Magento/…
फोमन

@KristofatFooman आप एक गलत उदाहरण देते हैं क्योंकि यह एक आभासी प्रकार है, क्या आप ग्रिड संग्रह को आभासी प्रकार के रूप में परिभाषित करने के लिए एक उदाहरण दे सकते हैं?
लुकस्कू

2

किसी को भी @ असरर समाधान के साथ समस्याएँ हैं:

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;
}

यह मेरे लिए ठीक काम करने लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.