Shopware 6中如何在ProductListingCriteriaEvent获取与前端一致的商品总数
问题分析与解决方案
你遇到的总数不符问题,核心原因是事件订阅的时机不对:ProductListingCriteriaEvent是在商品列表查询构建之前触发的,此时系统还未应用前端显示所需的全部过滤逻辑(比如商品上架状态、当前店铺可见性、库存可用性等默认过滤规则),所以你通过searchIds获取到的是仅匹配基础查询条件的全量商品数,而非前端最终展示的经过完整过滤后的数量。
解决步骤
1. 更换订阅事件类型
改用ProductListingResultEvent,这个事件是在查询执行完成、得到最终结果后触发的,事件对象中已经包含了和前端完全一致的过滤后总数:
class PaginationSubscriberTest implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ ProductListingResultEvent::class => 'onProductListingResultLoaded', ]; } public function onProductListingResultLoaded(ProductListingResultEvent $event): void { // 获取与前端完全一致的商品总数 $total = $event->getResult()->getTotal(); // 这里编写你的分页判断与重定向逻辑 $limit = $event->getContext()['limit'] ?? 20; $currentPage = $event->getContext()['offset'] ? ($event->getContext()['offset'] / $limit) + 1 : 1; $totalPages = ceil($total / $limit); if ($currentPage > $totalPages && $total > 0) { // 执行重定向逻辑,比如跳转到最后一页 } } }
2. 验证过滤逻辑一致性(可选)
如果仍有差异,检查以下几点:
- 确认
$event->getContext()中包含前端传递的所有参数(如店铺ID、语言环境、分类ID等) - 检查系统是否有自定义的商品列表过滤扩展,这些扩展是否在
ProductListingResultEvent触发前已完成过滤
内容的提问来源于stack exchange,提问作者Wipster
相关产品推荐
相关产品推荐

