Gesamte Anzahl aller Artikel im Warenkorb-Header-Icon anzeigen?

Hallo zusammen,

ich möchte gerne meinen Kunden die gesamte Anzahl aller Artikel im Header-Warenkorb-Icon anzeigen:

Artikel-Name-Eins: 5x
Artikel-Name-Zwei: 3x

Gesamt: 8x Artikel

Mit folgemden Snippet wird leider nur die gesamte Artikelanzahl nach einem Seiten-Reload im Header-Warenkorb-Icon angezeigt:

 

	public static function getSubscribedEvents()
	{
		return [
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Checkout' => 'onRenderCheckout',
		];
	}

    public function onRenderCheckout()
    {

        Shopware()->Session()->sBasketQuantity = Shopware()->Db()->fetchOne(
            'SELECT SUM(sob.quantity) FROM s_order_basket sob WHERE modus = 0 AND sessionID = ?',
            [Shopware()->Session()->get('sessionId')]
        );
    }

 

Über den Ajax-Call “In den Warenkorb”, in der Artikel-Detail, wird die Anzahl leider nicht aktualisiert.

Hat jemand ein Idee, wie über den Ajax-Call “In den Warenkorb”, auch die gesamte Artikelanzahl im Header-Warenkorb-Icon aktualisiert wird?

 

Vielen Dank und beste Grüße
Michael

*push*

https://github.com/shopware/shopware/blob/5.2/engine/Shopware/Controllers/Widgets/Checkout.php

Die infoAction ist für die Anzeige im Header verantwortlich. Aber anstelle die Variable sBasketQuantity zu ändern, würde ich eher eine neue Variable definieren und diese im Template ausgeben. Sonst kann das zu Seiteneffekten führen.

Viele Grüße

@simkli schrieb:

https://github.com/shopware/shopware/blob/5.2/engine/Shopware/Controllers/Widgets/Checkout.php

Die infoAction ist für die Anzeige im Header verantwortlich. Aber anstelle die Variable sBasketQuantity zu ändern, würde ich eher eine neue Variable definieren und diese im Template ausgeben. Sonst kann das zu Seiteneffekten führen.

Viele Grüße

Hallo simkli,

vielen Dank schon mal, für den Ansatz!

Mit welchem Subscribed Event kann ich denn die infoAction mit meiner neuen Varibale erweiteren?

Vielen Dank und beste Grüße
Michael

Hi Michael,

da es sich um einen Controller handelt, gehst du am besten wie folgt vor:

https://developers.shopware.com/developers-guide/event-guide/#controller-dispatching

(Falls der Anker nicht klappt: Im Inhaltsverzeichnis: Finding events > Finding Global Events > Controller dispatching )

Viele Grüße

Hallo,

also ich weiß ja nicht wie Du bisher vorgeganen bist, um Events zu finden, aber das normale Vorgehen geht folgendermaßen:

[davon ausgegangen, dass Du dich bereits auf der Artikel Detailseite befindest und Du den Artikel in den Warenkorb legen kannst]

1. Du öffnest Deine Browser Debugging Tools (in den meisten Browsern ist das Rechtsklick in die Shop Seite => untersuchen). Dann klickst auf den Tab Network, bzw. Netzwerk, wenn es bei Dir auf Deutsch sein sollte. Dort aktivierst Du dann den Filter „XHR“, denn wir wissen, dass es sich um eine Ajax Anfrage handeln muss.

  1. Lösche nun alle vorherigen Requests mittels „clear“ oder „löschen“ im Netzwerk Tab.

  2. Klicke nun auf „in den Warenkorb“.

  3. Nun solltest Du zwei Ajax Request sehen:

a) checkout/ajaxAddArticleCart

