Ui 구성 요소를 사용하여 Sales Grid에 사용자 정의 열을 추가하는 동안 Magento 2 필터가 작동하지 않습니다


9

백엔드의 sales >> Order grid에 Custom 열 track_number을 추가 했습니다.

<vendor_name>/Sales/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="track_number" class="<vendor_name>\Sales\Ui\Component\Listing\Column\OrderGrid">
            <argument name="data" xsi:type="array">
                <item name="js_config" xsi:type="array">
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item>
                </item>
                <item name="config" xsi:type="array">
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="dataType" xsi:type="string">text</item>
                    <item name="align" xsi:type="string">left</item>
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Tracking #</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

창조하다 <vendor_name>\Sales\Ui\Component\Listing\Column\OrderGrid

<?php
/**
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace <vendor_name>\Sales\Ui\Component\Listing\Column;

use Magento\Ui\Component\Listing\Columns\Column;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
use Magento\Framework\Escaper;

/**
 * Cart crosssell list
 *
 * @author      Magento Core Team <core@magentocommerce.com>
 */
class OrderGrid extends Column
{
    /** @var \Magento\Sales\Api\Data\OrderInterface $order **/
    protected $_orderCollectionFactory;

    protected $_objectManager;

    /**
     * @var Escaper
     */
    protected $escaper;

    public function __construct(
        ContextInterface $context,
        UiComponentFactory $uiComponentFactory,
        Escaper $escaper,
        CollectionFactory $orderCollection,
        \Magento\Framework\ObjectManagerInterface $objectManager,
        array $components = [],
        array $data = []
    ) {
        $this->_orderCollectionFactory = $orderCollection;
        $this->_objectManager = $objectManager;
        $this->escaper = $escaper;

        parent::__construct($context, $uiComponentFactory, $components, $data);
    }

    public function getOrderTracking($id)
    {
        $order = $this->_objectManager->create('\Magento\Sales\Model\Order')->loadByIncrementId($id);
        $trackNumber = "";
        foreach ($order->getTracksCollection() as $_track) {
           $trackNumber = $_track->getNumber();
        }

        return $trackNumber;
    }

    public function prepareDataSource(array $dataSource)
    {      
        if (isset($dataSource['data']['items'])) {

            foreach ($dataSource['data']['items'] as &$item) {
                $trackNumber = $this->getOrderTracking($item['increment_id']);
                $item[$this->getData('name')] = $this->escaper->escapeHtml($trackNumber);
            }
        }

        return $dataSource;
    }

}

위의 코드는 트랙 데이터를 검색하고 열을 주문 그리드에 추가하는 데 도움이되지만이 맞춤 열을 정렬하거나 필터링하려면 그리드 컬렉션 모델을 재정의해야합니다 \Magento\Sales\Model\ResourceModel\Order\Grid\Collection.php

<?php
/**
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace <vendor_name>\Sales\Model\ResourceModel\Order\Grid;

use Magento\Framework\Data\Collection\Db\FetchStrategyInterface as FetchStrategy;
use Magento\Framework\Data\Collection\EntityFactoryInterface as EntityFactory;
use Magento\Framework\Event\ManagerInterface as EventManager;
use Psr\Log\LoggerInterface as Logger;

/**
 * Order grid collection
 */
class Collection extends \Magento\Sales\Model\ResourceModel\Order\Grid\Collection
{
    protected function _renderFiltersBefore() 
    {
        $joinTable = $this->getTable('sales_shipment_track');

        $this->getSelect()->JoinInner($joinTable.' as ordertable','main_table.entity_id = ordertable.order_id', array('track_number', 'tacking_created_at'=> 'ordertable.created_at'));

        parent::_renderFiltersBefore();
   }
}

모두 잘되지만 sales_shipment_track테이블 과의 조인 조인 때문에 같은 필드를 가지 created_at거나 status두 테이블에서 같은 열 / 필드를 가져 오기 때문에 기본 필터에서 무결성 위반 오류가 발생 합니다.

문제는 기본 열에 영향을 미치지 않고 사용자 정의 열에 필터를 적용하는 방법입니다.

도움을 주시면 감사하겠습니다.

답변:


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.