Magento 2 ऑर्डर ग्रिड में एक नया कॉलम कैसे जोड़ें


20

मैंने sales_orderनामक एक नया कॉलम तालिका में जोड़ा है export_status, अब मैं नए sales_orderकॉलम से डेटा के साथ नया ऑर्डर ग्रिड कॉलम जोड़ना चाहता हूं ।

मैं the sales_order_gridतालिका में स्तंभ जोड़ने में कामयाब रहा हूं ।

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

अब मैं इसे वास्तव में sales_order export_statusकॉलम से मान के साथ ऑर्डर ग्रिड में कैसे दिखा सकता हूं ?


आप उत्तर प्राप्त कर सकते हैं magento.stackexchange.com/questions/87012/…
कृष्णा इज्जादा

मुझे लगता है कि एक पर्यवेक्षक को लागू करने और घटनाओं का उपयोग किए बिना ऐसा करने का एक बेहतर तरीका है।
आंद्रे फेरेज़

यह आलेख बिक्री आदेश ग्रिड चरण-दर-चरण में कॉलम जोड़ने का वर्णन करता है: sivaschenko.com/magento2/2016/03/05/…
Sergii Ivashchenko

यहां समाधान का प्रयास करें यह विधि कॉलम जोड़ने के लिए प्लगइन का उपयोग करती है।
असरर

मुझे लगता है कि आपको इसकी जांच करनी चाहिए: एक अच्छा ट्यूटोरियल sivaschenko.com/magento2-sales-order-grid-column
आबिद मलिक

जवाबों:


42

Magento के कोर कोड में बहुत खुदाई के बाद मुझे अपने प्रश्न का हल मिला। डेटाबेस के माध्यम से ग्रिड के लिए एक स्तंभ जोड़ने के बजाय, मैं एक UI घटक बनाया sales_order_grid.xmlतहत[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>

फिर के तहत UI वर्ग बनाया [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;
    }
}

यह बहुत अच्छा काम किया। मुझे एक समस्या का सामना करना पड़ रहा है जहां इस अनुकूलन के कारण ग्रिड के बाद ऑर्डर ग्रिड के टूलबार को प्रस्तुत किया जा सकता है। क्या आपने इस मुद्दे का अनुभव किया?
इयान

@ अगर मेरे पास वह मुद्दा नहीं था। Magento 2 के किस संस्करण का आप उपयोग कर रहे हैं?
आंद्रे फेरेज़

2
सीई 2.1.1। मैंने मसला तय किया। मेरा मॉड्यूल Magento_Sales वर्णानुक्रम से पहले आया था। मैंने Magento_Sales पर निर्भरता के साथ <अनुक्रम> जोड़ा, मेरे मॉड्यूल को अक्षम किया और फिर इसे फिर से सक्षम किया। इससे समस्या ठीक हो गई।
इयान

1
क्या यह निर्यात विकल्पों के लिए भी काम करता है? मेरे मामले में निर्यात किए गए डेटा में रिक्त मान थे।
माजिसेपिको

1
इसी तरह मैगनेटो 1 का filter_condition_callbackआप अपने स्वयं के कस्टम फ़िल्टर को फ़ील्ड के अनुसार जोड़ सकते हैं। कृपया मत कहो "तुम्हारा क्या मतलब है?" इस बार;)
माजेपिसिको

33

मेरा समाधान थोड़ा अधिक कुशल हो सकता है क्योंकि यह ग्रिड में कॉलम जोड़ने के मूल तरीके का अनुसरण करता है, और आपको कॉलम डेटा प्राप्त करने के लिए पृष्ठ पर प्रदर्शित प्रत्येक ऑर्डर को लोड नहीं करना पड़ेगा ( इसके बजाय sales_order_grid टेबल का उपयोग करना होगा)। हालांकि, एक अनुकूलित रेंडर बनाने का एक शानदार उदाहरण है।

विक्रेता / [विक्रेता] / [पैकेज] /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>

कृपया ध्यान दें कि दिखाई देने से पहले आपको ऑर्डर ग्रिड के ऊपर ड्रॉप-डाउन विजेट का उपयोग करके कॉलम को सक्षम करना होगा।

विक्रेता / [विक्रेता] / [पैकेज] /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>

नमूना सेटअप कोड Sales_order_grid तालिका में कॉलम जोड़ने के लिए (अपनी इंस्टॉल / अपग्रेड स्क्रिप्ट में इसका उपयोग करें)। इसी तरह का कोड सेल्स_ऑर्डर टेबल के लिए काम करता है।

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

आशा करता हूँ की ये काम करेगा! :-)


इस उत्तर के लिए यह आवश्यक है कि कॉलम सेल्स_ऑर्डर_ग्रिड टेबल है, सही है?
तेरो लहतिन

@MageParts, जब यह स्क्रिप्ट काम करेगी?
सागरपंचल

1
मेरे लिए काम किया, धन्यवाद: 3 btw, इसमें sales_order_grid.xmlआपको अपनी <लिस्टिंग> </ लिस्टिंग> टैग को बंद करना चाहिए या यह xml की एक त्रुटि
लौटाएगा

<तर्क नाम = "कॉलम"> को <तर्क नाम = "कॉलम" xsi: प्रकार = "सरणी"> के साथ di: xml फ़ाइल में बदला जाना चाहिए। अन्यथा यह निम्नलिखित त्रुटि लौटाएगा। अमान्य दस्तावेज़ तत्व 'तर्क': प्रकार की परिभाषा सार है।
saidid

1

ऑर्डर ग्रिड में एक नया कॉलम बनाने के लिए, मैंने Magento के डिफ़ॉल्ट मॉड्यूल विक्रेता / Magento / मॉड्यूल-ग्राहक-संतुलन का उल्लेख किया है

मेरे मामले में, 'custom_column' कॉलम पहले से ही sales_order तालिका में मौजूद है।

मुझे ऑर्डर ग्रिड में 'custom_column' कॉलम दिखाना होगा

चरण 1: 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'
                ]
            );
    }

चरण 2: एप्लिकेशन \ कोड [विक्रेता] [नामस्थान] \ आदि \ di.xml में 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>

चरण 3: app_ code [विक्रेता] [नामस्थान] \ view \ adminhtml \ ui_component के तहत sales_order_grid.xml लेआउट फ़ाइल बनाएँ

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

नोट: इसका परीक्षण Magento के संस्करण 2.2.6 में किया गया है


0

डेमो / ExtendedGrid / देखें / 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>

फिर इसे प्रस्तुत करने के लिए UI क्लास बनाया गया।

डेमो / ExtendedGrid / Ui / घटक / लिस्टिंग / कॉलम / 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;
   }
}

कैश साफ़ करना न भूलें।


-1

मैंने कस्टम मॉड्यूल बनाया है जो बिक्री आदेश इकाई में कस्टम विशेषता जोड़ देगा और फिर व्यवस्थापक बिक्री आदेश ग्रिड में दिखाएगा।

मॉड्यूल को परिभाषित करने के लिए मॉड्यूल। xml फ़ाइल। एप्लिकेशन \ कोड \ कंपनी \ मॉड्यूल \ आदि \ 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 फ़ाइल 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>

डेटाबेस तालिका में कस्टम विशेषता Export_status जोड़ने के लिए InstallData.php

एप्लिकेशन \ कोड \ कंपनी \ मॉड्यूल \ 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।

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

आप नीचे दिए गए लिंक http://vdcstaging.co.in/download/add-custom-culumn-to-admin-grid.zip पर क्लिक करके पूरा मॉड्यूल डाउनलोड कर सकते हैं

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