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คอลัมน์ได้อย่างไร



ฉันคิดว่ามีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ต้องใช้ผู้สังเกตการณ์และใช้กิจกรรม
André Ferraz

บทความนี้อธิบายการเพิ่มคอลัมน์ลงในตารางคำสั่งขายทีละขั้นตอน: sivaschenko.com/magento2/2016/03/05/ …
Sergii Ivashchenko

ลองวิธีแก้ปัญหาที่นี่วิธีนี้ใช้ปลั๊กอินเพื่อเพิ่มคอลัมน์
Asrar

ฉันคิดว่าคุณควรตรวจสอบนี้: กวดวิชาที่ดีsivaschenko.com/magento2-sales-order-grid-column
Abid Malik

คำตอบ:


42

หลังจากทำการขุดด้วยรหัสแกนหลักคุณภาพเยี่ยมฉันพบวิธีแก้ปัญหาสำหรับคำถามของฉัน แทนที่จะเพิ่มคอลัมน์ลงในตารางผ่านฐานข้อมูลฉันสร้างองค์ประกอบ 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;
    }
}

มันใช้งานได้ดีมาก ฉันกำลังเผชิญปัญหาที่การปรับแต่งนี้ทำให้แถบเครื่องมือของตารางคำสั่งซื้อสามารถแสดงผลได้หลังจากเส้นตาราง คุณพบปัญหานี้หรือไม่?
เอียน

@Ian ฉันไม่ได้มีปัญหานั้น คุณกำลังใช้ magento 2 รุ่นใด
André Ferraz

2
CE 2.1.1 ฉันพบปัญหาแล้ว โมดูลของฉันมาก่อน Magento_Sales ตามลำดับตัวอักษร ฉันเพิ่ม <sequence> ด้วยการพึ่งพา Magento_Sales ปิดการใช้งานโมดูลของฉันแล้วเปิดใช้งานอีกครั้ง นี่เป็นการแก้ไขปัญหา
เอียน

1
ใช้งานได้กับตัวเลือกการส่งออกด้วยหรือไม่ ในกรณีของฉันข้อมูลที่ส่งออกมีค่าว่างเปล่า
MagePsycho

1
เช่นเดียวกันกับ Magento 1 filter_condition_callbackซึ่งคุณสามารถเพิ่มตัวกรองที่กำหนดเองของคุณเองตามฟิลด์ โปรดอย่าพูดว่า "คุณหมายถึงอะไร" เวลานี้;)
MagePsycho

33

โซลูชันของฉันอาจมีประสิทธิภาพมากกว่านี้เล็กน้อยเนื่องจากเป็นไปตามวิธีดั้งเดิมของการเพิ่มคอลัมน์ในตารางและคุณไม่ต้องโหลดทุกคำสั่งที่แสดงบนหน้าเพื่อรับข้อมูลคอลัมน์ (ใช้sales_order_gridตารางแทน) ด้านบนเป็นตัวอย่างที่ดีของวิธีสร้าง renderer ที่กำหนดเอง

ผู้ขาย / [ผู้ขาย] / [แพคเกจ] /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 (ใช้สิ่งนี้ในสคริปต์การติดตั้ง / อัพเกรดของคุณ) รหัสเดียวกันใช้ได้กับตาราง 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'
        ]
    );

หวังว่ามันจะช่วย! :-)


คำตอบนี้ต้องการให้คอลัมน์เป็นตาราง sales_order_grid ถูกต้องไหม
Tero Lahtinen

@MageParts เมื่อสคริปต์นี้จะทำงานอย่างไร
SagarPPanchal

1
ทำงานได้สำหรับฉันขอบคุณ: 3 btw ซึ่งsales_order_grid.xmlคุณควรปิดแท็ก <listing> </listing> ของคุณไม่เช่นนั้นจะส่งคืนข้อผิดพลาดของ xml
fudu

<อาร์กิวเมนต์ name = "columns"> ควรถูกแทนที่ด้วย <argument name = "columns" xsi: type = "array"> ในไฟล์ di: xml มิฉะนั้นจะส่งคืนข้อผิดพลาดต่อไปนี้ องค์ประกอบของเอกสารไม่ถูกต้อง 'อาร์กิวเมนต์': การกำหนดประเภทเป็นนามธรรม
saiid

1

สำหรับการสร้างคอลัมน์ใหม่ในตารางการสั่งซื้อฉันได้แนะนำผู้ขายโมดูลวีโอไอพี / วีโอไอพี / โมดูลยอดคงเหลือลูกค้า

ในกรณีของฉันมีคอลัมน์ '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 ใน app \ code [ผู้ให้บริการ] [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>

ขั้นตอนที่ 3: สร้างไฟล์เลย์เอาต์ sales_order_grid.xml ภายใต้แอพ \ code [ผู้ให้บริการ] [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>

หมายเหตุ: สิ่งนี้ได้รับการทดสอบใน Magento เวอร์ชั่น 2.2.6


0

การสาธิต / 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>

จากนั้นสร้างคลาส UI เพื่อแสดงผล

การสาธิต / ExtendedGrid / อุ้ย / ตัวแทน / ราย / คอลัมน์ / 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

ฉันได้สร้างโมดูลที่กำหนดเองซึ่งจะเพิ่มแอตทริบิวต์ที่กำหนดเองในเอนทิตีการขายและจากนั้นแสดงในตารางผู้ดูแลระบบการขาย

ไฟล์ module.xml เพื่อกำหนดโมดูล แอปพลิเค \ รหัส \ บริษัท \ 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 ใน 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 เพื่อเพิ่ม attribute ที่กำหนดเอง export_status ในตารางฐานข้อมูล

แอปพลิเค \ รหัส \ บริษัท \ 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 เพื่อเพิ่มคอลัมน์ที่กำหนดเองในตารางผู้ดูแลระบบคำสั่งขาย

<?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ลิงค์ด้านล่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.