需求:需要在列表加上Dispatch Date 和 Delivery Time 两个字段,并在Filters 、 Columns、 Export 三块也相关显示。
如图:
开发思路: 因为order列表显示的是 sales_order_grid表中的数据,首先需要在表中添加这两个字段;其次要将两个字段的新数据自动更新到表中;最后将之前的老数据全部从sales_order表中更新到sales_order_grid表中。
开发步骤:
- 添加字段:
<table name="sales_order_grid" resource="sales">
<column xsi:type="timestamp" name="dispatch_time" on_update="false" nullable="true" comment="Dispatch Time"/>
<column xsi:type="timestamp" name="delivery_time" on_update="false" nullable="true" comment="Delivery Time"/>
</table>
- 通过 di.xml 和 sales_order_grid.xml 文件同步更新数据
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
<arguments>
<argument name="columns" xsi:type="array">
<item name="dispatch_time" xsi:type="string">sales_order.dispatch_time</item>
<item name="delivery_time" xsi:type="string">sales_order.delivery_time</item>
</argument>
</arguments>
</virtualType>
<column name="dispatch_time" class="Magento\Ui\Component\Listing\Columns\Date">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">dateRange</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item>
<item name="dataType" xsi:type="string">date</item>
<item name="label" xsi:type="string" translate="true">Dispatch Date</item>
<item name="dateFormat" xsi:type="string">MMM dd, YYYY, HH:mm:ss A</item>
</item>
</argument>
</column>
<column name="delivery_time" class="Magento\Ui\Component\Listing\Columns\Date">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">dateRange</item>
<item name="component" xsi:type="string">Magento_Ui/js/grid/columns/date</item>
<item name="dataType" xsi:type="string">date</item>
<item name="label" xsi:type="string" translate="true">Delivery Time</item>
<item name="dateFormat" xsi:type="string">MMM dd, YYYY, HH:mm:ss A</item>
</item>
</argument>
</column>
3.通过编写脚本给新增字段导入旧数据
public function execute(InputInterface $input, OutputInterface $output)
{
$startDate = $input->getOption('start_date') ?: '';
$endDate = $input->getOption('end_date') ?: '';
$totalCount = (int) $this->orderHelper->getOrders($startDate, $endDate)->count();
$pages = (int) ceil($totalCount / self::PAGE_SIZE);
$connection = $this->resourceConnection->getConnection();
for ($page = 1; $page <= $pages; $page++) {
$orders = $this->orderHelper->getOrders($startDate, $endDate, self::PAGE_SIZE, $page);
foreach ($orders as $order) {
$connection->beginTransaction();
try {
$connection->update(
$connection->getTableName('sales_order_grid'),
[
'dispatch_time' => $order->getDispatchTime(),
'delivery_time' => $order->getDeliveryTime()
],
['increment_id = ?' => $order->getIncrementId(), 'entity_id = ?' => $order->getEntityId()]
);
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
return false;
}
}
}
}
public function getOrders($startDate = '', $endDate = '', $pageSize = 0, $page = 1)
{
$collection = $this->orderCollectionFactory->create()
->addFieldToSelect(['increment_id', 'entity_id', 'dispatch_time', 'delivery_time']);
if ($startDate) {
$collection->addFieldToFilter('created_at', ['gteq' => $startDate]);
}
if ($endDate) {
$collection->addFieldToFilter('created_at', ['lteq' => $endDate]);
}
if ($pageSize > 0) {
$collection->setPageSize($pageSize);
$collection->setCurPage($page);
}
return $collection;
}