如何将PrestaShop 1.6的预计配送日期代码适配到PrestaShop 8
PrestaShop 1.6 订单预计配送日期代码迁移到 PrestaShop 8 操作指南
PrestaShop 8改用Grid系统重构了后台订单列表,原1.6版本的代码需要适配新架构,具体操作分以下三步:
1. 给订单查询添加自定义SQL字段
打开文件 src/Core/Grid/Query/OrderQueryBuilder.php,找到 createSearchQueryBuilder 方法里的 $select 数组,加入配送日期计算的子查询:
$select = [ // 保留原有字段... 'DayOfDelivery' => '(SELECT DATE_FORMAT(DATE_ADD(op.`date_add`, INTERVAL 7 + IF(WEEKDAY(DATE_ADD(op.`date_add`, INTERVAL 7 DAY)) = 5, 2, 0) + IF(WEEKDAY(DATE_ADD(op.`date_add`, INTERVAL 7 DAY)) = 6, 1, 0) DAY), "%W, %e of %M") FROM `' . _DB_PREFIX_ . 'order_payment` op WHERE op.`order_reference` = a.`reference` LIMIT 1)', ];
这段SQL逻辑和你原代码完全一致,通过子查询从支付表取日期并计算预计配送日。
2. 在订单网格中添加配送日期列
打开文件 src/Core/Grid/Definition/Factory/OrderGridDefinitionFactory.php,找到 buildColumns 方法,在id_order列的定义之后(或你想要的位置)添加新列:
// 原有id_order列定义... ->add( (new TextColumn('DayOfDelivery')) ->setName($this->trans('Day Of Delivery', [], 'Admin.Sell.Order')) ->setOptions([ 'field' => 'DayOfDelivery', 'align' => 'center', 'class' => 'fixed-width-xs', 'formatter' => function ($value, array $row) { $tooltipContent = !empty($row['note']) ? $row['note'] : $row['DayOfDelivery']; return sprintf( '<span title="" data-toggle="tooltip" class="label-tooltip" data-original-title="%s" data-html="true" data-placement="top"><i class="icon-truck"></i></span>', htmlspecialchars($tooltipContent, ENT_QUOTES) ); } ]) )
这里把原代码中getIsDayOfDelivery的逻辑直接内嵌到列的格式化闭包中,实现鼠标悬停显示备注或配送日期的效果。
3. 额外提示
- 直接修改核心文件会在PrestaShop升级时被覆盖,推荐通过自定义模块扩展:使用
actionOrderGridDefinitionModifier事件添加列,actionOrderGridQueryBuilderModifier事件修改查询,这样更安全且便于维护。 - 如果需要本地化日期格式,可以调整DATE_FORMAT的参数,或者在格式化闭包里用PrestaShop的日期工具类转换。
- 测试时确认订单对应的支付记录存在,避免子查询返回NULL导致显示异常。
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

