Ich möchte eine Meldung ausgeben, sobald jemand einen Artikel in den Warenkorb legt. Via Hook spreche ich in den Warenkorb folgendermaßen an: <?php class Shopware_Plugins_Backend_TestApi_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function install()
{
$event = $this->createHook( 'sBasket', 'sAddArticle', 'onAddArticle', Enlight\_Hook\_HookHandler::TypeReplace, 0 ); $this-\>subscribeHook($event); return true; } static function onAddArticle(Enlight\_Event\_EventArgs $args) { if($GLOBALS['doNotRepeat']++ == 0) //just one call { //... //$args-\>setReturn($args-\>getSubject()-\>excuteParent('sAddArticle',$args-\>getArgs())); $args-\>setReturn($args-\>getSubject()-\>excuteParent('sAddArticle',FALSE)); } } } ?\>
Das Problem ist nun aber, dass obwohl im Backend dem Warenkorb ja nix mehr hinzugefügt wird, im Frontend noch immer jene „erfolgreich hinzugefügt“ - Meldung erscheint. Um es einfach zu beschreiben. Ich hätte gerne eine Abfrage für „vorbestellbare Artikel“ im Stil von: [quote]Der Artikel ist noch nicht verfügbar und kann frühstens am XX.XX.XXXX geliefert werden. Möchten Sie den Artikel (dennoch) vorbestellen? [JA] | [NEIN][/quote] Aufgrund der Auswertung soll der Artikel dann hinzufgefügt oder eben verworfen werden. Wie kann ich den Inhalt der Meldungsbox verändern (Template?) und ist es möglich dort per Formular eine Abfrage zu setzen? Und wie muss ich die bereits hinterlegten GET-Parameter für den Artikel mitübergeben? Und wo, bzw. wie hinterlege ich den HTML-Code für dieses kleine Template? Ich wäre suuuuuper dankbar, wenn mir jemand einen Tipp geben könnte.
Da würde ich grundsätzlich anders vorgehen: - Im Frontend steht ja bei den Artikel-Daten in der Regel die Spalte releasedate zur Verfügung, über die man überprüfen kann, ob ein Artikel bereits erschienen ist. - Auf die Warenkorb-Buttons im Frontend werden via Javascript (jQuery in jquery.shopware.js) Event-Listener gesetzt, so dass die “In den Warenkorb” Funktion asynchron via Ajax ausgeführt wird - Man müsste sich nun per Plugin in den Post-Dispatch Event einhängen und eigenes Javascript ins Frontend injecten - dieses Javascript würde die auf die “In den Warenkorb” Buttons gesetzten Listener entfernen und einen eigene Callback-Funktion für die Buttons registrieren. - In dieser Callback-Funktion würde man nun überprüfen, ob das releasedate für diesen Artikel in der Zukunft liegt und in diesem Fall den gewünschten Overlay anzeigen (Die Abfrage auf das releasedate kann theoretisch auch asynchron per Ajax erfolgen). - Auf den Ok-Button im Overlay würde man nun den eigentlichen “In den Warekorb”-Event aus jquery.shopware.js legen. Im Prinzip sind hier also gar keine Hooks notwendig, um die gewünschte Funktion umzusetzen.
Super herzlichen Dank erstmal. Für einen Shopware-Rookie wie mich, wirft das erstmal mehr Fragen auf, als es beantwortet Toll wäre es ja php-seitig, etwas vergleichbares wie… switchTpl('ajax\_add\_article',$newTplCode)
…gibt es aber vermutlich nicht. Hmmm, wenn ich eben dieses oben erwähnte Plugin (hook-frei) anlege und dann mein JS injecten will, … <?php class Shopware_Plugins_Backend_TestApi_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function install()
{
$event = $this->createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch' ); $this-\>subscribeEvent($event); return true; } static function onPostDispatch(Enlight\_Event\_EventArgs $args) { // custom-js-injection } } ?\>
… wie und an welcher Stelle soll das geschehen? Und wo im JS wird überhaupt dieses “In den Warekorb”-Event aufgerufen? Hatte im Wiki mal was überfolgen, jedoch ohne JS. Das hat dann aber wohl nix damit zu tun, oder? $view-\>extendsTemplate(dirname(\_\_FILE\_\_).'/testApi.tpl');
Denn wie ich JS in jene Methode injecten soll, ist mir schleierhaft.