Magento 2 Cách thêm một cột mới vào lưới đơn hàng


20

Tôi đã thêm một cột mới vào bảng sales_orderđược gọi export_status, bây giờ tôi muốn thêm cột lưới đơn hàng mới với dữ liệu từ sales_ordercột mới .

Tôi đã quản lý để thêm cột vào the sales_order_gridbảng.

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

Làm thế nào bây giờ tôi có thể làm cho nó thực sự hiển thị trong lưới đơn hàng với giá trị từ sales_order export_statuscột?


Bạn có thể tìm thấy câu trả lời magento.stackexchange.com/questions/87012/ Kẻ
Krishna ijjada

Tôi nghĩ có một cách tốt hơn để làm điều này mà không phải thực hiện một người quan sát và sử dụng các sự kiện.
André Ferraz

Bài viết này mô tả việc thêm cột vào lưới đơn đặt hàng từng bước: sivaschenko.com/magento2/2016/03/05/ mẹo
Sergii Ivashchenko

Thử giải pháp tại đây Phương pháp này sử dụng plugin để thêm cột.
Asrar

Tôi nghĩ bạn nên kiểm tra điều này: Một hướng dẫn tốt sivaschenko.com/magento2-sales-order-grid-column
Abid Malik

Câu trả lời:


42

Sau khi đào rất nhiều mã lõi magento, tôi đã tìm ra giải pháp cho câu hỏi của mình. Thay vì thêm một cột vào lưới thông qua cơ sở dữ liệu, tôi đã tạo một thành phần UI sales_order_grid.xmlbên dưới[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>

Sau đó, tạo lớp UI bên dưới [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;
    }
}

Điều này đã làm việc tuyệt vời. Tôi đang đối mặt với một vấn đề trong đó tùy chỉnh này làm cho thanh công cụ của lưới đơn hàng được hiển thị sau lưới. Bạn đã trải nghiệm vấn đề này?
Ian

@ Tôi không có vấn đề đó. Phiên bản magento 2 nào bạn đang sử dụng?
André Ferraz

2
CE 2.1.1. Tôi xác định vấn đề. Mô-đun của tôi đến trước Magento_Sales theo thứ tự abc. Tôi đã thêm <sequ> với sự phụ thuộc vào Magento_Sales, vô hiệu hóa mô-đun của tôi và sau đó kích hoạt lại nó. Điều này đã khắc phục vấn đề.
Ian

1
Điều này cũng làm việc cho các tùy chọn xuất khẩu? Trong trường hợp của tôi, dữ liệu xuất có giá trị trống.
MagePologistso

1
Tương tự như vậy Magento 1 là filter_condition_callbacknơi bạn có thể thêm bộ lọc tùy chỉnh của riêng mình theo từng trường. Xin đừng nói "Ý bạn là gì?" lần này;)
MagePologistso

33

Giải pháp của tôi có thể hiệu quả hơn một chút vì nó tuân theo cách tự nhiên là thêm một cột vào lưới và bạn sẽ không phải tải mọi đơn hàng được hiển thị trên trang để lấy dữ liệu cột ( thay vào đó sử dụng bảng sales_order_grid ). Trên đây là một ví dụ tuyệt vời về cách tạo một trình kết xuất tùy chỉnh mặc dù.

nhà cung cấp / [nhà cung cấp] / [gói] /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>

Xin lưu ý rằng bạn phải kích hoạt cột bằng tiện ích thả xuống phía trên lưới đặt hàng trước khi nó xuất hiện.

nhà cung cấp / [nhà cung cấp] / [gói] /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>

Mã thiết lập mẫu để thêm cột vào bảng sales_order_grid (sử dụng mã này trong tập lệnh cài đặt / nâng cấp của bạn). Nhân tiện, mã tương tự hoạt động cho bảng 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'
        ]
    );

Hy vọng nó giúp! :-)


Câu trả lời này yêu cầu cột là bảng sales_order_grid, đúng không?
Tero Lahtinen

@MageParts, khi nào kịch bản này sẽ hoạt động?
SagarPPanchal

1
đã làm việc cho tôi, cảm ơn: 3 btw, trong đó sales_order_grid.xmlbạn nên đóng thẻ <
list

<đối số tên = "cột"> nên được thay thế bằng <đối số tên = "cột" xsi: type = "mảng"> trong tệp di: xml. Nếu không nó sẽ trả về lỗi sau. Thành phần tài liệu không hợp lệ 'đối số': Định nghĩa kiểu là trừu tượng.
saiid

1

Để tạo một cột mới trong lưới theo thứ tự, tôi đã giới thiệu nhà cung cấp Mô-đun mặc định / magento / cân bằng khách hàng mô-đun Magento

Trong trường hợp của tôi, cột 'custom_column' đã tồn tại trong bảng sales_order.

Tôi phải hiển thị cột 'custom_column' trong lưới theo thứ tự

Bước 1: Thêm một Cột mới trong bảng 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'
                ]
            );
    }

Bước 2: tệp di.xml trong ứng dụng \ code [Nhà cung cấp] [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>

Bước 3: Tạo tệp bố cục sales_order_grid.xml trong ứng dụng \ code [Nhà cung cấp] [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>

Lưu ý: Điều này đã được thử nghiệm trong phiên bản Magento 2.2.6


0

Bản trình diễn / 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>

Sau đó, tạo lớp UI để kết xuất nó.

Demo / ExtendedGrid / Ui / Thành phần / Liệt kê / Cột / 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;
   }
}

Đừng quên xóa bộ nhớ cache.


-1

Tôi đã tạo mô-đun tùy chỉnh sẽ thêm thuộc tính tùy chỉnh trong thực thể Đơn hàng và sau đó hiển thị trong lưới Đơn đặt hàng bán hàng của quản trị viên.

tập tin mô-đun để xác định mô-đun. ứng dụng \ code \ CÔNG TY \ 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>

tệp di.xml trong ứng dụng \ 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 để thêm thuộc tính export_status tùy chỉnh trong bảng cơ sở dữ liệu

ứng dụng \ code \ CÔNG TY \ 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 để thêm cột tùy chỉnh trong lưới quản trị Đơn hàng.

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

Bạn có thể tải xuống mô-đun đầy đủ bằng cách nhấp vào liên kết bên dưới http://vdcstaging.co.in/doad/add-custom-culumn-to-admin-grid.zip

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.