如何获取产品滑块的计算后价格?Sales Channel Product Repository返回Null
问题:产品滑块获取计算后价格返回Null
需求是实现一个产品滑块,能针对不同客户、税费场景展示计算后的产品价格,但使用Sales Channel Product Repository时返回结果为Null。
相关代码
页面加载事件处理函数
public function onPageLoaded(PageLoadedEvent $event): void { $context = $event->getContext(); $salesChannelContext = $event->getSalesChannelContext(); $page = $event->getPage(); if (str_contains($event->getRequest()->getRequestUri(), '/link')) { $parts = explode("/link/", $event->getRequest()->getRequestUri()); $toolId = $this->getToolIdBySlug($parts[1], $context); if ($toolId) { $toolsProducts = $this->getToolsProductByToolId($toolId, $context); $tools = []; $foo = []; foreach ($toolsProduct as $tool) { // 变量名拼写错误:应为$toolsProducts $tools[] = $tool->getProduct(); $foo[] = $this->getSalesChannelProductById($tool->getProduct()->getId(), $salesChannelContext); } dd($foo); // 返回NULL } } }
根据ToolId关联产品查询函数
protected function getToolsProductByToolId(string $toolId, Context $context): array { $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('toolId', $recipeId)); // 变量名错误:应为$toolId $criteria->addAssociation('product'); $criteria->addAssociation('product.cover'); return $this->productToolRepository->search($criteria, $context)->getElements(); }
销售渠道产品查询函数
protected function getSalesChannelProductById(string $productId, SalesChannelContext $salesChannelContext): ?SalesChannelProductEntity { /** @var SalesChannelProductEntity|null $salesChannelProduct */ $salesChannelProduct = $this->salesChannelProductRepository ->search(new Criteria([$productId]), $salesChannelContext) ->first(); return $salesChannelProduct; }
排查与解决步骤
修复变量拼写错误
getToolsProductByToolId中,EqualsFilter的第二个参数误用了未定义的$recipeId,应改为传入的$toolId,否则查询不到任何关联产品。onPageLoaded函数的循环中,遍历变量写成了$toolsProduct,实际应为$toolsProducts,这会导致循环不执行,$foo始终为空数组。
验证销售渠道上下文与产品状态
- 确认目标产品是否已在当前销售渠道中激活,未激活的产品无法通过
SalesChannelProductRepository查询到。 - 检查
SalesChannelContext是否包含正确的客户分组、税费设置,确保上下文参数传递无误。
- 确认目标产品是否已在当前销售渠道中激活,未激活的产品无法通过
调试查询结果
- 在
getToolsProductByToolId函数中,先打印$this->productToolRepository->search($criteria, $context)->getElements()的结果,确认是否成功查询到关联的产品数据。 - 单独调用
getSalesChannelProductById,传入已知存在的产品ID和正确的销售渠道上下文,验证该函数本身是否正常工作。
- 在
检查权限与Repository注入
- 确认
salesChannelProductRepository已正确注入到当前类中,避免因依赖注入错误导致Repository实例为Null。 - 确保当前执行上下文拥有访问销售渠道产品数据的权限。
- 确认
内容的提问来源于stack exchange,提问作者balrcoding
相关产品推荐
相关产品推荐

