Я работаю над плагином Shopware 6, и мне нужно изменить шаблон Twig, чтобы включить параметры отслеживания конверсий в зависимости от того, имел ли клиент предыдущие оплаченные заказы. В частности, мне нужно установить параметр tsCategory равным 2, если у клиента есть предыдущие оплаченные заказы, в противном случае он должен быть 1.
Вот соответствующая часть моего index.html.twig файла:
{% block layout_head_javascript_tracking_swag_after_finish %}
{% set tsCategory = 1 %}
<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 }}";
{% endfor %}
</script>
{% endif %}
{% endblock %}
Как я могу получить доступ и проверить, есть ли у клиента предыдущие оплаченные заказы в этом шаблоне Twig?
Мы будем очень признательны за любые рекомендации о том, как добиться этого в Shopware 6!





Создайте новый файл с именем CheckoutFinishSubscriber.php в каталоге <plugin root>/src/Subscriber/.
Содержимое файла CheckoutFinishSubscriber.php:
<?php declare(strict_types=1);
namespace Swag\BasicExample\Subscriber;
use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;
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\NotFilter;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CheckoutFinishSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly EntityRepository $orderRepository
) {}
public static function getSubscribedEvents(): array
{
return [
CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinish',
];
}
public function onCheckoutFinish(CheckoutFinishPageLoadedEvent $event): void
{
$salesChannelContext = $event->getSalesChannelContext();
$page = $event->getPage();
$currentOrderId = $page->getOrder()->getId();
$paidOrderCount = $this->findPaidOrderCountByCustomer($currentOrderId, $salesChannelContext);
$tsCategory = $paidOrderCount > 0 ? 2 : 1;
$page->assign([
'tsCategory' => $tsCategory
]);
}
private function findPaidOrderCountByCustomer(string $currentOrderId, SalesChannelContext $salesChannelContext): int
{
$criteria = new Criteria();
$criteria->addFilter(new NotFilter(
NotFilter::CONNECTION_AND,
[new EqualsFilter('order.id', $currentOrderId)]
));
$criteria->addFilter(new EqualsFilter('order.salesChannelId', $salesChannelContext->getSalesChannelId()));
$criteria->addFilter(new EqualsFilter('order.orderCustomer.customerId', $salesChannelContext->getCustomer()->getId()));
$criteria->addAssociation('transactions.stateMachineState');
$criteria->addFilter(new EqualsFilter('transactions.stateMachineState.name', OrderTransactionStates::STATE_PAID));
return $this->orderRepository->search($criteria, $salesChannelContext->getContext())->getTotal();
}
}
Регистрация подписчика в файле <plugin root>/src/Resources/config/services.xml.
Содержимое файла 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 = "Swag\BasicExample\Subscriber\CheckoutFinishSubscriber">
<argument type = "service" id = "order.repository"/>
<tag name = "kernel.event_subscriber"/>
</service>
</services>
</container>
Теперь вы можете использовать переменную {% set tsCategory = page.tsCategory %} в файле <plugin root>/src/Resources/views/storefront/page/checkout/finish/index.html.twig.
Дополнительная документация, которая поможет вам:
$lastTransaction->getStateMachineState() === null это возвращается true, даже когда я меняю статус платежа на Оплачен.
Я немного модифицировал код, добавив фильтрацию по transactions.stateMachineState.name.
Почему бы вам не включить логику получения этих данных в свой контроллер? Twig не предназначен для таких вещей