Modifikation: Leere Kategorien nicht anzeigen

Thema wurde von Speed4Trade, 21. September 2012 erstellt.

  1. Speed4Trade

    Speed4Trade Mitglied

    Registriert seit:
    14. Juli 2011
    Beiträge:
    11
    Danke erhalten:
    1
    Danke vergeben:
    2
    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
     
  2. Manni_HB

    Manni_HB G-WARD 2012/13/14/15

    Registriert seit:
    26. April 2011
    Beiträge:
    9.098
    Danke erhalten:
    1.540
    Danke vergeben:
    909
    Ort:
    Bremen
    Hallo Stefan,

    steh´ grad a´bisserl auf´m Schlauch! :(
    Leere Kategorien werden doch ohnehin nicht angezeigt!? <grübel ON>
     
  3. sileo

    sileo Erfahrener Benutzer

    Registriert seit:
    22. März 2012
    Beiträge:
    2.266
    Danke erhalten:
    274
    Danke vergeben:
    205
    Jo, bei uns ist das auch so. Kein Artikel - keine Kategorie
     
  4. Petra

    Petra G-WARD 2013/14/15

    Registriert seit:
    27. August 2011
    Beiträge:
    6.998
    Danke erhalten:
    1.225
    Danke vergeben:
    227
    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.
     
  5. Speed4Trade

    Speed4Trade Mitglied

    Registriert seit:
    14. Juli 2011
    Beiträge:
    11
    Danke erhalten:
    1
    Danke vergeben:
    2
    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
     
  6. Gerd Schoolmann

    Gerd Schoolmann Erfahrener Benutzer

    Registriert seit:
    23. August 2012
    Beiträge:
    165
    Danke erhalten:
    23
    Danke vergeben:
    21
    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]