Artikelliste wird kürzer (Modul von Andreas Kummer)

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

Artikelliste wird kürzer (Modul von Andreas Kummer)

Beitrag von pinkernell »

In der Hoffnung um Hilfe:

Die Startseite auf unserer Site listet mittels der Artikelliste von Andreas die neuesten Artikel der gesamten Site auf, und zwar immer zehn Artikel pro Seite bis zur Ebene -2.

Diese Liste wird ohne mein Zutun kürzer. Das liegt vermutlich daran, dass wir außerdem einen Terminkalender drin haben, dessen einzelne Terminartikel keine Headline haben aber dennoch in der Artikelliste auftauchen, und zwar als leere Einträge. Man sieht also nix; sichtbar ist derzeit nur noch ein Artikel.

Kann man irgendwie die Unterkategorie "Termine" aus der Artikelliste ausschließen? Es wäre schön, wenn mir jemand helfen könnte, Danke!

Guido

Das Terminübersichtsmodul sieht so aus:

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     w3concepts_alist_v1
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts
* Created     :     06-05-2004
* Modified    :     06-05-2004
************************************************/

    // konfiguration

    $categorie = "CMS_VALUE[0]";

    $angezeigte_anzahl = "CMS_VALUE[1]";
    if ($angezeigte_anzahl == '') $angezeigte_anzahl = 10;

    $startartikel = "CMS_VALUE[2]";
    if ($startartikel == '') $startartikel = false;

    $subheadline = "CMS_VALUE[3]";
    if ($subheadline == '') $subheadline = 200;

    $navigationslink['previous'] = "CMS_VALUE[4]";
    if ($navigationslink['previous'] == '') $navigationslink['previous'] = '[:: rückwärts ]';

    $navigationslink['next'] = "CMS_VALUE[5]";
    if ($navigationslink['next'] == '') $navigationslink['next'] = '[ vorwärts ::]';

    $ebene = "CMS_VALUE[6]";

    $limit = (isset($_GET['displaylimit']) && $_GET['displaylimit'] > 0)?($_GET['displaylimit']):(0);

    $db = new DB_Contenido;
    $db2 = new DB_Contenido;

    // wenn startartikel true ist, werden die startartikel dargestellt, sonst nicht
    $nurstartartikel = ($startartikel)?(''):('AND d.is_start = 0');

    // 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
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ";
            $sql_2 = "
                SELECT c.idcat, d.idart, e.idartlang, e.created, DATE_FORMAT(e.created,'%d.%m.%y') AS erstellungsdatum
                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
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ORDER BY e.created DESC
                LIMIT $limit, $angezeigte_anzahl
                ";
            break;
        case -1:
            $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 b.idcat = d.idcat
                LEFT JOIN {$cfg['tab']['art_lang']} AS e ON d.idart = e.idart
                WHERE
                    (
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ";
            $sql_2 = "
                SELECT c.idcat, d.idart, e.idartlang, e.created, DATE_FORMAT(e.created,'%d.%m.%y') AS erstellungsdatum
                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.idcat = b.idcat
                            AND b.parentid = a.idcat
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ORDER BY e.created DESC
                LIMIT $limit, $angezeigte_anzahl
                    ";
            break;
        case 0:
            $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 b.idcat = d.idcat
                LEFT JOIN {$cfg['tab']['art_lang']} AS e ON d.idart = e.idart
                WHERE
                    (
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ";
            $sql_2 = "
                SELECT c.idcat, d.idart, e.idartlang, e.created, DATE_FORMAT(e.created,'%d.%m.%y') AS erstellungsdatum
                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.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ORDER BY e.created DESC
                LIMIT $limit, $angezeigte_anzahl
                    ";
            break;
    }

    $db->query($sql_1);
    $db->next_record();
    $anzahl_artikel = $db->f("anzahl");

    $db->query($sql_2);

    echo '<p><table border="0" cellpadding="5" cellspacing="0" style="width:100%">';

    while ($db->next_record()) {
        
        $sql = "
            SELECT value FROM {$cfg['tab']['content']}
            WHERE
            idartlang = ".$db->f("idartlang")."
            AND idtype = 1
            ORDER BY typeid ASC
            ";

        $db2->query($sql);
        $db2->next_record();

        $link = $sess->url("front_content.php?client=$client&lang=$lang&idcat=".$db->f("idcat")."&idart=".$db->f("idart"));

        if (strlen($db2->f("value")) > 1) {
        echo "<tr><td valign=\"top\" class=\"liste_2\"><p><a href=\"$link\">".urldecode($db2->f("value"))."</a><p></td>";
        $db2->next_record();

        // die subheadline auf die gewünschte länge reduzieren (trennung nur
        // nach bzw. vor einem ganzen wort
        if (strlen($db2->f("value")) > $subheadline) {
            $newsubheadline = '';
            $worte = explode (" ",strip_tags(urldecode($db2->f("value"))));
            $zulang = false;
            foreach ($worte as $wort) {
                if (strlen($newsubheadline." ".$wort) >= $subheadline) $zulang = true;
                $newsubheadline = (!$zulang)?($newsubheadline." ".$wort):($newsubheadline);
            }
            $newsubheadline .= "...";
        } else {
            $newsubheadline = strip_tags(urldecode($db2->f("value")));
        }

        echo "<td class=\"liste_2\" valign=\"top\"><p>$newsubheadline</p></td></tr>";
        

        }

    }

    echo '</table>';

    if ($limit > 0 || $anzahl_artikel > $limit + $angezeigte_anzahl) {
        echo '<table cellpadding="0" cellspacing="0" style="width:100%"><tr>';
        if ($limit > 0) {
            $displaylimit = ($limit - $angezeigte_anzahl >= 0)?($limit - $angezeigte_anzahl):(0);
            echo "<td style=\"text-align:left\"><a href=\"".$sess->url("front_content.php?client=$client&lang=$lang&idcat=$idcat&idart=$idart&displaylimit=$displaylimit")."\">{$navigationslink['previous']}</a></td>";
        } else {
            echo '<td>&nbsp;</td>';
        }
        if ($anzahl_artikel > $limit + $angezeigte_anzahl) {
            $displaylimit = $limit + $angezeigte_anzahl;
            echo "<td style=\"text-align:right\"><a href=\"".$sess->url("front_content.php?client=$client&lang=$lang&idcat=$idcat&idart=$idart&displaylimit=$displaylimit")."\">{$navigationslink['next']}</a></td>";
        } else {
            echo '<td>&nbsp;</td>';
        }
        echo '</tr></table></p>';
    }

?>
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

hallo pinkernell

ja, du kannst einen bestimmten bereich ausklammern. zuerst muss du herausfinden, welche id die unterkategorie hat, die du gerne ausklammern möchtest.

wenn du die id kennst, kannst dü überall dort, wo jetzt...

Code: Alles auswählen

AND b.parentid = a.idcat
steht, zusätzlich noch...

Code: Alles auswählen

AND b.parentid != 27
einfügen. wobei die 27 durch die id der unterkategorie zu ersetzen ist, die du gerne nicht aufgelistet haben möchtest.

ich habe es selber noch nicht ausprobiert, aber ich denke, so sollte es funktionieren.

eine andere möglichkeit - und ich denke letztlich die elegentere - wäre, wenn du die kategorie mit den terminen, gänzlich ausserhalb des navigationsbaumes unterbringen würdest. du kannst ja dann immer noch einen punkt in der navigation haben, der eine weiterleitung zu den terminen vornimmt.

ich habe das selber bei den news so gemacht. das ist viel einfacher, als die einzelnen module anzupassen. vor allem wenn du bedenkst, dass du vielleicht später an anderer stelle wieder einen bereich hast, denn du ausgeklammert haben möchtest.

gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
pinkernell
Beiträge: 57
Registriert: Mo 3. Mai 2004, 08:19
Kontaktdaten:

Beitrag von pinkernell »

kummer hat geschrieben:hallo pinkernell
eine andere möglichkeit - und ich denke letztlich die elegentere - wäre, wenn du die kategorie mit den terminen, gänzlich ausserhalb des navigationsbaumes unterbringen würdest. du kannst ja dann immer noch einen punkt in der navigation haben, der eine weiterleitung zu den terminen vornimmt.
Habe das gerade ausprobiert. Leider schliesst sich dann im Menü wieder die urspüngliche "Termine"-Kategorie, wenn man den dortigen Startartikel als Weiterleitung auf eine Seite definiert, die nicht im Hauptkategorienbaum sich befindet.

Bislang habe ich es so gehalten, dass dem Besucher immer klar ist, wo er sich gerade befindet. Z.B. kann er das daran erkennen, dass das Hauptmenü sich an der entsprechenden Stell geöffnet hat.

Das wird mit den Terminen nicht möglich sein, wenn die sich außerhalb des Hauptkategorienbaums sich befinden. Ich versuche daher besser Deinen ersten Vorschlag. Danke!

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

Beitrag von pinkernell »

kummer hat geschrieben:hallo pinkernell

ja, du kannst einen bestimmten bereich ausklammern. zuerst muss du herausfinden, welche id die unterkategorie hat, die du gerne ausklammern möchtest.

wenn du die id kennst, kannst dü überall dort, wo jetzt...

Code: Alles auswählen

AND b.parentid = a.idcat
steht, zusätzlich noch...

Code: Alles auswählen

AND b.parentid != 27
einfügen. wobei die 27 durch die id der unterkategorie zu ersetzen ist, die du gerne nicht aufgelistet haben möchtest.
So. Das habe ich jetzt mal befolgt, aber leider will's das nicht tun. Habe dies für verschiedene KategorienIDs ausprobiert, aber es verschwinden keine entsprechenden Artikel aus der Artikelliste. Hm.

Ich liste mal den von mir veränderten Code für "Case -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
                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 b.parentid != 31
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                            AND b.parentid != 31
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ";
            $sql_2 = "
                SELECT c.idcat, d.idart, e.idartlang, e.created, DATE_FORMAT(e.created,'%d.%m.%y') AS erstellungsdatum
                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 b.parentid != 31
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                            AND b.parentid != 31
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                        )
                    )
                    AND a.idcat = $categorie
                    AND e.online = 1
                    AND e.redirect = 0
                    AND e.external_redirect = 0
                    $nurstartartikel
                ORDER BY e.created DESC
                LIMIT $limit, $angezeigte_anzahl
                ";
            break;
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