b) checkout/ajaxAmount

  1. Für Dich interessant ist letztere, denn die klingt mehr nach dem, was Du suchst. Schauen wir uns also nun mal diese genauer an: Es ist im URL weder frontend, backend, api, noch widget zu finden. Diese Angabe im URL kann auch weg gelassen werden. Wenn es weg gelassen wird, dann ist es immer das Modul frontend. Gehen wir also nun in den Ordner engine/Shopware/Controllers/Frontend. Dort finden wir nun den gesuchten Controller vor: Checkout.php. Wir wissen auch, dass es sich um die Action ajaxAmount handeln muss. Suchen wir also nun im Controller eine öffentliche Methode mit den Namen „ajaxAmountAction“. Dort kannst Du für Dich noch weitere wichtige Infos ziehen, sofern benötigt.

  2. Nun wissen wir, es ist der Controller Checkout im Modul Frontend mit der Action ajaxAmount. Wir wissen ebenfalls, dass es für jeden Controller Action ein Pre- und PostDispatch Event gibt. Diese werden von der Shopware Event Dispatch Loop aufgerufen (gecallt). Da Du im Nachhinen die Daten beeinflussen möchtest, emfpiehlt es sich, das PostDispatch Event zu verwenden. Shopware Events bauen sich immer anhand eines Schemas auf:

Präfix bei PostDispatch Events: Enlight_Controller_Action_PostDispatch

Modul: Frontend

Controller: Checkout

Daraus resultierender Event-Name: Enlight_Controller_Action_PostDispatch_Frontend_Checkout

  1. Da es nur Events für ganze Controller, nicht jedoch für einzelne Actions gibt, müssen wir in der Event Methode noch prüfen, ob es sich um unsere gesuchte Action „ajaxAmount“ handelt. Das lässt sich folgendermaßen bewerkstelligen:

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

     /**
      * @var \Enlight_View_Default $view
      */
     $view = $controller->View();
    
     /**
      * @var $request \Zend_Controller_Request_Http
      */
     $request = $controller->Request();
    
     $action = strtolower($request->getActionName());
    
     if ($action === 'ajaxamount') {
         // hier Doctrine / DBAL Query ausführen
         // oder über Core-Klasse sBasket erfragen, sofern möglich
         $sum = 41;
    
         $view->assign('customBasketSum', $sum);
     }
    

    }

 

Hoffe, damit konnte ich es verständlich erklären.

 

 

MFG

 

derwunner

1 Like

@derwunner schrieb:

 

Hoffe, damit konnte ich es verständlich erklären.

 

 

MFG

 

derwunner

Hallo Wunner,

erst einmal 1000 Dank für deine ausführliche und wirklich verständliche Anleitung!!!

Ich bin deine Anleitung Schritt für Schritt durchgegangen, aber leider nicht zum Ziel gekommen.

Mein Methode sieht wie folgt aus:

public static function getSubscribedEvents()
	{
		return [
                         'Enlight_Controller_Action_PostDispatchSecure_Frontend_Checkout' => 'onPostDispatchCheckout'

		];
	}

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

    /**
     * @var \Enlight_View_Default $view
     */
    $view = $controller->View();

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

    $action = strtolower($request->getActionName());

    if ($action === 'ajaxamount') {
        $sum = Shopware()->Db()->fetchOne(
            'SELECT SUM(sob.quantity) FROM s_order_basket sob WHERE modus = 0 AND sessionID = ?',
            [Shopware()->Session()->get('sessionId')]
        );

        $view->assign('customBasketSum', $sum);
    }
}

In der themes/Frontend/MeinTheme/widgets/checkout/info.tpl, habe ich die customBasketSum wie folgt eingebaut:

                {$customBasketSum}

 

Habe ich irgendetwas grundlegendes vergessen?

 

Vielen Dank nochmals und beste Grüße
Michael

Also ich habe mich jetzt auf

 Enlight\_Controller\_Action\_PostDispatch\_Frontend\_Checkout

mit folgender Funktion registriert:

 public function onAddArticleToCart(\Enlight\_Event\_EventArgs $args) { $controller = $args-\>getSubject(); $request = $controller-\>Request(); $action = strtolower($request-\>getActionName()); if($action === 'ajaxamount') { $realQuantity = Shopware()-\>Db()-\> fetchOne('SELECT SUM(b.quantity) FROM s\_order\_basket b WHERE modus = 0 AND sessionID = ?', [Shopware()-\>Session()-\>get('sessionId')]); $controller-\>Response()-\>setBody( json\_encode(['amount' =\> Shopware()-\>Template()-\>fetch('frontend/checkout/ajax\_amount.tpl'), 'quantity' =\> $realQuantity,]) ); } }

Dadurch passt bei mir die Antwort, die ich vom AjaxCall bekomme (;