Hallo, ich schreibe einen Preisfilter für die Listingseiten und hänge an einem eher kleinen Problem: Ich subscribe mich auf den onFilterSql event in meinem Plugin: protected function subscribeEvents() { $this-\>subscribeEvent( 'Shopware\_Modules\_Articles\_sGetArticlesByCategory\_FilterSql', 'onFilterSql' ); } public function onFilterSql(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject(); // Was nun, wie kann ich das SQL Statement bearbeiten? } }
Der event wird in der /engine/core/class/sArticles.php emitted, und zwar so (sql statement verkürzt): $sql = " SELECT a.id as articleID, aDetails.id AS articleDetailsID, a.notification as notification, \*\*\* SNIP \*\*\* WHERE c.id=$categoryId AND c2.active=1 AND c2.left \>= c.left AND c2.right \<= c.right AND ac.articleID=a.id AND ac.categoryID=c2.id AND ag.articleID IS NULL $addFilterWhere $supplierSQL GROUP BY a.id ORDER BY $orderBy LIMIT $sLimitStart, $sLimitEnd "; $sql = Enlight()-\>Events()-\>filter('Shopware\_Modules\_Articles\_sGetArticlesByCategory\_FilterSql', $sql, array('subject' =\> $this, 'id' =\> $categoryId)); $articles = Shopware()-\>Db()-\>fetchAssoc($sql);
Ich will weitere WHERE condititions zu $sql hinzufügen, wie mache ich das? Soll ich in meiner onFilterSql funktion $args nutzen oder den return value? Ich finde einfach keine Möglichkeit mir auszugeben wie $args aussieht, egal ob var_dump, print_r oder FirePHP - nichts funktioniert. Vielen Dank!
Achso, nochmal direkter formuliert: Das dranhängen an den Event funktioniert, ich weiß nur nicht wie/was ich zurückgeben muss.
Hallo endzeit, versuch’ es mal so: $getFilterData = $args-\>getReturn();
Dort dürftest du nun die Daten finden, die du einfach anpassen und zurückgeben kannst. Gruß, Patrick :shopware:
Super, damit gehts. :thumbup:
Soweit so gut es scheint zu klappen. Mein Problem ist jetzt das man so zwar die SQL Abfrage modifizieren kann, nicht jedoch aber die SQL Abfrage danach die die Anzahl der Artikel ausgibt. Habe ich oben z.B. die SQL Anfrage modifiziert, so das mir nur Artikel ausgegeben werden die z.B. ein bestimmtes Attribut gesetzt haben, so zeit mir die Anzeige der Anzahl der gefunden Artikel immernoch den vorherigen wert an, da bei der Berechnung der Anzahl wieder eine andere SQL Anfrage benutzt wird, welche nicht über ein Hook modifizierbar ist. Hat da jemand eine Lösung?
Da braucht es wohl ein neues Event. Oder ein Refactoring des aktuellen Events. Hab mir den Code aber nicht angeschaut. Gruß Malte
Ja ein neues Event wäre Super als Einsprung. Ich frage mich nur wieso Shopware so etwas zwar vorsieht aber dann an der stelle damit „gegeizt wurde“ was macht es für einen logischen Sinn das man die SQL Abfrage für die Artikel verändern kann per Event aber eben die Berechnung der anzahl nicht einfach aus diesen Artikeln gezogen wird sondern extra über eine SQL Abfrage errechnet wird? Ich habe nun ein Event eingebunden nicht schön aber ich hoffe meine erstelltes Ticket wird in einer neuen Shopwareversion berücksichtigt, damit das System Updatesicher bleibt. Gruß Florian
Ja, möglich wäre es einfach das Array per count() zu zählen, anstatt extra ein Query gegen die DB zu werfen! Gute Idee! Gruß Malte
hallo gemeinde, der code von patrick: $getFilterData = $args-\>getReturn();
liefert mir einen sql string zurück in dem alle variablen ($select_price, $priceForBasePrice usw.) bereits gefüllt sind. gibt es eine möglichkeit, diese variablen über das event anzusprechen. im speziellen möchte ich die variable $addFilterWhere füllen, d. h. ich muss nur die where klausel ergänzen. bin mir bei der sache auch nicht ganz sicher, ob ich ein verständnis-problem habe. evtl. ist es seitens shopware so angedacht, dass man den sql-string über reguläre ausdrücke editiert und diesen dann zurück gibt?
Hallo, ich habe genau dieselbe Frage. Soll ich jetzt mit String-Operationen den SQL-Query auseinanderschnippeln? Das kann doch nicht ernsthaft der einzige Weg sein, den Query zu modifizieren? ST
ich müsste eigentlich auch nur den Part in $addFilterSQL des SQL-Strings modifizieren. Gibt es da keine Möglichkeit? Kann ja nicht den kompletten SQL-String neu aufbauen…