probier mal, im dritten block...

Code: Alles auswählen

AND b.parentid != 31
auch noch einzufügen. möglicherweise liegen die termine ja bereits in der ersten ebene.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
pinkernell
Beiträge: 57
Registriert: Mo 3. Mai 2004, 08:19
Kontaktdaten:

Beitrag von pinkernell »

Mit "drittem Block" meinst Du vermutlich nach den beiden "WHERE" die dritte Bedingung hier:

Code: Alles auswählen

WHERE
                    (
                        (
                            c.parentid = b.idcat
                            AND b.parentid = a.idcat
                            AND b.parentid != 31
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.parentid = a.idcat
                            AND b.parentid != 31
                        )
                        OR
                        (
                            c.idcat = b.idcat
                            AND b.idcat = a.idcat
                            AND b.parentid != 31
                        )
                    ) 
Leider tut's das nicht.

Eine andere Idee:

Könnte man nicht dort, wo die Tabellenzeile geschrieben wird, eine Bedingung einfügen, dass die Headline einen Eintrag haben muss? Mir scheint, dass eine solche Bedingung auch eingefügt ist. Siehe hier erste Zeile:

Code: Alles auswählen

        if (strlen($db2->f("value")) > 1) {
        echo "<tr><td valign=\"top\" class=\"liste_2\"><p><a href=\"$link\">".urldecode($db2->f("value"))."</a><p></td>";
        $db2->next_record();

        // die subheadline auf die gewünschte länge reduzieren (trennung nur
        // nach bzw. vor einem ganzen wort
        if (strlen($db2->f("value")) > $subheadline) {
            $newsubheadline = '';
            $worte = explode (" ",strip_tags(urldecode($db2->f("value"))));
            $zulang = false;
            foreach ($worte as $wort) {
                if (strlen($newsubheadline." ".$wort) >= $subheadline) $zulang = true;
                $newsubheadline = (!$zulang)?($newsubheadline." ".$wort):($newsubheadline);
            }
            $newsubheadline .= "...";
        } else {
            $newsubheadline = strip_tags(urldecode($db2->f("value")));
        }

        echo "<td class=\"liste_2\" valign=\"top\"><p>$newsubheadline</p></td></tr>";  

        }
