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?
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.
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?
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.
Lösche nun alle vorherigen Requests mittels „clear“ oder „löschen“ im Netzwerk Tab.
Klicke nun auf „in den Warenkorb“.
Nun solltest Du zwei Ajax Request sehen:
a) checkout/ajaxAddArticleCart
b) checkout/ajaxAmount
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.
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
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();