Shopware 6.5.x中page.reviews.totalReviews返回null的原因及解决办法
Shopware 6.5.x产品评论总数变量失效问题分析与解决方案
失效原因
Shopware 6.5.x对CMS页面的产品数据结构做了调整:在自定义产品类型CMS页面中,page.reviews不再自动加载评论统计数据。因为默认情况下,CMS页面的产品上下文不会初始化评论聚合器,导致page.reviews.totalReviews返回null。而6.4.x版本中,评论统计直接挂载在产品页面的page对象下,无需额外配置。
可行解决方案
方案1:直接调用产品实体的reviewCount属性
Shopware内置了产品实体的reviewCount属性,会自动统计该产品的有效评论总数,无需额外查询。修改Twig代码如下:
{% sw_include '@Storefront/storefront/page/product-detail/buy-widget.html.twig' with {'totalReviews': page.product.reviewCount} %}
方案2:手动加载评论统计数据(适用于需要详细评论信息的场景)
如果需要获取除总数外的更多评论数据,可通过事件订阅器扩展CMS页面加载逻辑,主动获取评论统计:
- 创建自定义事件订阅器,监听
CmsPageLoadedEvent事件 - 从CMS页面的区块中提取产品实体,调用
ReviewRepository获取统计数据 - 将统计结果挂载到page对象的扩展属性中
示例PHP代码:
use Shopware\Core\Content\Cms\Event\CmsPageLoadedEvent; use Shopware\Core\Content\Product\ProductEntity; use Shopware\Core\Content\Review\ReviewRepository; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class CmsProductReviewSubscriber implements EventSubscriberInterface { private ReviewRepository $reviewRepository; public function __construct(ReviewRepository $reviewRepository) { $this->reviewRepository = $reviewRepository; } public static function getSubscribedEvents(): array { return [ CmsPageLoadedEvent::class => 'onCmsPageLoaded' ]; } public function onCmsPageLoaded(CmsPageLoadedEvent $event): void { $page = $event->getPage(); $context = $event->getContext(); // 遍历CMS区块获取产品实体 foreach ($page->getSections() as $section) { foreach ($section->getBlocks() as $block) { foreach ($block->getSlots() as $slot) { $data = $slot->getData(); if (isset($data['product']) && $data['product'] instanceof ProductEntity) { $stats = $this->reviewRepository->aggregateByProductId($data['product']->getId(), $context); $page->addExtension('reviewStats', $stats); break 3; } } } } } }
对应的Twig调用代码:
{% sw_include '@Storefront/storefront/page/product-detail/buy-widget.html.twig' with {'totalReviews': page.extensions.reviewStats.totalReviews} %}
方案3:使用内置Twig函数获取评论数
通过Shopware内置的sw_review_count函数直接获取指定产品的评论总数:
{% set totalReviews = sw_review_count(page.product.id) %} {% sw_include '@Storefront/storefront/page/product-detail/buy-widget.html.twig' with {'totalReviews': totalReviews} %}
内容的提问来源于stack exchange,提问作者Leon Schwanitz
相关产品推荐
相关产品推荐

