Hallo zusammen, ich habe eine vielleicht sogar nicht ganz so seltene Anforderung für einen Shop umgesetzt, darum möchte ich sie mit euch teilen. Wie das Thema schon sagt, sollen im Shop nur Kategorien auftauchen, die Artikel beinhalten (bzw. Unterkategorien mit Artikeln beinhalten). Dazu ist es erforderlich die Anzahl der Artikel zu ermitteln, die sich in den Kategorien befinden. Teilweise wird diese Info schon ermittelt (wenn man die Anzahl bei den Kategorien anzeigen lässt (SHOW_COUNTS) ), aber eigentlich möchte ich diese Info gar nicht anzeigen und bin außerdem kein Freund von SQLs in Schleifen/Rekursionen... Es gibt zwar eine Anleitung für XTC/XTCM (http://www.xtc-modified.org/forum/index.php?topic=3756.0), aber dafür wird sogar noch ein Index in den DB-Tabellen eingefügt um den Shop nicht auszubremsen... Außerdem ist die Struktur der Kategorie-Generierung bei GambioGX2 schon stark unterschiedlich zum klassischen XTC-Aufbau. Darum habe ich mich mal hingesetzt und habe selbst etwas entwickelt. Zuerst hole ich mir an einer zentralen Stelle über ein paar Arrays/Hashmaps alle Kategoriedaten in den Speicher, um dann ohne weitere DB-Zugriffe die notwendigen Infos zu ermitteln: /templates/EyeCandy/source/boxes/categories.php (zu Beginn der Datei einfügen) PHP: $hm_sql = " SELECT c.categories_id, COUNT(pc.products_id) AS anzahl, c.parent_id FROM ".TABLE_CATEGORIES." c LEFT JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." pc ON c.categories_id = pc.categories_id GROUP BY c.categories_id ";$t_hm_query = xtc_db_query($hm_sql);$cat_info=array();$cat_par=array();$empty_cats=array();while($c_hm_data = xtc_db_fetch_array($t_hm_query)) { $cat_info[$c_hm_data['categories_id']]=$c_hm_data; $cat_par[$c_hm_data['parent_id']][]=$c_hm_data['categories_id'];}foreach($cat_info as $cat_id=>$cat_data) { $cat_info[$cat_id]['total'] = getSubcount($cat_id,$cat_info,$cat_par); if ($cat_info[$cat_id]['total']==0) $empty_cats[]=$cat_id;}function getSubcount($cat_id,$cat_info,$cat_par) { $cat_anz = intval($cat_info[$cat_id]['anzahl']); if (!empty($cat_par[$cat_id]) && is_array($cat_par[$cat_id])) { foreach ($cat_par[$cat_id] as $sub_data) { $cat_anz += getSubcount($sub_data,$cat_info,$cat_par); } } return $cat_anz;}// Anzahl in ==> $cat_info[ID]['total']$empty_cat_ids=implode(',', $empty_cats); Nun habe ich die IDs der leeren Kategorien in einem Array und einem String. Außerdem sogar noch die Anzahl der enthaltenen Artikel pro Kategorie, die ich so SQL-kosteneffizient wieder ausgeben könnte (wenn ich wollte). Den String $empty_cat_ids will ich nun einfach in die SQLs bringen, die die Kategorien selektieren: Einfachsten falls nutze ich dazu die Group-Check-Bedingung in /templates/EyeCandy/source/classes/CategoriesBox.inc.php PHP: ...if (GROUP_CHECK == 'true'){ $group_check = " AND c.group_permission_".$_SESSION['customers_status']['customers_status_id']."=1 ";}if (!empty($GLOBALS['empty_cat_ids'])) { $group_check.=" AND c.categories_id NOT IN (".$GLOBALS['empty_cat_ids'].") ";}... ...und füge meine Bedingung danach ein (2x in der Datei - überall, wo Kategorien selektiert werden mit Group-Check). Damit wird das "klassische" Kategoriemenu schon eingeschränkt. Um das "moderene" Menu anzupassen geht man entsprechend in der Datei /system/controls/CategoriesAgent.inc.php vor und sucht sich die 2 Stellen mit dem Group-Check. Vielleicht nicht die eleganteste Lösung, aber überschaubar und effektiv Meinungen? Anregungen? Fehler? Grüße, Stefan
Hallo Stefan, steh´ grad a´bisserl auf´m Schlauch! Leere Kategorien werden doch ohnehin nicht angezeigt!? <grübel ON>
Das wäre aber vielleicht ein Lösungsansatz für die "Hersteller". Das nervt nämlich schon, wenn man die Hersteller anklicken kann obwohl momentan kein Artikel verfügbar ist.
Hmmm... Liegt das vielleicht daran, dass die Datenbank von extern befüllt wurde und nicht über den Shop-Adminbereich? Aber wenn ich im Gambio-Testshop (http://www.gambio-shop.de/shop1) eine neue Kategorie anlege, wird die auch angezeigt, obwohl keine Artikel drin sind Grüße, Stefan
also, wenn ich nicht irre, habe ich so die dunkle Erinnerung, dass man im Adminbereich einstellen kann, ob leere Kategorien angezeigt werden sollen oder nicht...[grübel]