Tôi đã thêm cột Tùy chỉnh track_number
và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_track
bả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_at
hoặc status
vì 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.