【问题标题】:Changing product price in Shopware 6 dynamically在 Shopware 6 中动态更改产品价格
【发布时间】:2022-07-01 04:41:35
【问题描述】:

我想根据客户的选择更改产品的价格。例如,我正在尝试构建一个小型 PDP 小部件,以使客户能够选择蛋糕上的蜡烛数量或在蛋糕上写文字并相应地更新价格。文档仅涵盖如何通过overwriting the cart's collector/processor 更改价格,但我不想使用此方法,因为其他插件可能会覆盖相同的服务。那么,还有其他方法可以通过订阅活动来改变产品的价格吗?

【问题讨论】:

  • 我相信您链接的文档中描述的收集器覆盖可以由多个模块完成。你试过了吗?
  • 但是如果两个插件覆盖了价格收集器,只有后面的会被应用,我正在尝试实现一个对其他插件没有副作用的被动解决方案
  • 好吧,所以我的假设是错误的 :-( - 它背后的设计决策可能是,这里需要一个最终价格。链接逻辑和修改最终价格可以与 Symfony 装饰器一起使用。我认为您的逻辑可能已经适用于开箱即用的专业版的自定义产品?
  • 我对专业版了解不多,但我最初实现此功能的想法是添加一个包含我想要的任何自定义数据的新输入,然后监听 onLineItemAdded 事件,然后拥有访问行项目然后我会从输入中获取数据,使用$lineItem->setPrice 设置价格,但这仅在第一次添加项目表单并编辑购物车或报价中的数量时才有效,会将价格重置为任何值在管理面板中定义。

标签: shopware shopware6


【解决方案1】:

在这一项中,您需要考虑一些事项。 首先,您需要将用户输入数据保存在某处(蜡烛数量、文本)。 可能是一个单独的数据库表,在购物车订单项上具有 OneToMany 关系。请参阅此article。嗯,这也是您将挂钩到onLineItemAdd 事件并将您的用户输入保存到该表的部分。您也可以订阅onLineItemUpdate 以获得相同的保存逻辑。从购物车中删除商品时,您可以执行相同的操作,但如果您在实现数据库表时使用数据库的“删除时的 CASCADE”,则可能没有必要这样做。这意味着一旦订单项被客户删除(在数据库中删除),您的数据库条目也会被删除。

之后,您可以使用extensions 或称为associations 在购物车页面和订单页面上提取此数据。您可以在这里更花哨一点,如果您查看所有前端路由器调用,您会注意到 Shopware 有时会传递您可以挂钩的“Criteria”类。

    public static function getSubscribedEvents(): array
    {
        return [
            OrderRouteRequestEvent::class => 'alterCriteria',
            DocumentOrderCriteriaEvent::class => 'alterCriteria',
        ];
    }

    public function alterCriteria(Event $event): void
    {
        if (method_exists($event, 'getCriteria')) {
            $event->getCriteria()->addAssociation('lineItems.myExtension'); // check syntax, could be lineItem.
        }
    }

现在您可以扩展树枝模板以在订单页面、购物车页面、文档(发票)页面中显示蜡烛或文本。

其次,您必须处理价格。既然您已保存数据并通过标准订阅者自动提取数据,这部分将变得更加容易。如果无法始终挂钩这些事件,您仍然可以选择手动加载数据。

我不建议修改价格本身,但也许您可以考虑增加附加费。也许这个article 将有助于了解价格流向。您还可以查看是否有任何其他插件实现了附加费逻辑以查看它的实际效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2022-12-18
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2022-08-16
    • 2023-01-20
    相关资源
    最近更新 更多