Saya telah menambahkan kolom Kustom track_number
ke dalam penjualan >> Kisi pesanan di 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>
Membuat
<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 <[email protected]>
*/
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;
}
}
Kode di atas membantu untuk mengambil data trek dan menambahkan kolom ke dalam kisi Pesanan tetapi untuk menyortir atau memfilter pada kolom khusus ini saya perlu mengganti model pengumpulan kisi
\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();
}
}
Semua berjalan dengan baik tetapi karena koleksi ini bergabung dengan sales_shipment_track
tabel. Ini menciptakan kesalahan pelanggaran integritas pada filter default sementara kita memiliki bidang yang sama seperti created_at
atau status
karena kita akan mendapatkan kolom / bidang yang sama di kedua tabel.
Jadi Masalahnya adalah Bagaimana menerapkan filter pada kolom khusus tanpa memengaruhi kolom default?
Bantuan apa pun akan dihargai.
sumber