Heim  >  Fragen und Antworten  >  Hauptteil

Problem beim Bearbeiten der Bestellung im Shopware-Admin-Bereich beim Hinzufügen eines benutzerdefinierten Rabatts

<p>Ich habe einen benutzerdefinierten Warenkorbrabatt gemäß der Dokumentation https://developer.shopware.com/docs/guides/plugins/plugins/checkout/cart/add-cart-discounts geschrieben Alles funktioniert einwandfrei, wenn der Kunde ein Produkt zum Warenkorb hinzufügt oder daraus entfernt, wird der Rabatt neu berechnet, aber wenn ich diese Bestellung im Admin-Bereich bearbeiten möchte, erhalte ich die Fehlermeldung: </p> <blockquote> <p>Nicht abgefangene PHP-Ausnahme ShopwareCoreCheckoutCartExceptionLineItemNotStackableException: „Die Position mit der Kennung ‚CHEAPEST_ITEM_CART_DISCOUNT‘ ist nicht stapelbar und die Menge kann in /var/www/shop/vendor/shopware/core/Checkout/Cart/LineItem/ LineItem nicht geändert werden.“ .php Zeile 233 {"Exception": "[Object](Shopware Core Checkout Cart Exception LineItemNotStackableException (Code: 0): Der Einzelposten mit der Kennung „CHEAPEST_ITEM_CART_DISCOUNT“ ist nicht stapelbar und die Menge kann nicht geändert werden. unter /var/www/shop/vendor/shopware/core/Checkout/Cart/LineItem/LineItem.php:233)"} []</p> </blockquote> <p>Ich habe dieses Problem „gelöst“, indem ich diese Prüfung zu meinem Code hinzugefügt habe: </p> <pre class="brush:php;toolbar:false;">if($behavior->hasPermission(self::SKIP_PROMOTION)){ $items = $original->getLineItems()->filterType(self::LINE_ITEM_TYPE); foreach ($items als $item) { $toCalculate->add($item); } zurückkehren; }</pre> <p>Wenn ich jetzt die Bestellung im Admin-Bereich bearbeite, wird der Fehler nicht angezeigt, aber der Rabatt wird nicht erneut berechnet und das Umschalten auf „Automatische Werbeaktionen deaktivieren“ funktioniert nicht. </p> <p>Gibt es eine Lösung, um benutzerdefinierte Rabatte nacheinander bei Bearbeitungsvorgängen neu zu berechnen? Wenn ich im Admin-Bereich eine neue Bestellung hinzufüge, funktioniert alles einwandfrei, das Problem besteht nur beim Bearbeiten. Die Dokumentation sagt dazu nichts. </p>
P粉811349112P粉811349112438 Tage vor882

Antworte allen(1)Ich werde antworten

  • P粉710454910

    P粉7104549102023-09-02 14:33:53

    通过引用标识符查找折扣是否已添加到购物车。如果是,只需从购物车中删除旧实例,然后再添加重新计算的折扣即可。

    if ($original->has($discountLineItem->getId())) {
        $original->get($discountLineItem->getId())->setRemovable(true);
        $original->remove($discountLineItem->getId());
    
        return;
    }
    
    // $discountLineItem->getType() should equal LineItem::DISCOUNT_LINE_ITEM
    $toCalculate->add($discountLineItem);
    

    此外,您还必须确保您的处理器在 Shopware 自己的 PromotionProcessor 之后执行,否则它将尝试重新添加您之前手动添加的折扣。

    <service id="MyPlugin\Cart\CustomPromotionProcessor">
        <!-- ... inject after default discount cart processor (3700) -->
        <tag name="shopware.cart.processor" priority="3600"/>
    </service>
    

    创建了一个示例插件,其中包含重新计算所需的指南中的所有更改。在当前候选版本 6.5 上进行了测试,但也应该适用于最新版本的 6.4

    该示例基于购物车价值百分比形式的折扣。如果折扣应该是变化的绝对值,则过程会略有不同。我在上述存储库中创建了一个分支,并提供了一个示例。

    Antwort
    0
  • StornierenAntwort