Sylius php - 如何将购物车传递到 twig 模板(Sylius 模板事件)

问题描述 投票:0回答:1

默认上下文提供程序不提供购物车对象。只有channelContext、currencyContext、localeContext和customerContext。

是否可以使用 Sylius 模板事件在 twig 模板中获取购物车?

例如这样:

sylius_ui:
    events:
        sylius.shop.layout.header.content:
            blocks:
                search:
                    enabled: true
                    template: "@App/Layout/Header/_search.html.twig"
                    priority: 10
                    context:
                        cart: how_to_pass_cart? # <-- How to pass cart

并在模板中使用它,例如:

{# @App/Layout/Header/_search.html.twig #}
{{ cart.itemsTotal }}

现在,在标准模板中,为了显示购物车,使用订单控制器的渲染和模板替换。

https://github.com/Sylius/Sylius/blob/a0ad0d1e4c61ed8ec30bbb39e36184cb910736b2/src/Sylius/Bundle/ShopBundle/Resources/views/Layout/Header/_cart.html.twig#L2

<div class="right aligned column">
    {{ render(url('sylius_shop_partial_cart_summary', {'template': '@SyliusShop/Cart/_widget.html.twig'})) }}
</div>

从我的角度来看,这不是一个很好的解决方案。 有没有办法通过上下文参数或 twig 模板中的 ContextProvider 获取购物车?

php sylius
1个回答
0
投票
<?php

declare(strict_types=1);

namespace App\Twig;

use Sylius\Component\Order\Model\OrderInterface;
use Sylius\Component\Order\Context\CartContextInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

final class CartExtension extends AbstractExtension
{
    private CartContextInterface $cartContext;

    public function __construct(CartContextInterface $cartContext)
    {
        $this->cartContext = $cartContext;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('get_cart', [$this, 'getCart']),
        ];
    }

    public function getCart(): OrderInterface
    {
        return $this->cartContext->getCart();
    }
}

然后在Twig模板中你可以做

{% cart = get_cart() %}

© www.soinside.com 2019 - 2024. All rights reserved.