Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Artikelanzahl hinter Kategoriebezeichnung, fehlerhaft bei verlinkten Artikeln

    bautti

    • Fördermitglied
    • Beiträge: 218
    Mein Post bezieht sich schon auf deinen Code, welchen ich in meinen Shop einbauen ließ. Laut meinem Programmierer wurde der Code von dir 1 zu 1 eingebaut. Ich hab damald extra nachgefragt weil ich dir Rückmeldung geben wollte.

    Warum das Ergebnis bei mir anders als von GTB geschildert Ist kann ich nicht erklären.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Ich kann das so nicht nachvollziehen. Jedenfalls ist mein geposteter Code nicht korrekt weil er Unter-Unter-Kategorien nicht beachtet beim Zählen.
    Hier eine Variante die definitiv funktioniert:
    Code: PHP  [Auswählen]
    <?php
    /**************************************************************************************
    * file: nr_count_prods_in_cats.inc.php
    * path: /templates/MY_TEMPLATE/source/inc/
    * use: replace /inc/xtc_count_products_in_category.inc.php
    *      which counts in main and in sub-cats linked products muliple times
    *
    * (c) copyright noRiddle 10-2020
    **************************************************************************************/

       
    function nr_count_prods_in_cats($category_id, $include_inactive = false) {
        //BOC config
        $unique_prods = true; //true for counting in more than one category linked products only once, else false
        $no_sub_cats_count = false; //false for counting also products in sub-catagories, else true
        //EOC config

        static $products_count_array, $products_in_category_array;

        $active = (($include_inactive === false) ? 0 : 1);

        if (!is_array($products_count_array)) {
            $products_count_array = array();
        }

        if (!is_array($products_in_category_array)) {
            $products_in_category_array = array();
        }

        if(!isset($products_in_category_array[$active])) {
            $categories_query = xtDBquery("SELECT p2c.products_id,
                                                  p2c.categories_id
                                             FROM "
    .TABLE_PRODUCTS." p
                                             JOIN "
    .TABLE_PRODUCTS_DESCRIPTION." pd
                                               ON p.products_id = pd.products_id
                                              AND pd.language_id = '"
    .(int)$_SESSION['languages_id']."'
                                              AND trim(pd.products_name) != ''                      
                                             JOIN "
    .TABLE_PRODUCTS_TO_CATEGORIES." p2c
                                               ON p2c.products_id = p.products_id
                                            WHERE (p.products_status = '1'"
    .(($include_inactive === true) ? " OR p.products_status = '0'" : '').")
                                                  "
    .PRODUCTS_CONDITIONS_P);
            if(xtc_db_num_rows($categories_query, true)) {
                while ($categories = xtc_db_fetch_array($categories_query, true)) {
                    $products_in_category_array[$active][$categories['categories_id']][] = $categories['products_id'];
                }
            }
        }
       
        if(!isset($products_count_array[$active][$category_id])) {
            $products_count_array[$active][$category_id] = array();
            $products_count_array[$active][$category_id] = ((isset($products_in_category_array[$active][$category_id])) ? $products_in_category_array[$active][$category_id] : array());

            if(isset($no_sub_cats_count) && $no_sub_cats_count === false) {
                // check sub categories
                $all_cats_arr = explode(',', check_all_cats($category_id));
                array_shift($all_cats_arr);

                foreach($all_cats_arr as $sub_cat_id) {
                    $products_count_array[$active][$category_id] = array_merge($products_count_array[$active][$category_id], $products_in_category_array[$active][$sub_cat_id]);
                }
            }
        }

        if(isset($unique_prods) && $unique_prods === true) {
            $products_count_array[$active][$category_id] = array_unique($products_count_array[$active][$category_id]);
        }

        return count($products_count_array[$active][$category_id]);
    }

    function check_all_cats($category_id) {
        $all_cats_str = $category_id;
        $child_categories_query = xtDBquery("SELECT c.categories_id
                                               FROM "
    .TABLE_CATEGORIES." c
                                              WHERE c.parent_id = "
    .(int)$category_id."
                                                    "
    .CATEGORIES_CONDITIONS_C);
        if(xtc_db_num_rows($child_categories_query, true)) {
            while($child_categories = xtc_db_fetch_array($child_categories_query, true)) {
                $all_cats_str .= ','.check_all_cats($child_categories['categories_id']);
            }
        }

        return $all_cats_str;
    }
    ?>
     

    Im oberen Bereich der ersten Funktion kann man bei config einstellen ob mehrfach verlinkte Artikel nur einmal gezählt werden sollen. Außerdem kann man einstellen ob überhaupt die Artikel der unterkategorien mitgezählt werden sollen.

    Generell sollte man bei dieser Sache folgende Dinge bedenken:
    • kann man, wie bereits gesagt, über die Zählart der Artikel verschiedener Meinung sein.
      Ein Kunde könnte sich allgemein wundern, wenn
      • und das trifft auch auf die Standard-Implementation zu, die Artikel der Unter-Kategorien in den Überkategorien mitgezählt werden,
        denn wenn ich z.B. 13 Artikel in einer Kategorie angegeben sehe, die Kategorie öffne, dann jedoch lediglich 4 Artikel sehe, denn die restlichen 9 befinden sich in der Unter-Kategorie, die ich ja erstmal anklicken müsste um das zu sehen
        und
      • wenn mehrfach verlinkte Artikel nicht mehrfach gezählt werden,
        denn der Kunde weiß erstmal nichts von diesem Feature. Er sieht nur z.B. 5 Artikel und dann in der Unterkategorie z.B. 4 Artikel. Daß davon einer auch in der Über-Kategorie vorhanden war interessiert ih n doch eher am Rande.
      Aus diesen beiden Gründen sagte ich auch, daß man sich fragen muß wozu die Anzeige der Artikelanzahl je Kategorie genau dienen soll, will sagen, welche Information aus welchem Grund sie dem Kunden liefern soll.
    • Bei vielen Kategorien ist die Anzeige der Artikelanzahl ein Performance-Killer. Das muß immer klar sein und im jeweiligen Fall bei Bedarf ausprobiert und getestet werden.
      Zwar hat GTB in seiner ursprünglichen Implementation, und das habe ich übernommen, mittels einer static Variablen das Ergebnis der nötigen Queries quasi gecacht, trotzdem hängt es von der Anzahl der Kategorien und Artikel ab ob die Performance leidet. U.A. kann es sogar zu einer Überschreitung des Memory-Limit kommen weil das zwischengespeicherte Array bei sehr vielen Kategorien zu groß ist.

    Gruß,
    noRiddle

    bautti

    • Fördermitglied
    • Beiträge: 218
    Ich danke dir für deine  Bemühungen..

    Vielleicht liegt die Ursache für die unterschiedlichen ergebnisse hier:
    Man kann unter erweiterte Konfiguration/Artikel listen einstellen ob Artikel aus Unterkategorien angezeigt werden sollen. Ist bei mir auf ja.

    Ansonsten liegt es vielleicht an unserem Template...

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Nein, an der von dir genannten Einstellung liegt es sicher nicht.
    Weder die originale Funktion noch mein Implementations-Vorschlag berücksichtigen eine solche Abhängigkeit. Es werden schlicht alle Artikel gezählt die aktiv (= products_status 1) sind und deren Produkt-Name nicht leer ist.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Nachtrag zu meinem Vorschlag aus Antwort #16:
    Da es im Backend noch die Einstellung
    Konfiguration => Artikel Listen Optionen => "Artikel aus Unterkategorien anzeigen"
    (= CATEGORIES_SHOW_PRODUCTS_SUBCATS)
    gibt und, um die Funktion wirklich variabel zu machen, sollte man die Anzeige der Anzahl der Produkte in einer Kategorie auch von dieser Einstellung abhängig machen und sollte außerdem die Option der Config in Funktions-Parameter wandeln, sodaß die Funktion dann so aussehen könnte:
    Code: PHP  [Auswählen]
    <?php
    /**************************************************************************************
    * file: nr_count_prods_in_cats.inc.php
    * path: /templates/MY_TEMPLATE/source/inc/
    * use: replace /inc/xtc_count_products_in_category.inc.php
    *      which counts in main and in sub-cats linked products muliple times
    *
    * (c) copyright noRiddle 10-2020
    **************************************************************************************/

       
    function nr_count_prods_in_cats($category_id, $include_inactive = false, $unique_prods = true, $no_sub_cats_count = false) {
        //BOC config (put this as parameters in function, 27-12-2020, noRiddle)
        //$unique_prods = true; //true for counting in more than one category linked products only once, else false
        //$no_sub_cats_count = false; //false for counting also products in sub-catagories, else true
        //EOC config

        static $products_count_array, $products_in_category_array;

        $active = (($include_inactive === false) ? 0 : 1);

        if (!is_array($products_count_array)) {
            $products_count_array = array();
        }

        if (!is_array($products_in_category_array)) {
            $products_in_category_array = array();
        }

        if(!isset($products_in_category_array[$active])) {
            $categories_query = xtDBquery("SELECT p2c.products_id,
                                                  p2c.categories_id
                                             FROM "
    .TABLE_PRODUCTS." p
                                             JOIN "
    .TABLE_PRODUCTS_DESCRIPTION." pd
                                               ON p.products_id = pd.products_id
                                              AND pd.language_id = '"
    .(int)$_SESSION['languages_id']."'
                                              AND trim(pd.products_name) != ''                      
                                             JOIN "
    .TABLE_PRODUCTS_TO_CATEGORIES." p2c
                                               ON p2c.products_id = p.products_id
                                            WHERE (p.products_status = '1'"
    .(($include_inactive === true) ? " OR p.products_status = '0'" : '').")
                                                  "
    .PRODUCTS_CONDITIONS_P);
            if(xtc_db_num_rows($categories_query, true)) {
                while ($categories = xtc_db_fetch_array($categories_query, true)) {
                    $products_in_category_array[$active][$categories['categories_id']][] = $categories['products_id'];
                }
            }
        }
       
        if(!isset($products_count_array[$active][$category_id])) {
            $products_count_array[$active][$category_id] = array();
            $products_count_array[$active][$category_id] = ((isset($products_in_category_array[$active][$category_id])) ? $products_in_category_array[$active][$category_id] : array());

            if($no_sub_cats_count === false || ($no_sub_cats_count === true && CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true')) {
                // check sub categories
                $all_cats_arr = explode(',', check_all_cats($category_id));
                array_shift($all_cats_arr);

                foreach($all_cats_arr as $sub_cat_id) {
                    $products_count_array[$active][$category_id] = array_merge($products_count_array[$active][$category_id], $products_in_category_array[$active][$sub_cat_id]);
                }
            }
        }

        if($unique_prods === true || CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true') {
            $products_count_array[$active][$category_id] = array_unique($products_count_array[$active][$category_id]);
        }

        return count($products_count_array[$active][$category_id]);
    }

    function check_all_cats($category_id) {
        $all_cats_str = $category_id;
        $child_categories_query = xtDBquery("SELECT c.categories_id
                                               FROM "
    .TABLE_CATEGORIES." c
                                              WHERE c.parent_id = "
    .(int)$category_id."
                                                    "
    .CATEGORIES_CONDITIONS_C);
        if(xtc_db_num_rows($child_categories_query, true)) {
            while($child_categories = xtc_db_fetch_array($child_categories_query, true)) {
                $all_cats_str .= ','.check_all_cats($child_categories['categories_id']);
            }
        }

        return $all_cats_str;
    }
    ?>

    So wird kein Kunden verwirrt durch das was ich in Antwort #16 aufgezählt habe.

    Gruß,
    noRiddle
    5 Antworten
    2953 Aufrufe
    28. Oktober 2014, 13:46:52 von ams
    2 Antworten
    2948 Aufrufe
    06. November 2009, 13:00:30 von Tomcraft
    9 Antworten
    5830 Aufrufe
    28. November 2009, 20:08:58 von Tomcraft
    5 Antworten
    2062 Aufrufe
    24. September 2019, 10:35:51 von manne35