You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:03:13