Tôi đã thêm cột Tùy chỉnh track_numbervào doanh số >> Lưới đặt hàng tại Backend.
<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>
Tạo nên
<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;
}
}
Mã ở trên giúp truy xuất dữ liệu theo dõi và nối cột vào lưới Đơn hàng nhưng để sắp xếp hoặc lọc trên cột tùy chỉnh này, tôi cần ghi đè mô hình bộ sưu tập lưới
\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();
}
}
Tất cả đều ổn nhưng do bộ sưu tập này kết hợp với sales_shipment_trackbảng Nó tạo ra lỗi vi phạm toàn vẹn trên bộ lọc mặc định trong khi chúng ta có cùng một trường như created_athoặc statusvì chúng ta sẽ nhận được cùng một cột / trường trên cả hai bảng.
Vì vậy, vấn đề là Làm thế nào để áp dụng bộ lọc trên cột tùy chỉnh mà không ảnh hưởng đến cột mặc định?
Bất kỳ trợ giúp sẽ được đánh giá cao.