Artikelliste w3concepts_alist_v1: Auch dritte Ebene auslesen

Gesperrt
pinkernell
Beiträge: 57
Registriert: Mo 3. Mai 2004, 08:19
Kontaktdaten:

Artikelliste w3concepts_alist_v1: Auch dritte Ebene auslesen

Beitrag von pinkernell »

Hallo,

habe fleissig gesucht, aber zu diesem Thema nix gefunden. Vielleicht gibt's aber doch eine schnellere Lösung als dass ich mich als PHP Laie in mühevoller Kleinarbeit an den Code mache.

Das Artikellisten-Modul von w3concepts (Version 1) tut bislang gute Dienste. Unsere Site wird aber größer, und obwohl ich weiss, dass man tunlichst tiefe Kategorienbäume vermeiden sollte, lässt sich das jetzt nicht mehr umgehen. Ich habe neben den Ebenen 0, -1, -2 auch eine Ebene -3 durch die Artikelliste auszulesen. Das Modul aber liest nur bis zur Ebene -2 aus.

Im Inputbereich ist das leicht zu ändern. Was Kopfschmerzen macht ist der Outputbereich, in dem es eine Fallunterscheidung für die verschiedenen Ebenen gibt. Die sind alle recht ähnlich, so dass ich mir prinzipiell zutraue, einen weiteren Fall hinzuzufügen. Nur habe ich den Verdacht, dass - um eine Ebene -3 einzuführen - die Anzahl der definierten Variablen nicht reicht. Ich vermute, für eine Ebene -3 brauche ich (mindestens) eine Variable namens d.parentid, um den folgenden Fall case -2 auf eine case -3 umzuschreiben.

Code: Alles auswählen

    // liest die anzahl betroffener artikel aus der datenbank
    switch ($ebene) {
        case -2:
            $sql_1 = "
                SELECT count(*) AS anzahl
                FROM {$cfg['tab']['cat']} AS a,
                     {$cfg['tab']['cat']} AS b,
                     {$cfg['tab']['cat']} AS c
                LEFT JOIN {$cfg['tab']['cat_art']} AS d ON c.idcat = d.idcat
                LEFT JOIN {$cfg['tab']['art_lang']} AS e ON d.idart = e.idart
                WHERE
                    (
                        (
                            c.parentid = b.idcat
                            AND b.parentid = a.idcat
                            AND c.parentid != 6  AND c.idcat != 6
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                            AND c.parentid != 6  AND c.idcat != 6
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                            AND c.idcat != 6
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ";
Vielleicht hat jemand das schon gemacht, oder bestätigt mich zumindest in meiner Annahme. Dann setze ich mich nochmal in Ruhe ran.

Guido
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

meinst du das modul ?
-> http://w3concepts.net/1/1/51/87.html

müsste kummer was dazu sagen... ich hab dafür keine schnelle lösung da man sich die sql queries genauer ansehen müsste...
*** make your own tools (wishlist :: thx)
pinkernell
Beiträge: 57
Registriert: Mo 3. Mai 2004, 08:19
Kontaktdaten:

Beitrag von pinkernell »

Ja, das ist das Modul. Ich habe es für meine Zwecke an der einen oder anderen Stelle abgeändert. Das Auslesen der Ebenen 0, -1 und -2 erfolgt allerdings wie im Originalcode.

Vielleicht kann ja Andreas oder andere Kundige meine Modifikationsidee kommentieren. Ich lerne gerne dazu.

Meine Idee, den Outputcode für das Auslesen einer Ebene -3 abzuändern, orientiert sich am Code für das Auslesen der Ebene -2:

Code: Alles auswählen

switch ($ebene) {
        case -2:
            $sql_1 = "
                SELECT count(*) AS anzahl
                FROM {$cfg['tab']['cat']} AS a,
                     {$cfg['tab']['cat']} AS b,
                     {$cfg['tab']['cat']} AS c
Füge hier eine analoge Zeile für "AS d" ein. Und ersetze im folgenden "e" für "d", und "f" für "e".

Code: Alles auswählen

                LEFT JOIN {$cfg['tab']['cat_art']} AS d ON c.idcat = d.idcat
                LEFT JOIN {$cfg['tab']['art_lang']} AS e ON d.idart = e.idart
                WHERE
                    (
Hier nun einen vierten "OR"-Fall vor die folgenden drei "OR"-Fälle stellen. Wie der aussehen soll, weiss ich noch nicht. Auf jeden Fall muss da ein "d.parentid" drin vorkommen. Evtl. müssen auch die nachfolgenden "OR"-Fälle geändert werden. [Zusatz etwas später:] Hierzu muss man sagen, dass der Code für das Auslesen der Ebene -1 und Ebene 0 jeweils sukzessive einen "OR"-Fall weniger hat, und auch die "a", "b", "c" etc Variablenkürzel auf eine gewisse Weise zyklisch ausgetauscht werden. Mir scheint also, der Code lässt sich durchaus mit etwas "logischem Denken" für meine Zwecke modifizieren.[/Zusatz]

Code: Alles auswählen

                        (
                            c.parentid = b.idcat
                            AND b.parentid = a.idcat
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
Im nachfolgenden Code "f" für "e" setzen.

Code: Alles auswählen

                   AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    AND e.idlang = $lang
                    $nurstartartikel
                ";

Dies war nur ein Ausschnitt aus dem Originalcode, der im weiteren ähnliche bzw. analoge Fallunterscheidungen enthält. Wenn ich das hier hinkriege, dürfte der Rest kein Problem sein.

Vielleicht ist das aber alles zu hoch für mich. Dann bitte ich demütig um eine fertige Lösung ;)

Guido
Gesperrt