默认上下文提供程序不提供购物车对象.只有Channel、CurencyContext、LocaleContext和CustomerContext.

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

例如如下所示:

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模板中的ConextProvider来获取购物车?

推荐答案

因为我们不能使用DefaultContextProvider注入服务,所以我们可以编写自己的ContextProvider.

创建到文件src/ContextProvider/CartContextProvider.php:

<?php
declare(strict_types=1);

namespace App\ContextProvider;

use Sylius\Bundle\UiBundle\ContextProvider\ContextProviderInterface;
use Sylius\Bundle\UiBundle\Registry\TemplateBlock;
use Sylius\Component\Order\Context\CartContextInterface;
use Sylius\Component\Order\Model\OrderInterface;

final class CartContextProvider implements ContextProviderInterface
{
    public function __construct(
        private CartContextInterface $cartContext
    ){}

    public function provide(array $templateContext, TemplateBlock $templateBlock): array
    {
        $templateContext['cart'] = $this->getCart();
        return $templateContext;
    }

    public function supports(TemplateBlock $templateBlock): bool
    {
        return true;
    }

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

将新的上下文提供程序注册为config/services.yaml:

services:
    # ...

    App\ContextProvider\CartContextProvider:
        arguments:
            - '@sylius.context.cart'
        tags:
            - { name: sylius.ui.template_event.context_provider }

在此之后,购物车将在任何模板中可用.这可以通过调用Dump方法在细枝模板中进行判断.例如:{{ dump() }}


或者,您可以使用Twig扩展解决方案从another answer in this thread.

Php相关问答推荐

为什么这个方法调用用引号和花括号包裹?

如何使用属性#[Embedded]嵌入带有规则的对象集合?

以编程方式更改新订单、已取消订单和失败订单的邮箱WooCommerce通知

照明\Support\Collection::Filter():参数#1($Callback)的类型必须为?可调用、已给定数组、已调用

WooCommerce/WordPress:简单的产品属性显示

PHP测试字符串的所有POST值

来自POST请求的(无效)json字符串中的奇怪字符(编码问题)

删除了数组中的值,而不是多个数组

服务器迁移后无法上载文件-可能存在权限问题

从两个日期创建日期范围,然后为范围中的每个日期复制子数组

WooCommerce在购物车项目中复制产品而不增加产品数量

函数存储到变量中

除WooCommerce中的特定国家/地区外,有条件地要求填写邮政编码 checkout 字段

如何在 Laravel 中app文件夹之外的文件夹内创建文件路径?

WooCommerce 有关新订单的附加邮箱通知,其中包含具体详细信息

循环中未序列化数组显示的问题

如何设置Mailersend PHP API 模板变量?

WooCommerce单个产品页面上启用额外选项卡的产品元框字段

将Shopware 6后端中定义的值导入MultiFilter

Shopware 6.4.20店铺激活问题