SQL-Abfrage um Template-ID erweitern

Gesperrt
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

SQL-Abfrage um Template-ID erweitern

Beitrag von derSteffen »

Hallo Community,

ich habe folgende SQL-Abfrage

Code: Alles auswählen

    $sql = "SELECT ARTLANG.idart, ARTLANG.title, CATART.idcat, ARTLANG.created
    FROM ".$cfg["tab"]["cat_art"]." AS CATART, ".$cfg["tab"]["art_lang"]." AS ARTLANG, ".$cfg["tab"]["cat"]." AS CAT
    WHERE CAT.idcat='$idcat'
    AND ARTLANG.idart = CATART.idart
    AND ARTLANG.idlang = '$lang'
    AND ARTLANG.online = '1'
    ORDER BY ".$sortiert." ".$steigung; 
welche alle Artikel der Webseite auflistet, allerdings sollen nur Artikel mit einem bestimmten Template angeziegt werden, bzw. nicht angezeigt werden.

Die Template-ID befindet sich ja in den Tabellen "con_template" und "con_template_conf". Die einzigeste Verbindung zwischen den Artikel und den Template befindet sich z.Z. in der "con_art_lang" mit der "idtplcfg".

Also muss ich doch wahrscheinlich erst die "idtplcfg" mit der "idtpl" vergleichen, oder?
Muss ich denn schon bei der SELECT-Abfrage neue "Parameter" hinzufügen? Wie z.B. TEMPLATE.idtpl und dann bei der "FROM"-Abfrage so etwas wie ".$cfg["tab"]["template"]." AS TEMPLATE?

Vielen Dank

Mit freundlichem Gruß

Steffen
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: SQL-Abfrage um Template-ID erweitern

Beitrag von Spider IT »

Hallo Steffen,

deine Abfrage beinhaltet schon jetzt ein Fehler: Die Tabelle CAT ist mit keine andere verknüpft und gibt kein Feld aus, wird aber bei den Kriterien eingesetzt.

Ordentlich umgebaut wird deine Abfrage (mit Erweiterung) so aussehen (nicht getestet):

Code: Alles auswählen

$sql = 'SELECT al.idart, al.title, cl.idcat, al.created
        FROM ' . $cfg['tab']['cat_art'] . ' AS ca INNER JOIN ' . $cfg['ta']['art_lang'] . ' AS al ON ca.idart = al.idart INNER JOIN ' . $cfg['tab']['tpl_conf] . ' AS tc ON al.idtplcfg = tc.idtplcfg
        WHERE ((ca.idcat=' . $idcat . ')
           AND (al.idlang=' . $lang . ')
           AND (al.online=1)
           AND (tc.idtpl=' . $TemplateID . '))
        ORDER BY ' . $sortiert . ' ' . $steigung;
