如何让列表处理器识别我在运行时添加的排序键?
解决Shopware商品列表运行时排序键不识别的ProductException问题
问题根源
Shopware的商品查询会校验排序键是否在系统允许的列表里——你只在前端加载了排序选项,但没在后端正确注册这个键,所以查询时直接触发ProductException了。
靠谱的解决方法
别在早阶段硬塞键,Shopware有官方推荐的正确姿势,用两个事件配合就能搞定:
给当前查询动态加排序规则
用ProductListingCriteriaEvent或者ProductSearchCriteriaEvent监听事件,在请求过来时直接给Criteria添加对应的排序逻辑,系统会自动识别这个键:public function onProductListingCriteria(ProductListingCriteriaEvent $event): void { $criteria = $event->getCriteria(); $request = $event->getRequest(); // 拿当前选的排序键 $sortBy = $request->query->get('sort', ''); if ($sortBy === 'your_custom_sort_key') { // 加自定义排序,这里替换成你的字段和排序方向 $criteria->addSorting(new FieldSorting('your_custom_field', SortingDirection::DESCENDING)); // 如果是关联表字段,用AssociationSorting // $criteria->addSorting(new AssociationSorting('associationName', new FieldSorting('fieldName'))); } }把排序键注册到允许列表
再用ProductListingEvents::SORTING_COLLECT事件把你的排序选项注册进系统,这样校验环节就不会把它当成非法键了:public function onCollectSorting(ProductListingSortingCollectEvent $event): void { $event->addSorting(new ProductListingSorting( 'your_custom_sort_key', 'custom.sort.label', // 前端显示的翻译键,自己替换 [new FieldSorting('your_custom_field', SortingDirection::DESCENDING)], 100 // 控制前端显示顺序的权重 )); }清理之前的临时代码
删掉你之前在更早事件里硬加键的代码,上面两个事件配合已经是完整的官方流程,比你之前的临时方法规范多了。
验证一下
- 前端选自定义排序,发起请求
- 看后端日志,确认
ProductException没再出现 - 检查商品列表是不是按你要的规则排了
内容的提问来源于stack exchange,提问作者kiplingi
相关产品推荐
相关产品推荐

