Shopware 6自定义免费商品改价时自动生成新商品问题咨询
Shopware修改免费商品价格时自动生成新商品的原因分析
我们自研了Free Products插件,通过以下代码将免费商品价格设为0:
$lineItem = $this->factory->create([ 'type' => LineItem::PRODUCT_LINE_ITEM_TYPE, 'referencedId' => $item->getProductId(), ], $context); $lineItem->setRemovable(false); $lineItem->setStackable(false); $lineItem->setLabel($item->getName()); $lineItem->addExtension('scgItem', new ArrayEntity([ "isAdded" => true, "isPreventSale" => $item->isPreventSale() ])); $lineItem->setPriceDefinition(new QuantityPriceDefinition(0, new TaxRuleCollection(), 1))->setPrice(new CalculatedPrice(0, 0, new CalculatedTaxCollection(), new TaxRuleCollection())); $lineItem->setPrice(new CalculatedPrice(0, 0, new CalculatedTaxCollection(), new TaxRuleCollection()));
客户反馈其使用的服务无法处理0欧元商品,计划将该免费商品价格改为1欧元(同时对应降低主商品价格1欧元),但修改该商品价格时Shopware会自动生成新商品,原因如下:
Shopware价格体系的保护机制:Shopware中商品价格和店铺、货币、客户组等上下文强绑定。当修改购物车内商品的价格,且该价格与系统预设的原商品价格不一致时,为了不污染原商品的价格数据,系统会自动生成一个临时新商品条目来承载自定义价格,避免影响原商品的基础价格记录。
购物车条目的独立性要求:Shopware的购物车逻辑里,每个LineItem需要对应明确的商品数据。如果直接修改LineItem的价格属性(而非通过内置折扣、优惠规则实现),系统会判定这是一个与原商品价格不同的特殊条目,生成新商品来区分,确保购物车中每个条目的价格、属性独立,不会和原商品默认数据混淆。
插件修改方式触发的同步逻辑:当前代码是直接创建LineItem并设置0价,后续修改该LineItem价格时,由于价格与原商品基础价格不匹配,Shopware的购物车同步机制会检测到差异。为了维护数据一致性,系统会生成新商品条目保存修改后的价格状态,而非直接改动原商品价格数据。
内容的提问来源于stack exchange,提问作者Leon Schwanitz
相关产品推荐
相关产品推荐

