在 Sylius 中覆盖 PriceHelper

Overriding PriceHelper in Sylius

我试图通过添加 getOriginalPrice 函数来覆盖 PriceHelper class,但由于服务未注册,在 service.yml,我输入:

services:
    AppBundle\Helper\PriceHelper\:
        class: AppBundle\Helper\PriceHelper
        arguments:
            - "@sylius.calculator.product_variant_price"
        tags:
            - { name: templating.helper, event: sylius.templating.helper.price, method: getOriginalPrice, alias: sylius_calculate_original_price }

在树枝上,我添加了:

{%- macro calculateOriginalPrice(variant) -%}
  {% from _self import convertAndFormat %}
  {{- convertAndFormat(variant|sylius_calculate_original_price({'channel': sylius.channel})) }}
{%- endmacro -%}

并替换为:

{{ money.calculatePrice(product|sylius_resolve_variant) }}

{{ money.calculateOriginalPrice(product|sylius_resolve_variant) }}

错误:

Unknown "sylius_calculate_original_price" filter. Did you mean 
"sylius_calculate_price"?

有什么想法吗?

PriceHelper 服务在此文件中配置:https://github.com/Sylius/Sylius/blob/f7d42d2ce64288407372775e0ed421debcd50cd3/src/Sylius/Bundle/CoreBundle/Resources/config/services/templating.xml

但是,与其像您那样替换服务,不如装饰它。使用新 class 扩展 PriceHelper class 并添加您需要的功能,然后为您的新服务添加配置,如下面 link 所述,以装饰 PriceHelper 服务:http://symfony.com/doc/current/service_container/service_decoration.html

在您的特定情况下,您必须使用此配置:

AppBundle\Helper\PriceHelper:
    decorates: '@sylius.templating.helper.price'
    arguments:
        $productVariantPriceCalculator: '@sylius.calculator.product_variant_price'

问题已解决。 services.yml 实际上很好。只需要在下面添加 config.yml:

twig:
    globals:
        sylius_calculate_original_price: "@app.templating.helper.price"

在树枝中:

{{ sylius_calculate_original_price.getOriginalPrice(variant,{'channel': sylius.channel}) }}

services.yml可以缩短为:

app.templating.helper.price:
    decorates: sylius.templating.helper.price
    class: AppBundle\Helper\PriceHelper
    arguments:
        - "@sylius.calculator.product_variant_price"