Hallo, derzeit stehe ich vor einem kleinen Problem. Im Frontend werden zusätzliche Artikeldaten hinterlegt wie z.b. Länge oder Breite oder Farbe etc. Dazu wird entsprechend der Preis berechnet und in ob_attr4 in der s_order_basket hinterlegt. Funktioniert bis dahin einwandfrei. Nun soll der Preis angepasst werden im Warenkorb, sprich der Preis aus ob_Attr4 -> wird der Stückpreis: Genau da hänge ich fest: $event = $this-\>createEvent( 'Shopware\_Modules\_Basket\_UpdateArticle\_Start', 'onBasket\_UpdateArticle\_Start' );
public static function onBasket\_UpdateArticle\_Start(Enlight\_Event\_EventArgs $args) { $id = $args-\>id; $phprice = Shopware()-\>Db()-\>fetchOne(" SELECT ob\_attr4 FROM s\_order\_basket WHERE id='$id'"); if ($phprice \> 1){ Shopware()-\>Db()-\>query(" UPDATE s\_order\_basket SET price = '$phprice', netprice = '$phprice' WHERE id = '$id' "); } $view-\>extendsTemplate(dirname(\_\_FILE\_\_).'/plugin.tpl'); }
Aus irgendeinem Grund wird das Event nicht aufgerufen, sprich vardump gibt keine Ausgabe… Vielleicht hat jemand ne Idee?
Versuch es mal so: $event = $this-\>createHook('sBasket', 'sUpdateArticle', 'onBasket\_UpdateArticle\_After', Enlight\_Hook\_HookHandler::TypeAfter, 0 ); $this-\>subscribeHook($event);
static function onBasket\_UpdateArticle\_After (Enlight\_Hook\_HookArgs $args) { $id = $args-\>getId(); // Preis in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET price=?, netprice=? WHERE id=? AND sessionID=? AND modus=0 "; Shopware()-\>Db()-\>query($sql,array( $price, /\*Dein Eigener Preis\*/ $netprice, /\*Dein Eigener Preis\*/ $id, $session )); }
Danke für den Ansatz leider komme ich immer noch nicht weiter: static function onBasket\_UpdateArticle\_After (Enlight\_Hook\_HookArgs $args) { $session = Shopware()-\>SessionID(); $id = $args-\>getId(); // Preis aus Objektattribut auslesen $sql = " SELECT ob\_attr4 FROM s\_order\_basket WHERE sessionID=? AND id=? AND modus=0 "; $price = Shopware()-\>Db()-\>fetchOne($sql,array( $session, $id )); $netprice = $price; // Preis in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET price=?, netprice=? WHERE id=? AND sessionID=? AND modus=0 "; Shopware()-\>Db()-\>query($sql,array( $price, /\*Dein Eigener Preis\*/ $netprice, /\*Dein Eigener Preis\*/ $id, $session )); var\_dump($session, $price, $id); } }
Funktioniert nicht, auch nicht mit statischen Preisen. Allerdings funktioniert folgendes in Bezug auf das ob_attr6, jedoch die Preise werden vermutlich von der s_Basket überschrieben. Daher macht dein Ansatz schon absoluten Sinn ans Ende der s_UpdateArticle einen Hook zu setzen. Aber irgendwie find ich den Knackpunkt nicht public static function onBasket\_UpdateArticle\_Start(Enlight\_Event\_EventArgs $args) { $phid = $args-\>id; $phprice = Shopware()-\>Db()-\>fetchOne("SELECT ob\_attr4 FROM s\_order\_basket WHERE sessionID='" . Shopware()-\>SessionID() ."' AND id=" . intval($phid)); Shopware()-\>Db()-\>query(" UPDATE s\_order\_basket SET price = '$phprice', netprice = '$phprice', ob\_attr6 = '$phprice' WHERE sessionID='" . Shopware()-\>SessionID() . "' AND id=" . intval($phid)); }
mach mal unter das var_dump(…) ein exit; Sieht du nun keine Ausgabe?
Nope, nur wenn ich die gesamte Funktion in den Shopware_Modules_Basket_UpdateArticle_Start setze kommt entsprechend der Dump, der Preis wird dann auch gesetzt, allerdings wieder überschrieben… Sobald das exit raus ist. Der Hook wird gar nicht aufgerufen
Hast du eventuell im Ordner class/inherit eine myBasket.php liegen, wo die Ursprungsfunktion ohne Events deklariert ist?
Gerade geprüft auch dort nicht, ist mit Sicherheit irgendein ein simpler Fehler den ich wieder nicht sehe
Komplette Bootstrap.php: [code] <?php class Shopware_Plugins_CORE_SHUpprice_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function install()
{
$event = $this->createEvent( 'Shopware\_Modules\_Basket\_UpdateArticle\_Start', 'onBasket\_UpdateArticle\_Start' ); $this-\>subscribeEvent($event); $event = $this-\>createHook('sBasket', 'sUpdateArticle', 'onBasket\_UpdateArticle\_After', Enlight\_Hook\_HookHandler::TypeAfter, 0 ); $this-\>subscribeHook($event); } public static function onBasket\_UpdateArticle\_Start(Enlight\_Event\_EventArgs $args) { $phid = $args-\>id; $phprice = Shopware()-\>Db()-\>fetchOne("SELECT ob\_attr4 FROM s\_order\_basket WHERE sessionID='" . Shopware()-\>SessionID() ."' AND id=" . intval($phid)); Shopware()-\>Db()-\>query(" UPDATE s\_order\_basket SET price = '$phprice', netprice = '$phprice', ob\_attr6 = '$phprice' WHERE sessionID='" . Shopware()-\>SessionID() . "' AND id=" . intval($phid)); } static function onBasket\_UpdateArticle\_After(Enlight\_Hook\_HookArgs $args) { $session = Shopware()-\>SessionID(); $id = $args-\>getId(); // Preis aus Objektattribut auslesen $sql = " SELECT ob\_attr4 FROM s\_order\_basket WHERE sessionID=? AND id=? "; $price = Shopware()-\>Db()-\>fetchOne($sql,array( $session, $id )); $netprice = $price; // Preis in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET price=?, netprice=? WHERE id=? AND sessionID=? "; Shopware()-\>Db()-\>query($sql,array( $price, /\*Dein Eigener Preis\*/ $netprice, /\*Dein Eigener Preis\*/ $id, $session )); var\_dump($session, $price, $id); exit; } } ?\>[/code] Das Event funktioniert, der Hook aus irgendeinem Grund nicht :/
Liegt unter engine/local_old eventuell eine Basket-Klasse? Der Code sieht auf den ersten Blick korrekt aus - wird denn im Ordner engine/Shopware/Proxies eine Proxy-Klasse für das Basket-Objekt generiert?
Danke erstmal für die Antworten! Das mit dem local_old kann ich mir kaum vorstellen, werde ich aber morgen prüfen. Es handelt sich um eine 3.5.3 lokale Installation bei dem nur das Design Template angepasst wurde. Folgend wurde 3.5.4 als update aufgespielt. Daher würde es mich wundern wenn irgendwelche „Altlasten“ vorhanden wären. Den Proxie-Ordner werde ich ebenfalss morgen früh auf der Arbeit prüfen.
Wie vermutet im local_old war keine Basket Datei zu finden. Unter engine/Shopware/Proxies gibt es die sBasketProxy.php mit folgendem Inhalt: [code]
Ja, lösche die mal - eventuell passen die Schreibrechte auf dieser Datei nicht, so dass diese nicht neu generiert wird.
Gelöscht -> wurde neu erstellt. Ist exakt die selbe Datei und weiterhin auch das selbe Verhalten des Plugins
So habs nochmal vielen dank für den Ansatz Stefan! Es lag wohl an dem Problem das das installieren des Plugins Probleme mit sich brachte. Er läuft komischerweise in einer Endlosschleife beim speichern der Änderung (Aktiv/Inaktiv)des Plugins. sBasketProxy gelöscht -> Plugin neu installiert (trotz Endlos anzeige Speichere Bitte warten) und siehe da es werde Licht Die Anzeige Speichere Bitte Warten ist im übrigen immer noch da, (allerdings nur bei diesem Plugin) ich vermute mal das es dort irgendwelche weiteren Probleme gibt. Werde mal versuchen das Problem weiter einzugrenzen.
Hey ihr Beiden, mir ist aber gerade auch das gleiche aufgefallen. Muss irgendwie mit 3.5.4 zu tun haben. Ich hatte zweit identische Shops. Einer beide 3.5.3. Der eine Shop wurde auf 3.5.4 upgedated. Ich habe ein Plugin installiert, welches auch auf den Hook sBasket After gerichtet ist. In dem Shop 3.5.3 hat es funktioniert und der Code wurde ausgeführt. In dem Shop 3.5.4 hat es nicht funktioniert und der Code wurde schon gar nicht ausgeführt. Ein Blick in die Proxies hat gezeigt, dass es zwei Dateien gab: sBasketProxy.php sBASKETProxy.php Ich habe beide gelöscht und das Plugin neu installiert. Nun geht es auch im 3.5.4 Shop. Wie kann sowas zustande kommen? Im 3.5.3 Shop gibt es nur eine klein geschrieben Datei.
Ich hatte zugegebener Maßen schon an meinem Verstand gezweifelt FirePHP zu dem Speicher Fehler: Benchmark Events…s\p24\engine\Shopware\Plugins\Default\Core\BenchmarkEvents\Bootstrap.php @ 80 POST http://localhost/p24/backend/plugin/saveDetail POST http://localhost/p24/backend/plugin/saveDetail 200 OK 392ms ext-base.js (Zeile 7) ParameterHeaderPostPutAntwortCacheHTML Antwort-HeaderQuelltext anzeigen Date Fri, 17 Jun 2011 11:05:59 GMT Server Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By PHP/5.3.1 Set-Cookie PHPSESSID=rah9kr0241eiei18vl97namnd0; path=/p24/ Expires Thu, 19 Nov 1981 08:52:00 GMT Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma no-cache Content-Length 1 Keep-Alive timeout=5, max=100 Connection Keep-Alive Content-Type text/html; charset=iso-8859-1 Anfrage-HeaderQuelltext anzeigen Host localhost User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 115 Connection keep-alive X-Requested-With XMLHttpRequest Content-Type application/x-www-form-urlencoded; charset=UTF-8 Referer http://localhost/p24/backend/plugin Content-Length 14 Cookie SHOPWARESID=rb0sk1pfgrej975k9j1kafl0i3; PHPSESSID=rah9kr0241eiei18vl97namnd0; sUniqueID=fdedce618a7d66dfa533f5b50a02db46 Parameterapplication/x-www-form-urlencoded active 0 id 47 Quelle id=47&active=0 syntax error [Bei diesem Fehler anhalten] ( ) Jede Proxie Datei muss entsprechend gelöscht werden, sonst werden die Hooks nicht installiert bei mir. XAMPP unter Windows. Denke mal wird ein Konfigurationsfehler sein. Ich habe noch eine kleine Frage: Es geht um den Ajax Pop-up der vom Warenkorb gesendet wird, sobald der Artikel im Warenkorb ist. Der Preis dort ist immer noch der normale Artikelpreis, wenn ich den Artikel jedoch 2x in den Warenkorb lege wird der korrekte Stückpreis im Popup angezeigt. Bisher habe ich demzufolge versucht den Preis vorab zu ändern, sprich vor $event = $this->createHook(‘sBasket’, ‘sAddArticle’, ‘onBasket_AddArticle_Before’, Enlight_Hook_HookHandler::TypeBefore, 0 ); After ebenso, UpdateArticleStart ebenfalls. So langsam gehen mir die Ideen aus, oder liest der sofern der Artikel noch nicht im Warenkorb ist, den Preis aus den Artikeldaten???
Aktiviere mal throwExceptions und showException in der Application.php - dann sollte, sofern du Shopware 3.5.4 einsetzt, eine Aussagekräftige Fehlermeldung bei der Plugin-Installation erscheinen.
Also der Code muss gehen, so in der Art verwende ich es auch: $event = $this-\>createHook('sBasket', 'sUpdateArticle', 'onBasket\_UpdateArticle\_After', Enlight\_Hook\_HookHandler::TypeAfter, 0 ); $this-\>subscribeHook($event);
static function onBasket\_UpdateArticle\_After (Enlight\_Hook\_HookArgs $args) { $id = $args-\>getId(); $quantity = $args-\>getQuantity(); $session = $args-\>getSubject()-\>sSYSTEM-\>sSESSION\_ID; //Neue Artikelanzahl $quantity = '10'; // Preis und Menge in Datenbank anpassen $sql = " UPDATE s\_order\_basket SET quantity=?, currencyFactor=? WHERE orderid=? AND sessionID=? AND modus=0 "; Shopware()-\>Db()-\>query($sql,array( $quantity, $args-\>getSubject()-\>sSYSTEM-\>sCurrency["factor"], $id, $session )); }
Lag an was anderem der Fehler lag bei mir Zu dem Aktiv Schalten der Plugins Fehler kriege ich auch mit aktivierter Ausgabe keine genauere Fehlerdefinition. Kann ich aber erstmal mit leben, bei einer lokalen Entwicklungsumgebung. Danke nochmal an euch beiden für die Hilfe!
Hallo, Haben ebenfalls das selbige Problem das der Hook in Version 3.5.4 nicht ausgeführt wird, im Proxies Ordner befanden sich ebenfalls sBASKETProxy.php sBasketProxy.php Beide Dateien gelöscht, Plugin de/installiert, leider hat das nichts gebracht, da er mir nun im Frontend bei der addArticle Action folgenden Fehler rauswirft:
**Fatal error** : Call to undefined method Shopware\_Proxies\_sBasketProxy::Request() in **/var/www/vhosts/henri.de/stage/engine/Shopware/Plugins/Local/Frontend/GooglePS/Bootstrap.php** on line **60**
Im Plugin Code: static function onAddArticle(Enlight\_Hook\_HookArgs $args) { $request = $args-\>getSubject()-\>Request(); var\_dump($args); exit; Shopware()-\>Db()-\>query("INSERT INTO `s_order_basket_gps` (`sessionID`, `userID`) VALUES('1','22',)"); }
Er meckert also bei $request = $args-\>getSubject()-\>Request();
Den Proxy den er automatisch angelegt hat, nach dem löschen beider Dateien: [code]<?php class Shopware_Proxies_sBasketProxy extends sBasket implements Enlight_Hook_Proxy
{
public function excuteParent($method, $args=null)
{
return call_user_func_array(array($this, ‚parent::‘.$method), $args);
}
public static function getHookMethods()
{
return array ( 0 => 'sAddArticle',); } public function sAddArticle($id, $quantity = 1) { if(!Enlight::Instance()-\>Hooks()-\>hasHooks('sBasket', 'sAddArticle')) { return parent::sAddArticle($id, $quantity); } $obj\_args = new Enlight\_Hook\_HookArgs($this, 'sAddArticle', array('id'=\>$id, 'quantity'=\>$quantity)); return Enlight::Instance()-\>Hooks()-\>executeHooks($obj\_args); } } [/code] Schreibrechte sind aber alle vorhanden?! Es tritt auch kein Fehler bei der Plugin Installation auf, das ist ja das Merkwürdige, alle anderen Hooks funktionieren...