PrestaShop1.7.7.5后台订单列表新增承运商列字段添加失败问题咨询
核心问题原因
PrestaShop 1.7.7+版本后台订单列表已改用Symfony Grid组件架构,你使用的hookActionAdminOrdersListingFieldsModifier是旧版控制器列表的钩子,已经失效,且旧架构里订单表别名a在新Grid里已改为o,这是你修改不生效的核心原因。
解决步骤
1. 移除无效代码
删除你之前编写的hookActionAdminOrdersListingFieldsModifier钩子全部代码,该钩子在1.7.7+订单列表中不会被触发。
2. 新增查询修改钩子
添加hookActionOrderGridQueryBuilderModifier钩子修改订单列表查询语句,关联承运商表获取对应名称,注意先引入必要的命名空间:
use Doctrine\DBAL\Query\QueryBuilder; public function hookActionOrderGridQueryBuilderModifier(array $params) { /** @var QueryBuilder $queryBuilder */ $queryBuilder = $params['query_builder']; // 关联承运商表,适配多语言场景 $queryBuilder->addSelect('cl.name as carriername'); $queryBuilder->leftJoin( 'o', _DB_PREFIX_ . 'order_carrier', 'oc', 'o.id_order = oc.id_order' ); $queryBuilder->leftJoin( 'oc', _DB_PREFIX_ . 'carrier_lang', 'cl', 'oc.id_carrier = cl.id_carrier AND cl.id_lang = :id_lang' ); // 绑定当前后台语言ID参数 $queryBuilder->setParameter('id_lang', $this->context->language->id); // 处理单订单多承运商场景,避免出现重复订单行 $queryBuilder->groupBy('o.id_order'); }
3. 调整列定义钩子
完善hookActionOrderGridDefinitionModifier配置,支持排序、筛选功能,引入必要命名空间:
use PrestaShop\PrestaShop\Core\Grid\Column\Type\DataColumn; use PrestaShop\PrestaShop\Core\Grid\Filter\Type\TextFilter; public function hookActionOrderGridDefinitionModifier(array $params) { $definition = $params['definition']; $columns = $definition->getColumns(); $filters = $definition->getFilters(); // 新增承运商列 $columns->addAfter( 'country_name', (new DataColumn('carriername')) ->setName($this->trans('Carrier', [], 'Admin.Global')) ->setOptions([ 'field' => 'carriername', 'sortable' => true, ]) ); // 新增承运商筛选器 $filters->add( (new TextFilter('carriername')) ->setName($this->trans('Carrier', [], 'Admin.Global')) ->setAssociatedColumn('carriername') ); // 配置承运商字段排序规则 $definition->getSorting()->addOrder('carriername', 'asc'); }
4. 检查钩子注册与缓存清理
- 确保你使用的模块
install方法中已经注册两个新钩子,代码示例:
public function install() { return parent::install() && $this->registerHook('ActionOrderGridDefinitionModifier') && $this->registerHook('ActionOrderGridQueryBuilderModifier'); }
- 修改完
install方法后,在后台模块管理找到对应模块点击「重置」,确保钩子注册成功 - 后台进入「高级参数」→「性能」页点击右上角「清除缓存」,再手动删除
/var/cache/目录下的prod和dev文件夹
内容的提问来源于stack exchange,提问作者Shinanubis
相关产品推荐
相关产品推荐