Trotzdem werden auch die Termine mit leeren Headlines geschrieben. Ist mir unverständlich.
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

die idee ist grundsätzlich gar nicht schlecht. mir hätte es zwar aus rein puristischen gründen besser zugesagt, die resultate dieser einträge gar nicht erst zu fetchen. allerdings ist die hauptsache die, dass es funktioniert.

dass es bei dir nicht funzt, liegt daran, dass die headline häufig (hängt vom browser ab) nicht leer ist, sondern noch html-tags enthält. ich muss z.b. immer in die html-anzeige wechseln und die html-tags löschen, wenn ich sicher sein will, dass die headline nichts enthält. das liegt am online-editor.

du müsstest mit strip_tags() die htmltags entfernen und mit trim() whitespace entfernen. was dann noch bleibt ist entweder nichts (wenn die headline leer war) oder eben mehr als ein zeichen.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer »

also, ich habe die lösung:

Code: Alles auswählen

WHERE
	(
		(
			c.parentid = b.idcat
			AND b.parentid = a.idcat
			AND b.parentid != 31
			AND b.idcat != 31
		)
		OR
		(
			c.idcat = b.idcat
			AND b.parentid = a.idcat
			AND b.parentid != 31
			AND b.idcat != 31
		)
		OR
		(
			c.idcat = b.idcat
			AND b.idcat = a.idcat
			AND b.idcat != 31
		)
	)
