Controller function überschreiben / Warenkorb leeren bevor neuer Artikel hinzugefügt wird

Hallo,

ich bräuchte nochmal Eure Hilfe.

  1. Gibt es eine Möglichkeit, dass wenn man den „In den Warenkorb“ - Button drückt, erst alle Artikel die bereits im Warenkorb liegen, gelöscht werden? (Am liebsten anhand eines definierten Attributes einer speziellen Form)

  2. Wie kann ich im Listing Artikel aus dem Warenkorb ausgeben lassen? Mir reicht Ordernumber und Menge.

Vielen Dank im Voraus!  Halo
 

Hm,

zu 1. Das würde bedeuten, der Kunde kann nie 2 Artikel in den Warenkorb legen. Vermutlich nur über Plugin zu lösen.

zu 2. Auch dies ist vermutlich nur über Plugin zu lösen.

Danke für die Rückmeldung!

Ergänzend dazu muss ich sagen, dass der Shop lediglich die Funktion hat, ein Array von  ordernumbers und values in den Warenkorb zu legen, welche vorher nach verschiedenen Parametern zusammengestellt werden.

Wenn ich die Artikel nun in den Warenkorb gelegt habe und wieder zurück klicke und wieder die Artikel in den Warenkorb lege, dann sind alle Artikel 2x drin. Es müsste nur so sein, dass immer nur die Artikel im Warenkorb sein dürfen, die man zuletzt zusammengestellt hat und über das array per sAddAccessoires übergibt. 

Hoffe das ist einigermaßen verständlich ausgedrückt.

Habe es nun hinbekommen, indem ich im Checkout Controller die addAccessoriesAction Funktion angepasst habe.

public function addAccessoriesAction()
    {
        $basket = $this->getBasket();
        foreach ($basket['content'] as $item) {
          $this->basket->sDeleteArticle($item['id']);
        }
        $this->addAccessories(
            $this->Request()->getParam('sAddAccessories'),
            $this->Request()->getParam('sAddAccessoriesQuantity')
        );
        $this->forward($this->Request()->getParam('sTargetAction', 'cart'));
    }

Jetzt bräuchte ich nur noch einen Tipp, wie ich die Funktion updatesicher überschreiben kann.

Garnicht  Wearing-Sunglasses
Einfach auf den PreDispatch von CheckOut registrieren, und dort die action auf AddAccssories abfragen und dann das Löschen durchführen.
Warum die Schleife, geht das nicht?
https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Core/sBasket.php#L1762

Puh, okay  Angry-Face

Ich habe jetzt einfach zu Testzwecken das SwagGlobalVariables - Plugin genommen und die .php angepasst und versucht so umzusetzen. Leider funktioniert das so allerdings nicht. Habe ich da irgendwas grundlegendes falsch?

 'onPreDispatchCheckout',
        ];
    }

    /**
     * @param \Enlight_Controller_ActionEventArgs $args
     */
     public function onPreDispatchCheckout(\Enlight_Event_EventArgs $args)
     {
           /** @var \Shopware_Controllers_Frontend_Checkout $controller */
           $controller = $args->get('subject');


           if ($controller->Request()->getActionName() == 'addAccessories') {
                       $basket = $this->getBasket();
                       foreach ($basket['content'] as $item) {
                         $this->basket->sDeleteArticle($item['id']);
                       }
                       $this->addAccessories(
                           $this->Request()->getParam('sAddAccessories'),
                           $this->Request()->getParam('sAddAccessoriesQuantity')
                       );
                       $this->forward($this->Request()->getParam('sTargetAction', 'cart'));
                       return;
           }
    }
}

 

Fang mal von vorne an  Wink
https://developers.shopware.com/plugin-guide/

Den Aufruf von Add kannst Du ja schon mal sparen - die Action wird ja so oder so aufgerufen.
Edit: Sollte so gehen - aber bitte nicht die Action nachbauen und gar nicht den forward! Das wird ja später regulär ausgeführt.
 

Danke schonmal! Wie müsste die Plugin Struktur denn aussehen? Habe jetzt mal versucht, das ganze anhand des Controller Beispiel Plugin (https://developers.shopware.com/developers-guide/controller/#example) zu versuchen, aber da erhalte ich direkt einen 500- Fehler beim aktivieren des Beispiel-Plugins.

So funktioniert das jedoch auch nicht (es werden keine Artikel mehr hinzugefügt & auch keine gelöscht)  Foot-in-Mouth

public function onPreDispatchCheckout(\Enlight_Event_EventArgs $args)
     {
           /** @var \Shopware_Controllers_Frontend_Checkout $controller */
           $controller = $args->get('subject');


           if ($controller->Request()->getActionName() == 'addAccessories') {
                       $basket = $this->getBasket();
                       foreach ($basket['content'] as $item) {
                         $this->basket->sDeleteArticle($item['id']);
                       }
           }
    }

 

$this->basket->sDeleteBasket(). Ist viel schneller und löscht alles wie du es willst

Perfekt, danke - funktioniert im Core!

Weißt du vielleicht wie ich das Plugin anpassen müsste damit es funktioniert?

Warum gibt es denn keine {$smarty.block.parent} ähnliche Variante um functions zu erweitern  Angry-Face Foot-in-Mouth

 

public function onPreDispatchCheckout(\Enlight_Event_EventArgs $args)
     {
           /** @var \Shopware_Controllers_Frontend_Checkout $controller */
           $controller = $args->getSubject();

           if ($controller->Request()->getActionName() == ‚addAccessories‘) {
                       $this->basket->sDeleteBasket();
           }
    }

Ich möchte das Thema nochmal kurz aufbereiten weil ich mich nun endlich mit Plugins auseinander setzen möchte Smile

Im Core funktioniert das so:

public function addAccessoriesAction()
    {
        $this->basket->sDeleteBasket();
        $this->addAccessories(
            $this->Request()->getParam('sAddAccessories'),
            $this->Request()->getParam('sAddAccessoriesQuantity')
        );

        $this->forward($this->Request()->getParam('sTargetAction', 'cart'));
    }

Im Plugin funktioniert das leider nicht: 

public function onPreDispatchCheckout(\Enlight_Event_EventArgs $args)
     {
       /** @var \Enlight_Controller_Action $controller */
       $controller = $args->getSubject();

       /** @var \Enlight_Controller_Request_Request $request */
       $request = $controller->Request();


       if ($request->getActionName() !== 'addAccessories') {
          return;
       }

       $this->basket->sDeleteBasket();

    }

Es werden so keine neuen Artikel hinzugefügt und keine gelöscht.

Denke der Fehler kann nur marginal sein Undecided Vielen Dank im Voraus!