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/…
Krishna ijjada

관찰자를 구현하지 않고 이벤트를 사용하지 않고도이 작업을 수행하는 더 좋은 방법이 있다고 생각합니다.
André Ferraz

이 기사에서는 판매 주문 그리드에 단계별로 열을 추가하는 방법을 설명합니다. sivaschenko.com/magento2/2016/03/05/…
Sergii Ivashchenko

여기 에서 해결책을 시도 하십시오. 이 방법은 플러그인을 사용하여 열을 추가합니다.
Asrar

나는 당신이 이것을 체크 아웃해야한다고 생각합니다 : 좋은 튜토리얼 sivaschenko.com/magento2-sales-order-grid-column
Abid Malik

답변:


42

magento 코어 코드를 많이 파고 들었을 때 내 질문에 대한 해결책을 찾았습니다. 데이터베이스를 통해 그리드에 열을 추가하는 대신 sales_order_grid.xml아래에 UI 구성 요소를 만들었습니다.[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

@Ian 나는 그 문제가 없었습니다. 어떤 버전의 magento 2를 사용하고 있습니까?
André Ferraz

2
CE 2.1.1. 문제를 확인했습니다. 내 모듈은 알파벳순으로 Magento_Sales 앞에 왔습니다. Magento_Sales에 종속 된 <sequence>를 추가하고 내 모듈을 비활성화 한 다음 다시 활성화했습니다. 문제가 해결되었습니다.
Ian

1
내보내기 옵션에서도 작동합니까? 필자의 경우 내 보낸 데이터에는 빈 값이있었습니다.
MagePsycho

1
마찬가지로 Magento 1 filter_condition_callback에서도 필드별로 고유 한 사용자 지정 필터를 추가 할 수 있습니다. "무슨 뜻입니까?"라고 말하지 마십시오. 이번에;)
MagePsycho

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 테이블에 열을 추가하는 샘플 설정 코드 (설치 / 업그레이드 스크립트에서 사용). 그런데 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
점에서, BTW 3 : 나를 위해 감사했다 sales_order_grid.xml당신이 당신의 태그 </ 목록> <목록>을 닫아야하거나 XML의 오류가 반환됩니다
fudu

di : xml 파일에서 <argument name = "columns">는 <argument name = "columns"xsi : type = "array">로 바꿔야합니다. 그렇지 않으면 다음 오류가 반환됩니다. 유효하지 않은 문서 요소 '인수': 유형 정의가 추상입니다.
saiid

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 단계 : app \ code [Vendor] [NameSpace] \ etc \ 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 [Vendor] [NameSpace] \ 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/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 클래스를 작성하여 렌더링했습니다.

데모 / 확장 그리드 / 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

판매 주문 엔터티에 사용자 지정 특성을 추가 한 다음 관리자 판매 주문 표에 표시 할 사용자 지정 모듈을 만들었습니다.

모듈을 정의하는 module.xml 파일 app \ code \ COMPANY \ 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>

app \ code \ COMPANY \ MODULE \ etc \ di.xml의 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

app \ code \ COMPANY \ 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.