hi, ich steh irgendwie gerade auf’m Schlauch. Ich möchte gern das SQL bei Shopware_Modules_Basket_AddArticle_FilterSql manipulieren. Das Event bekomme ich registriert und das SQL bekomme ich mit $args->getReturn(). zurückgeben kann ich das manipulierte SQL dann auch aber wie genau manipuliere ich das jetzt? Wenn ich das wie folgt mache bekomme ich einen Fehler geschmissen. Wäre toll wenn jemand so nett wäre mir hier mal auf die Sprünge zu helfen. Vielen Dank, H. public function onAddArticleFilterSql(Enlight\_Event\_EventArgs $args) { //$id = $args-\>getId(); $getFilterData = $args-\>getReturn(); Shopware()-\>Log()-\>log($getFilterData ,Zend\_Log::INFO); $sql = "INSERT INTO s\_order\_basket ( id, sessionID, userID, articlename, articleID, ordernumber, shippingfree, quantity, price, netprice, datum, esdarticle, partnerID, config) VALUES (?, ?, ?, 'neuer Name', ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) "; return $sql; }
Fehler: Invalid parameter number: number of bound variables does not match number of tokens
Hi, das selbe Problem habe ich auch. Ich glaube hier gibt es keine “richtige” Lösung wie Du das Statement modifizieren kannst. Du hast hier ja leider nur das SQL-Statement und nicht die Parameter einzeln. Das einzige was mir hierzu einfällt ist preg_replace. Mir regulären Ausdrücken den richtigen Abschnitt ersetzen. Hier meine Lösung: public function getOnlyMerchandiseArticle(Enlight\_Event\_EventArgs $args) { /\* \* Dirty Hack, weil anscheined bei Filtermethoden nicht auf -\>getRequest zugegriffen werden kann. \*/ $controller = $args-\>getSubject()-\>sSYSTEM-\>\_GET["sViewport"]; $originalSQL = $args-\>getReturn(); if ($controller == "articlelist") { /\* \* Filtermethode soll nur ausgeführt werden Falls der Controller "articleList" ist. \* Ansonten soll das Shopwarestandardverfahren fortgesetzt werden. \*/ $havingSQL = "HAVING attr6 = 'Merchandise'"; $addSQL = "IS NULL $havingSQL ORDER BY"; $modifiedSQL = preg\_replace("/IS NULL([\s]\*)ORDER BY/", $addSQL, $originalSQL, -1, $count); /\* \* Falls das modfizieren erfolgreich war (genau ein mal ersetzt) gebe das neue SQL-Statement zurück, \* falls nicht benutze das Original (irgendwas ist schief gelaufen). \* Try, catch. \*/ if ($count == 1) { $return = $modifiedSQL; } else { $return = $originalSQL; } } else { $return = $originalSQL; } return $return; }
[quote=„dkamenev“]Hi, Du hast hier ja leider nur das SQL-Statement und nicht die Parameter einzeln. [/quote] hi, ich glabe das ist genau das Problem. ich will ja auch eigentlich gar nicht das Statement an sich modifizieren, sondern die Parameter die übergeben werden. Eine Möglichkeit muss es doch aber geben. Dazu ist das Event doch da oder? vielleicht hat ja jemand von Shopware mal eine Minute für eine kurze Antwort? Vielen Dank.
wenn shopware hier das event folgendermaßen triggern würde: list($sql, $params) = Enlight()-\>Events()-\>filter('Shopware\_Modules\_Basket\_AddArticle\_FilterSql',array ($sql, $params), array('subject'=\>$this,"article"=\>$getArticle,"price"=\>$getPrice,"esd"=\>$sEsd,"quantity"=\>$quantity,"partner"=\>$this-\>sSYSTEM-\>\_SESSION["sPartner"]));
dann könntest du auch die parameter modifizieren. ansonsten bleibt dir nur ein update-statement in einem hook auf sBasket::sAddArticle::after immerhin hast du da die insertID zur verfügung.
hi, hatte jetzt Gelegenheit mir das noch einmal anzusehen. mit sBasket::sAddArticle::after funktioniert das ganze auch nicht. Ich kann dann zwar den Preis in s_order_basket manipulieren aber der wird dann in sBasket::sGetBasket wieder überschrieben. Da könnte ich zwar auch noch eingreifen aber ich glaube das ganze wird dann ein ziemlicher Eingriff in den gesamten Warenkorb. Ich denke ich muss das anders lösen… vielen Dank, H.
preise im warenkorb manipulieren wird wohl erst ab 4.1.x gehen. ansonten müsstest du die komplette sBasket.php umarbeiten.
Ja, das habe ich jetzt auch erkannt. Das wäre halt die Grundvoraussetzung für einen artikelkonfiguraor gewesen bei dem man Optionen zu- und abwählen kann. Jetzt muss ich das irgendwie über die Zubehörartikel basteln. Aber die sind ja auch nicht variantenfähig. Alles irgendwie unbefriedigend ;-(