Aber damit is es nicht getan, denn Artikel müssen kein eigenes Template haben.
Wenn du aber sicher bist, dass die Artikel selbst ein Template zugewiesen bekommen, kannst du das so nutzen.
Die Variable $TemplateID musst du natürlich vorher richtig einstellen ;)
Und anstatt tc.idtplcfg= kannst du natürlich auch tc.idtplcfg<> machen, oder sogar mit tc.idtplcfg IN ( eine Auflistung (mit Komma getrennt) übergeben (NOT IN für das Gegenteil der Liste) (schließende Klammer nicht vergessen).

Gruß
René
derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Re: SQL-Abfrage um Template-ID erweitern

Beitrag von derSteffen »

Hallo Rene, vielen Dank für den Code, da waren zwei Tipp-Fehler im Code (hier ohne Tippfehler)

Code: Alles auswählen

$sql = 'SELECT al.idart, al.title, cl.idcat, al.created
FROM ' . $cfg['tab']['cat_art'] . ' AS ca INNER JOIN ' . $cfg['tab']['art_lang'] . ' AS al ON ca.idart = al.idart INNER JOIN ' . $cfg['tab']['tpl_conf'] . ' AS tc ON al.idtplcfg = tc.idtplcfg
WHERE ((ca.idcat=' . $idcat . ')
AND (al.idlang=' . $lang . ')
AND (al.online=1)
AND (tc.idtpl=' . $TemplateID . '))
ORDER BY ' . $sortiert . ' ' . $steigung;
Aber trotzdem wird jetzt gar nichts angezeigt.

Ich möchte nämlich die SQL-Abfrage in das Modul Blättern einbauen, das habe ich dazu angepasst und funkttioniert mit meiner SQL-Abfrage wie gewünscht, allerdings kann man sich hierbei duch alle Artikle der Webseite klicken (wie gewünscht) und jeder Artikel bekommt auch ein Template, allerdings sollen aber z.B. alle Artikel mit dem Template "Formular" oder "Sitemap" etc. nicht mit aufgeführt werden. Schön wäre auch noch wenn man später einige Artikl manuell mit der idart ebenfalls herusnehmen kann.

Das ist so das Ziel.

Hier noch mal das Modul mit meiner SQL-Abfrage, dass so funktioniert, nur das ich keine Template ausschließen kann, und spezielle Artikel mit der idart.

Code: Alles auswählen

<?php

    /***********************************************
    * CONTENIDO MODUL - OUTPUT
    *
    * Modulname   :     artikellaettern
    * Author      :     smac
    * Created     :     21-09-2006
    * Created     :     21-09-2006
    ************************************************/

    $anzahl = "CMS_VALUE[1]";
    $platzhalter = "CMS_VALUE[2]";
    $zurueck = "CMS_VALUE[3]";
    $weiter = "CMS_VALUE[4]";
    $sortiert = "CMS_VALUE[5]";
    $steigung = "CMS_VALUE[6]";

    if ($anzahl=="") $anzahl = 1;
    if ($platzhalter=="") $platzhalter = "...";
    if ($zurueck=="") $zurueck = "zurueck";
    if ($weiter=="") $weiter = "weiter";
    if ($sortiert=="") $sortiert = "ARTLANG.artsort";
    if ($steigung=="") $steigung= "ASC";



$sql = "SELECT ARTLANG.idart, ARTLANG.title, CATART.idcat, ARTLANG.created
    FROM ".$cfg["tab"]["cat_art"]." AS CATART, ".$cfg["tab"]["art_lang"]." AS ARTLANG, ".$cfg["tab"]["cat"]." AS CAT
    WHERE CAT.idcat='$idcat'
    AND ARTLANG.idart = CATART.idart
    AND ARTLANG.idlang = '$lang'
    AND ARTLANG.online = '1'
    ORDER BY ".$sortiert." ".$steigung;  


    $db->query($sql);
    if ($db->num_rows() != 0)
    {
   // echo "<div class=\"indexnavigation\">";
    $artikel = array(array());
    $j=0;
    $db->next_record();
    $idart_last=$db->f("idart");
    for ($i=0; $i<$db->num_rows(); $i++)
    {
    $artikel[$j][0] = $db->f("idart");
    $artikel[$j][1] = $db->f("idcat");

    $type = $db->f("idtype");
    $typeid = $db->f("typeid");

    while ( $idart_last==$db->f("idart") )
    {
    $idart_last=$db->f("idart");
    $db->next_record();
    $i++;
    }

    $idart_last=$db->f("idart");
    $j++;
    $i--;
    }

    // Nicht ausgeben, wenn nur eine Seite existiert...


    // Zurückblättern
    for ($i=0; $i < $j; $i++)
    {
       if ($idart==$artikel[$i][0] && $i!=0) {
          $x = $i-1;
          $zurueck_link ="front_content.php?client=$client&lang=$lang&idcat=".$artikel[$x][1]."&idart=".$artikel[$x][0];
          echo "<link rel=\"next\" href=\"".$sess->url("$zurueck_link")."\" />\n";
       }
    }


    // Zahlen und Platzhalter
    /* for ($i=0; $i < $j; $i++)
    {

       $k = $i+1;
       
       $navmod_link ="front_content.php?client=$client&lang=$lang&idcat=".$artikel[$i][1]."&idart=".$artikel[$i][0];

       if ($idart!=$artikel[$i][0]) {
          if ( $k <= $anzahl || $k > $j-$anzahl) {
             echo "<a href='".$sess->url("$navmod_link")."'>".$k."</a> ";
          }
       } else {
          if ($k != 1 && $k != 2) { echo $platzhalter." " ; };
          echo $k." ";
          if ($k != $j-1 && $k != $j) { echo $platzhalter." "; };
       }   
       
    }
    */
    // Weiterblättern
    for ($i=0; $i < $j; $i++)
    {
       if ($idart==$artikel[$i][0] && $i != $j-1) {
          $y = $i+1;
          $weiter_link ="front_content.php?client=$client&lang=$lang&idcat=".$artikel[$y][1]."&idart=".$artikel[$y][0];
          echo "<link rel=\"prev\" href=\"".$sess->url("$weiter_link")."\" />";
       }
    }


    // echo "</div>";
    }

// echo "Test";
    ?>
MfG Steffen
Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: SQL-Abfrage um Template-ID erweitern

Beitrag von Spider IT »

derSteffen hat geschrieben:Hallo Rene, vielen Dank für den Code, da waren zwei Tipp-Fehler im Code
Hab sie gefunden, danke für die Korrektur :)
derSteffen hat geschrieben:Aber trotzdem wird jetzt gar nichts angezeigt.
Die Variable hast du aber doch gesetzt, oder?
Und ich glaube es liegt daran, dass die idcat gar nicht eingesetzt werden sollte, dann funzt es bei dir nur weil das da keine Auswirkung hat.
derSteffen hat geschrieben:... allerdings sollen aber z.B. alle Artikel mit dem Template "Formular" oder "Sitemap" etc. nicht mit aufgeführt werden.
Dann brauchst du die idtpl's dieser Templates und setzt das so in der Abfage ein:

Code: Alles auswählen

AND (tc.idtpl NOT IN (38,42))
derSteffen hat geschrieben:Schön wäre auch noch wenn man später einige Artikl manuell mit der idart ebenfalls herusnehmen kann.
Das geht indem du den Kriterienblock wie folgt erweiterst:

Code: Alles auswählen

AND (al.idart NOT IN (4,8,13))
derSteffen hat geschrieben:Das ist so das Ziel.
Die gesamte SQL-Anweisung würde damit so aussehen:

Code: Alles auswählen

$sql = 'SELECT al.idart, al.title, cl.idcat, al.created
        FROM ' . $cfg['tab']['cat_art'] . ' AS ca INNER JOIN ' . $cfg['tab']['art_lang'] . ' AS al ON ca.idart = al.idart INNER JOIN ' . $cfg['tab']['tpl_conf'] . ' AS tc ON al.idtplcfg = tc.idtplcfg
        WHERE ((al.idlang=' . $lang . ')
           AND (al.online=1)
           AND (tc.idtpl NOT IN (' . explode(',', $TemplateIDs) . '))
           AND (al.idart NOT IN (' . explode(',', $idarts) . ')))
        ORDER BY ' . $sortiert . ' ' . $steigung;
Die Variablen $TemplateIDs und $idarts sind jetzt Arrays und sollten zumindest einen Wert beinhalten (0 wird bei den IDs nicht benutzt und schließt deshalb nichts aus).
Wenn es trotzdem nicht funktionieren sollte möchte ich mir das gerne mal ansehen.

Gruß
René
Gesperrt