splitt3r321 Posted May 26, 2010 Report Share Posted May 26, 2010 Hallo,, Ich möchte in der product_listing nicht nur alle Produkte der aktuelle Kategorie, sondern auch alle Produkte ausgeben welche in Unterkategorien der aktuellen Kategorie stecken. die class.products_list.php bietet mir leider nur die möglichkeit eine Produktliste einer Kategorie zu erstellen mit der funktion getProductListing (). Hier wird per setFilter('Categorie', $current_category_id); nur nach einer kategorie gefiltert. Gibt es eine Möglichkeit alle Artikel aus unterkategorien der aktuellen kategorie zu listen? Ich freue mich sehr über Hilfe. Viele Grüße Link to comment Share on other sites More sharing options...
giller Posted May 27, 2010 Report Share Posted May 27, 2010 vileicht mit zuweisung "mehr Katigorien" Link to comment Share on other sites More sharing options...
splitt3r321 Posted May 27, 2010 Author Report Share Posted May 27, 2010 Ja, das wäre eine Möglichkeit. Wenn nicht aber die optimale. =( Trotzdem, herzlichen Dank. Link to comment Share on other sites More sharing options...
giller Posted May 27, 2010 Report Share Posted May 27, 2010 gibt es nicht $current_sub_category_id oder der gleichen in irgend einer anderen class eigenlich weis oldbear immer gut bescheid bei sowas Link to comment Share on other sites More sharing options...
maxl27 Posted October 19, 2010 Report Share Posted October 19, 2010 Hast du das Problem mittlerweile lösen können? Würde mich auch brennend interessieren. Link to comment Share on other sites More sharing options...
oldbear Posted October 19, 2010 Report Share Posted October 19, 2010 hi, machbar ist alles, ist nur eine Frage des Aufwands. Standardmässig holt sich die class.product_sql_query nur die Produkte der aktuellen Kategorie. Man müsste also erst die Child-Kategorien ermitteln, die tatsächlich Produkte enthalten, also z.B. Hauptkategorie-Produkte, Unterkategorie1 ohne Produnkte, darunter Subkategorie2 mit Produkten und die Abfrage zur Erstellung des Produkt-Listings auf die erweitern ..... in der Ecke function F_Categorie.... Ob sich das rentiert ? Lieber die Produkte der Unterkategorien auf die Hauptkategorie verlinken, dann kommen beim Kategorielisting die doch mit, oder ? Grüsse Link to comment Share on other sites More sharing options...
ddsc01 Posted December 27, 2011 Report Share Posted December 27, 2011 In der class.products_list.php einfach beide "$this->sql_products->setFilter('Categorie', $this->current_categorey_id);" in "$this->sql_products->setFilter('Categorie_Recursive', $this->current_categorey_id);" ändern. Fertig! Link to comment Share on other sites More sharing options...
hatecontrolled Posted March 21, 2012 Report Share Posted March 21, 2012 Vielen Dank! Die Lösung ist super! Link to comment Share on other sites More sharing options...
dr.1977 Posted July 15, 2012 Report Share Posted July 15, 2012 Herzlichsten Dank , das funktionert perfekt und ist auch noch super elegant. Link to comment Share on other sites More sharing options...
sams Posted October 14, 2012 Report Share Posted October 14, 2012 nachdem ich jetzt 6 monate lang versucht habe rauszufinden warum meine parse zeit auf teilweise über 10sec. gestiegen ist (>75.000 Artikel) habe ich hier gerade den übertäter gefunden. Diese "Lösung" war leider schuld. Link to comment Share on other sites More sharing options...
Reverent001 Posted October 16, 2012 Report Share Posted October 16, 2012 Also hilfreich ist dieser Workaround (wenn man es denn so nenn kann) in jedem Fall. Jedoch was micht stört ist die Tatsache, dass ich die Produktauflistung nicht entsprechen unterscheiden kann! Es werden alle Produkte gesammelt von allen UNterkategorien aufgelistet! Ich würde jetzt gerne, quasi als Übersicht, das die Unterkategorie angezeigt wird mit den dazu gehörigen Produkten und dann die nächste Unterkategorie usw.! Soweit ich das einsehen konnte ist es mit dieser variante nicht wirklich möglich oder? Link to comment Share on other sites More sharing options...
oldbear Posted October 16, 2012 Report Share Posted October 16, 2012 hätt ich ( im Prinzip ) ein Plugin dafür ( "Preisliste" ) ist natürlich performancefressend bei vielen Kategorien/Produkten, klick mal hier auf "Preisliste" in der Topnavi ( auch innerhalb einer Kategorie ) O&B Edelmetalle Grüsse Link to comment Share on other sites More sharing options...
Jeldrik Posted December 9, 2012 Report Share Posted December 9, 2012 In der class.products_list.php einfach beide "$this->sql_products->setFilter('Categorie', $this->current_categorey_id);" in "$this->sql_products->setFilter('Categorie_Recursive', $this->current_categorey_id);" ändern. Fertig! Die Lösung funktioniert wunderbar. Auf Performance habe ich nicht getestet. Langfristig fände ich es aber gut, dies ohne einen Hack des Cores zu realisieren. Das macht ja nur bei Updates und ähnlichem Probleme. Könnte das nicht als Konfigurationsoption in den Core aufgenommen werden? Link to comment Share on other sites More sharing options...
Jeldrik Posted December 10, 2012 Report Share Posted December 10, 2012 Leider funktioniert die Lösung noch nicht richtig. Es werden nur Artikel aus der ersten Ebene der Unterkategorien mit aufgenommen. Weitere Ebenen der Unterkategorien werden nicht aufgenommen. Verantwortlich für diese Funktion ist folgender Funktionsaufruf: function F_Categorie_Recursive ($data = 0) { $this->setSQL_TABLE("INNER JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON p2c.products_id = p.products_id LEFT JOIN ".TABLE_CATEGORIES." c ON p2c.categories_id = c.categories_id"); $this->setSQL_WHERE("and ".$data." in (c.categories_id, c.parent_id)"); }[/PHP] Leider hat das meine mySQL-Kenntnisse jetzt doch schon ernst herausgefordert und ich habe bisher keine Lösung gefunden. Hat sich dem Problem schon wer angenommen? Der generierte SQL-Code lautet (vereinfacht um unwichtige Dinge): [code]SELECT p.products_id FROM xt_products p INNER JOIN xt_products_to_categories p2c ON p2c.products_id = p.products_id LEFT JOIN xt_categories c ON p2c.categories_id = c.categories_id WHERE p.products_id != '' AND $data IN ( c.categories_id, c.parent_id )[/code] Link to comment Share on other sites More sharing options...
Jeldrik Posted December 10, 2012 Report Share Posted December 10, 2012 Leider funktioniert die Lösung noch nicht richtig. Es werden nur Artikel aus der ersten Ebene der Unterkategorien mit aufgenommen. Weitere Ebenen der Unterkategorien werden nicht aufgenommen. Verantwortlich für diese Funktion ist folgender Funktionsaufruf: function F_Categorie_Recursive ($data = 0) { $this->setSQL_TABLE("INNER JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON p2c.products_id = p.products_id LEFT JOIN ".TABLE_CATEGORIES." c ON p2c.categories_id = c.categories_id"); $this->setSQL_WHERE("and ".$data." in (c.categories_id, c.parent_id)"); }[/PHP] Leider hat das meine mySQL-Kenntnisse jetzt doch schon ernst herausgefordert und ich habe bisher keine Lösung gefunden. Hat sich dem Problem schon wer angenommen? Der generierte SQL-Code lautet (vereinfacht um unwichtige Dinge): [code]SELECT p.products_id FROM xt_products p INNER JOIN xt_products_to_categories p2c ON p2c.products_id = p.products_id LEFT JOIN xt_categories c ON p2c.categories_id = c.categories_id WHERE p.products_id != '' AND $data IN ( c.categories_id, c.parent_id )[/code] ---- Edit: Da stand ich vorhin ganz schön auf dem Schlauch. Mit ein bisschen Abstand nochmal jetzt die Lösugn für eine weitere Unterkategorie-Ebene. Die oben beschriebene Funktion F_Categorie_Recursive in class.product_sql_query.php in folgenden Code ändern: [PHP]function F_Categorie_Recursive ($data = 0) { $this->setSQL_TABLE("INNER JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON p2c.products_id = p.products_id LEFT JOIN ".TABLE_CATEGORIES." c1 ON p2c.categories_id = c1.categories_id LEFT JOIN ".TABLE_CATEGORIES." c2 ON c2.categories_id = c1.parent_id"); $this->setSQL_WHERE("and ".$data." in (c1.categories_id, c2.categories_id, c2.parent_id)"); }[/PHP] Entsprechend erweitern, wenn eine weitere Ebene benötigt wird. Das geht natürlich auf Lasten der Performance. Erfahrungwerte dazu, wie gut das der Cache abfängt und/oder Messungen dazu wie stark die DB durch das zweifache LEFT JOIN belastet wird, habe ich keine. Wirklich rekrusiv ist das immer noch nicht! Bei meinem Code werden nur die eigentliche Kategorie, ihre Subkategorien und die Sub-Subkategorien miteinbezogen. Also nicht wundern, wenn Artikel aus tieferen Ebenen nicht angezeigt werden. --- Hab mir das nochmal genau angeschaut und es jetzt über ein Plugin gelöst. Die Lösung ist jedoch auch nicht wirklich sauber, aber besser als ein Core-Hack. Falls jemand eine elegantere Lösung hat, bin ich für Tipps dankbar. Hänge mich an den Hook-Point products_list:getProductListing_filter. Bei diesem lasse ich folgenden Code ausführen: [PHP]// Falsche Filter-Funktion löschen unset($this->sql_products->filterFunctions["Categorie"]); // Eigenen Filter ausführen $this->sql_products->setSQL_TABLE("INNER JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c ON p2c.products_id = p.products_id LEFT JOIN ".TABLE_CATEGORIES." c1 ON p2c.categories_id = c1.categories_id LEFT JOIN ".TABLE_CATEGORIES." c2 ON c2.categories_id = c1.parent_id"); $this->sql_products->setSQL_WHERE("and ".$this->current_categorey_id." in (c1.categories_id, c2.categories_id, c2.parent_id)");[/PHP] Unsauber finde ich es, weil ich so tief in die Ausführung eingreife. Ich habe keine Schnittstelle gesehen, eine bereits gesetzte Filter-Methode zu löschen. Ebenso keine Möglichkeit eine eigene Filter-Methode zu registrieren. Link to comment Share on other sites More sharing options...
ringltangbob Posted January 30, 2014 Report Share Posted January 30, 2014 Kann mir kurz jemand helfen, wie ich das ganze anstelle, wenn ich 4 Unterkategorien habe und ich jeweils alle unergeordneten Kategorien in der übergeordneten Kategorie anzeigen lassen will? Viele Grüße, Benjamin Link to comment Share on other sites More sharing options...
ringltangbob Posted July 15, 2014 Report Share Posted July 15, 2014 Hallo zusammen, ich muss den Thread noch einmal hervorkramen. Mir ist aufgefallen, dass wenn ich mit der hier beschriebenen Methode die Artikel der Unterkategorien in der übergeordneten Kategorie liste manche Artikel doppelt bzw. mehrfach angezeigt werden. Das trifft auf die Artikel zu, die z.B. in mehreren Unterkategorien vorkommen. Weiß jemand, wie ich es realisieren kann, dass diese Artikel nur einmal aufgelistet werden? VG, Benjamin Link to comment Share on other sites More sharing options...
cusatimedia Posted July 17, 2014 Report Share Posted July 17, 2014 Ich vermute dass sich das durch $this->sql_products->setSQL_GROUP(' p.products_id '); lösen lässt. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.