默认上下文提供程序不提供购物车对象。只有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 }}
现在,在标准模板中,为了显示购物车,使用订单控制器的渲染和模板替换。
<div class="right aligned column">
{{ render(url('sylius_shop_partial_cart_summary', {'template': '@SyliusShop/Cart/_widget.html.twig'})) }}
</div>
从我的角度来看,这不是一个很好的解决方案。 有没有办法通过上下文参数或 twig 模板中的 ContextProvider 获取购物车?
<?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() %}