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
    Ein Beispiel:
    Es gibt Kategorie1 in welcher sich die beiden Unterkategorien Unterkategorie1-1 und Unterkategorie1-2 befinden

    In Kategorie1 befindet sich kein Produkt
    in Unterkategorie1-1 und Unterkategorie1-2 befindet sich jeweils das selbe Produkt welches in beiden Unterkategorien verlinkt ist.

    Nun wird bei Kategorie1 (2) angezeigt obwohl es eigentlich nur 1 Produkt gibt.

    Ich denke dass ist eigentlich ein Bug, vielleicht ist es aber auch so gewollt. Jedenfalls möchte ich es bei uns abändern. Kann man das so abändern das doppelt verlinkte Artikel nur 1x gezählt werden?

    Linkback: https://www.modified-shop.org/forum/index.php?topic=41358.0

    bautti

    • Fördermitglied
    • Beiträge: 218
    Keiner eine Idee wie man das umbauen könnte?

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Ja, das ist ein Bug, wenn man so will (könnte man auch anders sehen).
    Es liegt an der Funktion xtc_count_products_in_category() in /inc/xtc_count_products_in_category.inc.php die zum Zählen der Produkte benutzt wird.
    Mache dazu bitte ein Ticket auf.

    Ich denke, daß auch die Rekursion in der genannten Funktion nicht nötig ist weil bereits alle Kategorien, auch Sub-Kategorien, nach der ersten Query im Array $products_in_category_array vorhanden sind.

    Löung für dich könnte sein:
    Erstelle eine eigene Datei als Kopie der genannten Funktion und lege sie in /templates/DEIN_TEMPLATE/source/inc/.
    Benenne die Datei und die Funktion allerdings um, z.B. custom_count_prods_in_cats() bzw. custom_count_prods_in_cats.inc.php und ändere sie wie folgt:

    Code: PHP  [Auswählen]
    <?php
    /**************************************************************************************
    * file: custom_count_prods_in_cats.inc.php
    * path: /templates/MY_TEMPLATE/source/inc/
    * use: replace /inc/xtc_count_products_in_category.inc.php
    *      which is buggy and counts in main and in sub-cats linked products muliple times
    *
    * (c) copyright GTB, reworked by noRiddle 10-2020
    **************************************************************************************/

       
      function custom_count_prods_in_cats($category_id, $include_inactive = false) {
        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());

     
          // check sub categories          
          $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)) {
              $products_count_array[$active][$category_id] = array_merge($products_count_array[$active][$category_id], $products_in_category_array[$active][$child_categories['categories_id']]);
            }
          }
        }

        $products_count_array[$active][$category_id] = array_unique($products_count_array[$active][$category_id]);

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

    Außerdem mußt du dann in /templates/DEIN_TEMPLATE/inc/xtc_show_category.inc.php das
    Code: PHP  [Auswählen]
    $products_in_category = xtc_count_products_in_category($counter);

    hiermit ersetzen
    Code: PHP  [Auswählen]
    //$products_in_category = xtc_count_products_in_category($counter);
    $products_in_category = custom_count_prods_in_cats($counter); //use my own function, 10-2020, DEIN_KÜRZEL

    und in /templates/DEIN_TEMPLATE/source/boxes/categories.php das
    Code: PHP  [Auswählen]
    require_once (DIR_FS_INC.'xtc_count_products_in_category.inc.php');

    hiermit ersetzen
    Code: PHP  [Auswählen]
    //require_once (DIR_FS_INC.'xtc_count_products_in_category.inc.php');
    require_once (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/inc/custom_count_prods_in_cats.inc.php'); //use my own function, 10-2020, DEIN_KÜRZEL

    Die von mir gepostete neue Funktion vermeidet die Rekurison (weniger Funktionsaufrufe und somit Queries) und zählt in Sub-Kategorien verlinkte Produkte die sich auch in der Hauptkategorie befinden nicht doppelt. Sie  kann jedoch evtl. noch weiter optimiert werden. Vielleicht schaut noch jemand darauf ?

    Gruß,
    noRiddle

    *NACHTRAG*
    Ich sehe gerade, daß das so auch noch nicht ganz okay ist. Für die Hauptkategorien ist es okay, nicht jedoch für Unterkategorien. Schaue mir das später nochmals an...

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Funktioniert doch so wie gepostet. Teste mal.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Was ist denn nun, Mr. bautti ?
    Mich interessiert, ob wir dafür ein Ticket aufmachen sollen und ob mein Vorschlöag funktioniert.

    Gruß,
    noRiddle

    bautti

    • Fördermitglied
    • Beiträge: 218
    Entschuldigung für die späte Rückmeldung. Hab ein paar Tage nicht hier nachgeschaut und hab auch nicht gedacht dass ich noch eine Antwort erhalte und die Angelegenheit schon abgehakt und die Anzeige der Artikelanzahl deaktiviert gehabt.

    Vielen Dank für die Mühe die du dir gemacht hast. Ich werde es nächste Woche testen.  Bzw. Ein Programmierer welcher für mich immer solche Änderungen am Shop vornimmt und an dieser Aufgabe schon gescheitert ist, wird es einbauen. Selber trau ich mir das nicht zu, bei uns musste auch beim Template was geändert werden da dieses die Funktion nicht unterstützt hat, und das ist inzwischen wieder rückgängig gemacht worden...

    Wenn ich es richtig verstehe sollte deine Lösung das Berechnen der Zahlen auch noch beschleunigenden, das wäre natürlich top. Die standardlösung bremst den Shop denke ich doch etwas aus.

    Ich melde mich dann natürlich und sag Bescheid ob das bei uns auch so klappt und/oder ob noch was geändert wurde.

    Montag ist bei uns Feiertag und Dienstag dann sehr stressig. Kann also etwas dauern...

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Habe dazu ein Ticket #1912 erstellt.

    Gruß,
    noRiddle

    bautti

    • Fördermitglied
    • Beiträge: 218
    Sorry das ich mich noch nicht gemeldet habe, Ich und einige Mitarbeiter sind Heimquarantäne. Hab alle Hände voll zu tun die Firma am laufen zu halten...

    bautti

    • Fördermitglied
    • Beiträge: 218
    Wir haben es jetzt so wie vin dir gepostet eingebaut. Funktioniert tadellos.

    Vielen Dank noRiddle für deine Hilfe. Ich hab schon öfters von dir Hilfe erhalten. Wirklich toll dass es hier im Forum immer noch so engagierte Mitglieder wie dich gibt.

    Und nochmals sorry wegen der späten Rückmeldung. Bei mir war wirklich Chaos, sowohl privat als auch im Betrieb...

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Alles gut, wirklich. Bin ja auch manchmal zu ungeduldig.
    Hoffe das "Chaos" hat sich zum Guten aufgelöst.

    Danke für die Rückmeldung.

    Gruß,
    noRiddle

    bautti

    • Fördermitglied
    • Beiträge: 218
    Passt inzwischen wieder alles halbwegs bei uns. Das wichtigste ist dass alle wieder gesund sind , oder zumindest nur noch ganz leichte Symptome haben....

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Achtung !
    Meine angebotene Lösung ist nicht korrekt. GTB hat das im Ticket angemahnt
    Das funktioniert nur wenn man lediglich Unterkategorien erster Ebene hat.
    Bei vorhandenen Unter-Unterkategorien werden die Artikel nicht mitgezählt.
    Es geht wohl doch nur mit Rekursion. War halt ein Schnellschuß in den Ofen.

    Habe leider gerade nicht die Zeit eine andere Lösung zu erarbeiten.
    Jemand ?

    Gruß,
    noRiddle

    bautti

    • Fördermitglied
    • Beiträge: 218
    Ich hab in meinem Shop in einer Kategorie auch Unter-Unterkategorie. Hab aber bis ich es hier gelesen habe  nicht bemerkt dass es hier nicht passt.

    Bei mir werden die Artikel in den Unter-Unterkategorien schon gezählt. Aber wie vorher bei den Unterkategorien doppelt wenn doppelt verlinkt. Ich werde es morgen nochmals genau testen, da die Zahlen nicht genau passen, wahrscheinlich sind inzwischen nicht mehr alle Arikel doppelt verlinkt...

    Deine Lösung ist auf jedenfall besser als die alte Lösung da es wenigstens bei den Shops funktioniert welche nur eine Ebene Unterkategorien haben...

    bautti

    • Fördermitglied
    • Beiträge: 218
    Ich habe noch eine Unter-Unterkatgegorie zum testen angelegt und es ist so wie ich oben geschrieben habe.

    Wenn in der Unter-Unterkategorie kein Artikel liegt hat es keine Auswirkungen
    Wenn in der Unter-Unterkategorie ein Artikel liegt (ohne zusätzlicher Verlinkung) passt alles.
    Wenn in der Unter-Unterkategorie ein Artikel liegt und dieser zusätzlich in der Unterkategorie verlinkt ist wird der Artikel sowohl in der Hauptkategorie als auch in der Unterkategorie doppelt gezählt.
    Wenn in der Unter-Unterkategorie ein Artikel liegt und dieser zusätzlich in der Unterkategorie verlinkt und zusätzlich auch noch in der Hauptkategorie verlinkt ist, wird der Artikel in der Hauptkategorie dreifach gezählt und in der Unterkategorie doppelt gezählt.

    Zum Code kann ich leider nichts beitragen....

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Du redest hier von der Default-Implementation ?, also um nochmals darzulegen was iyho verkehrt gezählt wird.
    Auf meinen Code kann sich das ja nicht beziehen...

    Wie auch GTB zum Ausdruck bringt (im Ticket) kann man das Zählen so oder so sehen, denn so wie es jetzt ist ist es ja, die Artikelzahl absolut gesehen. nicht verkehrt.
    Man muß sich fragen wozu die Anzeige der Artikelanzahl je Kategorie genau dienen soll.
    Jedenfalls kann man es mit meinem Ansatz (anderem Code) ja template-bezogen und update-sicher für sich ändern.

    Ich schaue mir das die Tage nochmals an und poste eine Lösung ggfls. dann hier.

    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