Magento 2 फ़िल्टर काम नहीं कर रहा है जबकि कस्टम कॉलम यूआई घटक का उपयोग करके बिक्री ग्रिड पर जोड़ा गया है


9

मैंने बिक्री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क्योंकि हम दोनों तालिका पर समान कॉलम / फ़ील्ड प्राप्त करेंगे।

तो समस्या यह है कि डिफ़ॉल्ट कॉलम को प्रभावित किए बिना कस्टम कॉलम पर फ़िल्टर कैसे लागू किया जाए?

किसी भी सहायता की सराहना की जाएगी।

जवाबों:


8

मेरे पास एक ही मुद्दा है और $this->addFilterToMap()मेरे मुद्दे को ठीक करो ।।

इस उत्तर की जांच करें Magento 2 ग्रिड uiComponent: एक कॉलम फ़िल्टर में एक तालिका उपनाम शामिल करें


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