In der “bestsellers-box” zeigt xt:Commerce die meistverkaufen Artikel an. Die Auswahl der angezeigten Artikel ändert sich abhängig von der “Kategorie”, in der sich der Besucher gerade befindet. Wenn man sich beispielsweise gerade in der Kategorie “Fernseher” aufhält, werden auch nur die bestverkauften Fernseher angezeigt.

Für Shops mit großer Auswahl ist das auch sinnvoll, da man davon ausgehen kann, dass für Besucher, die nach Fernsehern suchen, auch vorwiegend die meistverkauften Fernseher als Auswahl-Hilfe oder Surf-Tipp interessant sind. Aber je nach Shop kann es auch gewünscht sein, dass die “bestsellers-box” die Bestsellers aus allen Kategorien anzeigt - egal, in welcher Kategorie man sich gerade aufhält.

“Bestsellers-Box” immer aus allen Kategorien auswählen lassen:

Diese Verhaltensweise kann man mit ein paar Handgriffen erreichen. Ein Eingriff ins Shopsystem ist dazu nicht nötig, es muss nur eine Template-Datei bearbeitet werden - und zwar die Datei “best_sellers.php” im Ordner “source/boxes” des aktiven Templates.

Verantwortlich für die Kategorien abhängige Anzeige der “bestsellers” ist folgende Abfrage (etwa ab Zeile 54*):

if (isset ($current_category_id) && ($current_category_id > 0)) {
	$best_sellers_query = "select distinct
	                                        p.products_id,
	                                        p.products_price,
	                                        p.products_tax_class_id,
	                                        p.products_image,
	                                        pd.products_name from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd, ".TABLE_PRODUCTS_TO_CATEGORIES." p2c, ".TABLE_CATEGORIES." c
	                                        where p.products_status = '1'
	                                        and c.categories_status = '1'
	                                        and p.products_ordered > 0
	                                        and p.products_id = pd.products_id
	                                        and pd.language_id = '".(int) $_SESSION['languages_id']."'
	                                        and p.products_id = p2c.products_id
	                                        ".$group_check."
	                                        ".$fsk_lock."
	                                        and p2c.categories_id = c.categories_id and '".$current_category_id."'
	                                        in (c.categories_id, c.parent_id)
	                                        order by p.products_ordered desc limit ".MAX_DISPLAY_BESTSELLERS;
} else {
	$best_sellers_query = "select distinct
	                                        p.products_id,
	                                        p.products_image,
	                                        p.products_price,
	                                        p.products_tax_class_id,
	                                        pd.products_name from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd
	                                        where p.products_status = '1'
	                                        ".$group_check."
	                                        and p.products_ordered > 0
	                                        and p.products_id = pd.products_id ".$fsk_lock."
	                                        and pd.language_id = '".(int) $_SESSION['languages_id']."'
	                                        order by p.products_ordered desc limit ".MAX_DISPLAY_BESTSELLERS;
}

Für die gewünschte Verhaltensweise muss die gesamte if-Abfrage gelöscht oder (vorsichtshalber) auskommentiert werden, so dass nur noch die Anweisung bestehen bleibt, die bei “else” ausgeführt werden soll. Also ergibt sich (auskommentiert) folgender Code:

/* if (isset ($current_category_id) && ($current_category_id > 0)) {
	$best_sellers_query = "select distinct
	                                        p.products_id,
	                                        p.products_price,
	                                        p.products_tax_class_id,
	                                        p.products_image,
	                                        pd.products_name from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd, ".TABLE_PRODUCTS_TO_CATEGORIES." p2c, ".TABLE_CATEGORIES." c
	                                        where p.products_status = '1'
	                                        and c.categories_status = '1'
	                                        and p.products_ordered > 0
	                                        and p.products_id = pd.products_id
	                                        and pd.language_id = '".(int) $_SESSION['languages_id']."'
	                                        and p.products_id = p2c.products_id
	                                        ".$group_check."
	                                        ".$fsk_lock."
	                                        and p2c.categories_id = c.categories_id and '".$current_category_id."'
	                                        in (c.categories_id, c.parent_id)
	                                        order by p.products_ordered desc limit ".MAX_DISPLAY_BESTSELLERS;
} else {*/
	$best_sellers_query = "select distinct
	                                        p.products_id,
	                                        p.products_image,
	                                        p.products_price,
	                                        p.products_tax_class_id,
	                                        pd.products_name from ".TABLE_PRODUCTS." p, ".TABLE_PRODUCTS_DESCRIPTION." pd
	                                        where p.products_status = '1'
	                                        ".$group_check."
	                                        and p.products_ordered > 0
	                                        and p.products_id = pd.products_id ".$fsk_lock."
	                                        and pd.language_id = '".(int) $_SESSION['languages_id']."'
	                                        order by p.products_ordered desc limit ".MAX_DISPLAY_BESTSELLERS;
/*}*/

Nach dieser kleinen Änderung holt sich die “bestsellers-box” die angezeigten Artikel aus allen Kategorien. Unabhängig davon, “wo man sich gerade aufhält”.

 

* Die Angabe “etwa” deswegen, weil nicht bei jedem Template alle “source”-Dateien exakt dieselben sein müssen. Ich bin vom Standard-Template “xtc4″ ausgegangen.

Und wie immer gilt: Seien Sie vorsichtig bei Änderungen an einem laufenden System. Eine Sicherheitskopie ist für dieser Änderung eventuell ein bisschen übertrieben, da insgesamt nur acht Zeichen eingefügt werden, nämlich /* */ /* */ - Außerdem sei darauf hingewiesen, dass mit xt:Commerce 3.04 getestet wurde.

Bitte beachten Sie unbedingt die allgemeinen Hinweise zur Verwendung hier veröffentlichter Code-Beispiele!