Maison  >  Questions et réponses  >  le corps du texte

Problème lors de la modification de la commande dans le panneau d'administration de Shopware lors de l'ajout d'une remise personnalisée

<p>J'ai écrit une réduction de panier personnalisée selon la documentation https://developer.shopware.com/docs/guides/plugins/plugins/checkout/cart/add-cart-discounts Tout fonctionne bien, lorsque le client ajoute ou supprime un produit du panier, la remise est recalculée, mais lorsque je souhaite modifier cette commande dans le panneau d'administration, j'obtiens l'erreur : </p> <blockquote> <p>Exception PHP non interceptée ShopwareCoreCheckoutCartExceptionLineItemNotStackableException : "L'élément de campagne avec l'identifiant 'CHEAPEST_ITEM_CART_DISCOUNT' n'est pas empilable et la quantité ne peut pas être modifiée." .php ligne 233 {"Exception": "[Objet] (Exception du panier de paiement Shopware Core LineItemNotStackableException (Code : 0) : l'élément de campagne avec l'identifiant "CHEAPEST_ITEM_CART_DISCOUNT" n'est pas cumulable et la quantité ne peut pas être modifiée. à /var/www/shop/vendor/shopware/core/Checkout/Cart/LineItem/LineItem.php:233)"} []</p> </blockquote> <p>J'ai "résolu" ce problème en ajoutant cette vérification à mon code : </p> <pre class="brush:php;toolbar:false;">if($behavior->hasPermission(self::SKIP_PROMOTION)){ $items = $original->getLineItems()->filterType(self::LINE_ITEM_TYPE); foreach ($éléments en tant que $élément) { $toCalculate->ajouter($item); } retour; }</pré> <p>Maintenant, si je modifie la commande dans le panneau d'administration, l'erreur ne s'affiche pas, mais la remise n'est pas calculée à nouveau et l'option "Désactiver les promotions automatiques" ne fonctionne pas. </p> <p>Existe-t-il une solution pour recalculer les remises personnalisées de manière séquentielle lors des opérations de modification ? Lorsque j'ajoute une nouvelle commande dans le panneau d'administration, tout fonctionne bien, le problème concerne uniquement l'édition. La documentation ne dit rien à ce sujet. </p>
P粉811349112P粉811349112384 Il y a quelques jours836

répondre à tous(1)je répondrai

  • P粉710454910

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

    Découvrez si la remise a été ajoutée au panier par identifiant de référence. Si tel est le cas, supprimez simplement l'ancienne instance de votre panier et ajoutez la remise recalculée.

    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);
    

    De plus, vous devez également vous assurer que votre processeur s'exécute après celui de Shopware PromotionProcessor, sinon il essaiera de ré-ajouter la remise que vous avez précédemment ajoutée manuellement.

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

    J'ai créé un exemple de plugin qui contient toutes les modifications du guide nécessaires au recalcul. Dans la version candidate actuelle 6.5 上进行了测试,但也应该适用于最新版本的 6.4.

    Cet exemple est basé sur une remise en pourcentage de la valeur du panier. Si la remise doit correspondre à la valeur absolue du changement, le processus est légèrement différent. J'ai créé un fork dans le référentiel ci-dessus et fourni un exemple.

    répondre
    0
  • Annulerrépondre