Hallo zusammen, ich möchte in die Funktionalität von sBasket->sAddVoucher eingreifen. Ziel ist es die Gutscheingültigkeit über eine zusätzlich Tabelle zu überprüfen, und wenn dies fehlschlägt dem Kunden eine Fehlermeldung zu zeigen. Die Funktion sAddVoucher gibt bei fehlgechlagenen Prüfungen folgendes zurück: return array(“sErrorFlag”=>true,“sErrorMessages”=>$sErrorMessages); Brauche ich dafür ein Event oder einen Hook? Wenn ich im Event “Shopware_Modules_Basket_AddVoucher_Start” etwas zurückgebe wir jeder Gutschein kommentarlos nicht angenommen. public function ShopwareModulesBasketAddVoucherStart(Enlight_Event_EventArgs $arguments){ $sErrorMessages = “Ungültig”; return array(“sErrorFlag”=>true,“sErrorMessages”=>$sErrorMessages); } Wenn ich einen “before” Hook mache public function beforeAddVoucher(Enlight_Hook_HookArgs $arguments){ $sErrorMessages = “Ungültig”; $arguments->setReturn(array(“sErrorFlag”=>true,“sErrorMessages”=>$sErrorMessages)); return; } oder auch public function beforeAddVoucher(Enlight_Hook_HookArgs $arguments){ $sErrorMessages = “Ungültig”; return array(“sErrorFlag”=>true,“sErrorMessages”=>$sErrorMessages); } funktioniert beides nicht. Ich bekomme die Fehlermeldung nicht zum Benutzer. Was mache ich da falsch? Beste Grüße Thomas
Du suchst den after hook. Etwas Lesestoff für dich: - http://wiki.shopware.de/Shopware-4-Even … efore_Hook - http://wiki.shopware.de/Shopware-4-Even … After_Hook Gruß
Danke, die Lektüre kenne ich After Hook alleine ist es nicht gewesen für mich. Ich habe mich für eine Kombination aus Replace und After Hook entschieden. Falls wer ähnliches benötigt eine etwas gekürzte Version des Plugins class Shopware\_Plugins\_Frontend\_MyVouchers\_Bootstrap extends Shopware\_Components\_Plugin\_Bootstrap { public static $isExtraCode = false; ..... private function subscribeEvents(){ //Frontend $this-\>subscribeEvent( 'sBasket::sAddVoucher::replace', 'replaceAddVoucher' ); $this-\>subscribeEvent( 'sBasket::sAddVoucher::after', 'afterAddVoucher' ); } public function afterAddVoucher(Enlight\_Hook\_HookArgs $arguments){ $sTicket = $arguments-\>get('sTicket'); $sTicket = stripslashes($sTicket); $sTicket = strtolower($sTicket); if($arguments-\>getReturn() === true){ if(self::$isExtraCode){ $sql = 'SELECT id basketID, ordernumber, articleID as voucherID, tax\_rate FROM s\_order\_basket WHERE modus=2 AND sessionID=?'; $voucher = $this-\>Application()-\>Db()-\>fetchRow($sql, array($this-\>Application()-\>SessionID())); if(!empty($voucher)){ $sql = "SELECT \* FROM s\_emarketing\_vouchers WHERE modus != 1 AND LOWER(vouchercode)=?"; $voucherData = $this-\>Application()-\>Db()-\>fetchRow($sql,array($sTicket)); $rabattBrutto = 0; // wird ersetzt durch das Ergebnis einer Extraberechnung $rabattNetto = 5; // wird ersetzt durch das Ergebnis einer Extraberechnung //Der Artikelname wird ersetzt $articleName = $this-\>Application()-\>Config()-\>get('sVOUCHERNAME')." - ".$voucherData['description']; $sql = " UPDATE s\_order\_basket SET price=price+?, netprice=netprice+?, articlename=? WHERE id=? AND sessionID=? AND modus=2 "; $params = array( $rabattBrutto, $rabattNetto, $articleName, $voucher['basketID'], $this-\>Application()-\>SessionID() ); $update = $this-\>Application()-\>Db()-\>query($sql,$params); } } } } public function replaceAddVoucher(Enlight\_Hook\_HookArgs $arguments){ $sTicket = $arguments-\>get('sTicket'); $sTicket = stripslashes($sTicket); $sTicket = strtolower($sTicket); $execParent = true; $sql = "SELECT v.\* FROM s\_emarketing\_vouchers v INNER JOIN s\_emarketing\_vouchers\_attributes va ON v.id = va.voucherID WHERE modus != 1 AND LOWER(vouchercode)=? AND ((valid\_to\>=now() AND valid\_from\<=now()) OR valid\_to is NULL) AND my\_extracode = 1 "; $ticketResult = $this-\>Application()-\>Db()-\>fetchRow($sql,array($sTicket)); if($ticketResult["id"]){ $sql = "SELECT SQL\_CALC\_FOUND\_ROWS b.id FROM s\_order\_basket b INNER JOIN my\_extra\_vouchers v ON b.articleID = v.articleID WHERE sessionID='".$this-\>Application()-\>SessionID()."' AND modus=0"; $matchingArticles = $this-\>Application()-\>Db()-\>fetchCol($sql); $sql= "SELECT FOUND\_ROWS() as count"; $countMatchingArticles = $this-\>Application()-\>Db()-\>fetchOne($sql); if($countMatchingArticles \< 1) { $execParent = false; $sErrorMessages[] = $this-\>Application()-\>Snippets()-\>getNamespace('frontend/basket/internalMessages')-\>get('VoucherFailureProducts','This voucher is only available in combination with certain products'); $arguments-\>setReturn(array("sErrorFlag"=\>true,"sErrorMessages"=\>$sErrorMessages)); } else{ self::$isExtraCode = true; } } if($execParent){ $arguments-\>setReturn( $arguments-\>getSubject()-\>executeParent( $arguments-\>getMethod(), $arguments-\>getArgs() ) ); } } }
Um noch mal kurz zusammenzufassen was hier passiert: Replace Hook: Zuerst wird nachgesehen ob es sich um einen Spezialcode handelt Wenn ja, wird in einer zusätzliche Tabelle überprüft ob für diesen Code passende Artikel im Warenkorb sind. Wenn nein wird eine Fehlermeldung ausgegeben. In allen anderen Fällen wird die Originalfunktion aufgerufen, damit die ganzen Standardüberprüfungen laufen. After Hook: Hier wird der Gutscheinartikel aus dem Warenkorb ausgelesen und die Werte nach eigenen Berechnungen verändert. Was ich nicht verstehe: warum werden die Hooks auch beim löschen des Gutscheins aus dem Warekorb aufgerufen wird Was mir nicht gefällt: Ich setzte im Replace Hook die statische Variable $isExtraCode um dann im After Hook darauf zuzugreifen um mir eine Abfrage zu sparen. Eine etwas unlegante Lösung. Gibt es keine Möglichkeit einen Parameter von einem Hook zum nächsten durchzuschleifen? Beste Grüße Thomas