Shopware 6:如何在Twig模板中判断客户是否有历史付费订单
实现步骤
1. 通过页面加载器注入历史订单标记
Shopware模板无法直接执行数据库查询,需先在CheckoutFinishPageLoader中扩展数据,将客户是否有历史付费订单的判断结果注入页面数据。
1.1 创建页面加载器装饰器
在插件目录下创建src/Page/Checkout/Finish/CheckoutFinishPageLoaderDecorator.php:
<?php declare(strict_types=1); namespace YourPluginNamespace\Page\Checkout\Finish; use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Checkout\Order\OrderStates; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotEqualsFilter; use Shopware\Core\System\SalesChannel\SalesChannelContext; use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoaderInterface; use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPage; class CheckoutFinishPageLoaderDecorator implements CheckoutFinishPageLoaderInterface { private CheckoutFinishPageLoaderInterface $originalLoader; private EntityRepository $orderRepository; public function __construct(CheckoutFinishPageLoaderInterface $originalLoader, EntityRepository $orderRepository) { $this->originalLoader = $originalLoader; $this->orderRepository = $orderRepository; } public function load(SalesChannelContext $context, OrderEntity $order): CheckoutFinishPage { $page = $this->originalLoader->load($context, $order); // 匿名客户直接判定为无历史付费订单 if (!$context->getCustomer()) { $page->assign(['hasPaidHistoryOrders' => false]); return $page; } $criteria = new Criteria(); $criteria->addFilter(new EqualsFilter('customerId', $context->getCustomer()->getId())); // 排除当前刚创建的订单 $criteria->addFilter(new NotEqualsFilter('id', $order->getId())); // 筛选已完成付费的订单(可根据业务调整状态) $criteria->addFilter(new EqualsFilter('stateMachineState.technicalName', OrderStates::STATE_PAID)); $criteria->setLimit(1); // 仅需判断是否存在,无需查询全部 $hasPaidHistory = $this->orderRepository->search($criteria, $context->getContext())->count() > 0; $page->assign(['hasPaidHistoryOrders' => $hasPaidHistory]); return $page; } }
1.2 注册装饰器服务
在src/Resources/config/services.xml中添加配置:
<?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="YourPluginNamespace\Page\Checkout\Finish\CheckoutFinishPageLoaderDecorator" decorates="Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoader"> <argument type="service" id="YourPluginNamespace\Page\Checkout\Finish\CheckoutFinishPageLoaderDecorator.inner"/> <argument type="service" id="order.repository"/> </service> </services> </container>
2. 修改Twig模板使用标记
更新src/Resources/views/storefront/page/checkout/finish/index.html.twig:
{% block layout_head_javascript_tracking_swag_after_finish %} {% set tsCategory = 1 %} {% if page.hasPaidHistoryOrders %} {% set tsCategory = 2 %} {% endif %} <script> {% for item in page.order.lineItems.elements %} {% if item.type == PRODUCT_LINE_ITEM_TYPE %} var tsOrderID = "{{ page.order.orderNumber|escape('js') }}"; var tsCategory = "{{ tsCategory }}"; {% endif %} {% endfor %} </script> {% endblock %}
关键说明
- 匿名客户直接按新客户处理(
tsCategory=1),若需调整逻辑可修改装饰器中的判断逻辑。 - 订单状态筛选使用
OrderStates::STATE_PAID,可根据业务需求替换为OrderStates::STATE_COMPLETED等其他状态。 - 装饰器中使用
setLimit(1)优化查询性能,只需确认存在符合条件的订单即可停止查询。
内容的提问来源于stack exchange,提问作者Auhona
相关产品推荐
相关产品推荐

