Jump to content
xt:Commerce Community Forum
Sign in to follow this  
splitt3r321

Produkte einer Kategorie inkl. Produkte aus den Unterkategorien anzeigen

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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]

Share this post


Link to post
Share on other sites

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.

Edited by Jeldrik

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...