Shopware 6后台编辑订单时自定义折扣脚本报不可堆叠错误
解决Shopware后台编辑订单时折扣报错的问题
针对你遇到的CHECKOUT__CART_LINEITEM_NOT_STACKABLE错误,核心问题是折扣添加逻辑的判断错误,导致后台编辑订单时重复尝试添加同一ID的不可堆叠折扣。以下是需要注意的事项和修复方案:
修正折扣存在性判断逻辑
原代码中的判断逻辑完全写反了:if not services.cart.has('my-custom-discount')后执行移除操作,这会导致每次执行代码时,只要折扣不存在就去执行无意义的移除操作,而折扣存在时反而跳过移除,最终重复添加同一ID的折扣。正确的逻辑应该是如果折扣已存在则先移除,再重新添加,确保购物车中始终只有一个该ID的折扣:{% set discountPrice = services.cart.price.create({ 'default': { 'gross': 19.99, 'net': 19.99}, 'EUR': { 'gross': 19.99, 'net': 19.99}, }) %} {% if services.cart.has('my-custom-discount') %} {% do services.cart.remove('my-custom-discount') %} {% endif %} {% do services.cart.discount('my-custom-discount', 'absolute', discountPrice, 'my.custom.discount.label'|trans) %}理解Shopware折扣的不可堆叠属性
Shopware中默认创建的折扣是不可堆叠(stackable=false)的,即同一ID的折扣只能存在一个。后台编辑订单时,系统会重新触发购物车处理逻辑,若原逻辑导致重复添加同一ID折扣,就会触发该错误。必须保证同一折扣ID在购物车内唯一。保证逻辑的幂等性
后台编辑订单的场景下,购物车逻辑可能会被多次执行,所以折扣添加逻辑必须是幂等的——无论执行多少次,最终购物车中只会有一个该ID的折扣。通过"先判断存在再移除,再添加"的逻辑,就能实现这一点,避免重复操作触发不可堆叠限制。
内容的提问来源于stack exchange,提问作者Henning
相关产品推荐
相关产品推荐