ich habe es so ausprobiert und es funktioniert.

ich hoffe mal, bei dir tut es das auch.

gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
pinkernell
Beiträge: 57
Registriert: Mo 3. Mai 2004, 08:19
Kontaktdaten:

Beitrag von pinkernell »

Hallo Andreas,

es tut mir leid, Dich noch einmal ansprechen zu müssen. Es tut's immer noch nicht. Vielleicht brauchst Du doch noch den Hinweis, dass die Terminartikel in einer Kategorie der Ebene -1 liegen, die Artikelliste aber aus einer Kategorie der Ebene 0 alle Kategorien bis zur Ebene -2 ausliest.

Ich würde gerne selbst die Programmierung austüfteln, kann aber nicht herausfinden, welche Bedeutung die Variablen a.parentid, b.parentid, c.parentid und a.idcat, b.idcat, c.idcat haben. Hat wohl was mit den verschiedenen Ebenen zu tun, aber welche Reihenfolge? Und "parent..."?

Danke nochmals für Deine geduldige Hilfe!

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

Beitrag von pinkernell »

So ich hab's: Andreas hatte im Prinzip recht, allerdings mussten die Variablen so abgeändert werden, dass der Inhalt der Kategorie 6 in der zweiten Ebene nicht gelesen wird:

Code: Alles auswählen

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
                        )
                    )
Danke, Andreas, für die Hilfe!

Guido
Gesperrt