Abfrage gegen Startartikel erweitern

Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Abfrage gegen Startartikel erweitern

Beitrag von Wutz »

Ich habe folgenden Code und würde gerne Startartikel ausschliessen. Im Forum konnte ich nichts genaues finden.

Code: Alles auswählen

            $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
                  AND e.idlang = $lang
                  $nurstartartikel
                ORDER BY
                  e.created DESC
                LIMIT
                  $limit, $angezeigte_anzahl";
In der config.php habe ich $cfg["is_start_compatible"] = false;. Wie muss ich das noch erweitern, dass es alle nicht-Startartikel holt?
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Ich habe nun versucht mich durch die Contenido FAQ zu lesen, allerdings komme ich noch nicht klar damit was das left join bzw. die left join-Anweisung macht?
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

Wutz hat geschrieben:Ich habe nun versucht mich durch die Contenido FAQ zu lesen, allerdings komme ich noch nicht klar damit was das left join bzw. die left join-Anweisung macht?
man möge mich korrigieren, denn so ganz habe ich die config einstellungen für startartikel noch nicht überblickt, aber ...

in navigationsmodulen und/oder artikellisten bspw. checke ich die startartikel über die tabelle

con_cat_lang, value der startidartlang, die dann wiederum mit der con_art_lang value idartlang abgeglichen werden muss um an die idart zu kommen

vielicht hilft das ein wenig weiter
http://contenido.org/forum/viewtopic.ph ... c&start=27

ab meinem post bitte bis zum ende lesen, da sese dass ganze nochmal korrigiert. ziel war dort der umgekehrte fall
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Ich habe den Code so erweitert:

Code: Alles auswählen

$sql_1 = "
    SELECT count(*) AS anzahl
    FROM
      {$cfg['tab']['cat']} AS a,
      {$cfg['tab']['cat']} AS b,
      {$cfg['tab']['cat']} AS c,
      {$cfg['tab']['art_lang']} AS ARTLANG,
      {$cfg['tab']['cat_lang']} AS CATLANG
    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
      AND ARTLANG.idartlang != CATLANG.startidartlang";

$sql_2 = "
    SELECT
      c.idcat,
      d.idart,
      e.idartlang,
      ARTLANG.idartlang AS 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,
      {$cfg['tab']['art_lang']} AS ARTLANG,
      {$cfg['tab']['cat_lang']} AS CATLANG
    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
      AND e.idlang = $lang
      AND ARTLANG.idartlang != CATLANG.startidartlang
    ORDER BY
      e.created DESC
    LIMIT
      $limit, $angezeigte_anzahl";
Nun werden auf einmal alle Artikel ausgegeben. :shock: komisch auch, es werden zwar alle alle Titel ausgegeben, als Link macht es mir aber immer das gleich und auch beim Datum.
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

Code: Alles auswählen

      {$cfg['tab']['cat']} AS a,
      {$cfg['tab']['cat']} AS b,
      {$cfg['tab']['cat']} AS c, 
das schon mal grosser murx IMHO

und bitte beschreibe doch mal genau was du machen willst für welches modul? des snippet ganz oben, wo kommt des her?
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Es geht um die Artikelliste "w3concepts_alist_v1" von kummer.

Ich will einfach die Artikel ohne Startartikel.
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

Wutz hat geschrieben:Es geht um die Artikelliste "w3concepts_alist_v1" von kummer.

Ich will einfach die Artikel ohne Startartikel.
kkder code sthet da zwar so drin aber warum ich eine tabelle mit drei bezeichnern führen soll ist mir nicht klar :?

andererseits ist die artikelliste schon etwas älter und ich weiss ned ob des so mit der 4.6.4 funzt

anderer ansatz

du willst einfach aller artikel ohne startartikel einer kategorie
also karo-einfach ohne 4en sozuagen ;) da sollte sich eine in der 4.6.4 funktionierende alist finden.

suche mal im board, ich guck auch mal parallel, hatte doch sowas grade erst am wickel und verworfen weil eben karo-einfach
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Ich habe den Code mal ausgedünnt, sieht nun so aus:

Code: Alles auswählen

<?php

    # Konfiguration

    $kategorie = "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'] = "zur&uuml;ck";
    }

    $navigationslink['next'] = "CMS_VALUE[5]";
    if( $navigationslink['next'] == "" ) {
      $navigationslink['next'] = "vor";
    }

    # $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.
    if( $startartikel ) {
      $nur_startartikel = "";
    } else {
      $nur_startartikel = "AND d.is_start = 0";
    }

    # Liest die Anzahl betroffener Artikel aus der Datenbank
    $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 = $kategorie
                AND e.online = 1
                AND e.redirect = 0
                AND e.external_redirect = 0
                $nur_startartikel
               ";
    $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 = $kategorie
                AND e.online = 1
                AND e.redirect = 0
                AND e.external_redirect = 0
                AND e.idlang = $lang
                $nurstartartikel
              ORDER BY
                e.created DESC
              LIMIT
                $limit, $angezeigte_anzahl
             ";

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

    $db->query($sql_2);

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

    while( $db->next_record() ) {

      $sql = "SELECT
                value
              FROM
                {$cfg['tab']['content']}
              WHERE
                idartlang = ".$db->f("idartlang")."
                AND idtype = 3
              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"));

      echo "<tr><td class=\"artlist_headline\"> <a href=\"$link\" class=\"artlist_headlinelink\">".urldecode($db2->f("value"))."</a> </td>";
      echo "<td class=\"artlist_date\">".$db->f("erstellungsdatum")."</td></tr>";

      $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 "<tr><td class=\"artlist_subheadline\" colspan=\"2\">$newsubheadline</td></tr>";
      echo "<tr><td>$link</td></tr>";
    }

    echo '</table>';
?>
Es sollte diese Liste sein, da zum einen wichtig ist, dass es mehrere Ebenen tief ausliest und es soll nicht die Advanced sein.

Eigentlich ist dies ja eine einfache Liste, ich will doch nur die Startartikel nicht dabeihaben? Ich bekomme einfach nicht das in die Abfrage was fehlt, ich bin am verzweifeln. :cry:
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

habe mal auf die schnelle die advanced artikelliste von herrB in der version 0.5 genommen

wirft die artikel der rubrik erste schritte aus

http://dev1.elflein-kosmetik.de/cont46v ... p?idcat=78

schau dir mal die listen von herrB an
leider gibt es keine beschriebung was die alten machen mehr, aber die werden alle noch angeboten zum dl und sind schnell importiert

include anweisung im thread nicht vergessen :)

darauf basierend sollte dein problem sich lösen lassen, und es ist sicher einfacher eine advanced zu beschneiden als eine simple zu erweitern, zumindest für mich ;)
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Wie ich schon sagte sind die Advanced Listen eine gute Idee, aber es darf unbedingt keine Advanced sein. Diese Liste hier kann man über die Mandanteneinstellung steuern, bei den Advanced Liste muss man alles auswählen. Wo ich sie einsetzen möchte, darf es nicht über eine Advanced laufen.

Ich hoffe wirklich, dass mir einer der Profis in der SQL Abfrage bei den Zeilen helfen kann, die reinmüssen um auf das "startidartlang" zu prüfen und diese auszuschliessen.
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

Wutz hat geschrieben:Wie ich schon sagte sind die Advanced Listen eine gute Idee, aber es darf unbedingt keine Advanced sein. Diese Liste hier kann man über die Mandanteneinstellung steuern, bei den Advanced Liste muss man alles auswählen. Wo ich sie einsetzen möchte, darf es nicht über eine Advanced laufen.

Ich hoffe wirklich, dass mir einer der Profis in der SQL Abfrage bei den Zeilen helfen kann, die reinmüssen um auf das "startidartlang" zu prüfen und diese auszuschliessen.
habe mir des jetzt mal angeschaut und mit meinen bescheidenen kenntnissen denke ich es liegt dana, dass im output um die zeile 38/39 folgendes steht

Code: Alles auswählen

    // wenn startartikel true ist, werden die startartikel dargestellt, sonst nicht
    $nurstartartikel = ($startartikel)?(''):('AND d.is_start = 0');
nun glaube ich aber, das des so ned mehr funzt weil der startikel wie gesagt jetzt unter cat_lang startidartlang abgelegt wird

sprich des muss mit der idartlang in con_art_lang abgeglichen werden und diese idart (!) dann ausgeschlossen werden
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Das weiß ich ja alles, oben habe ich den abgespeckten Code gepostet, sort findest du das $nurstartartikel gar nicht mehr.

Es hängt am Wissen über die Einschränkung der Abfrage. :(
mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf »

Wutz hat geschrieben:Das weiß ich ja alles, oben habe ich den abgespeckten Code gepostet, sort findest du das $nurstartartikel gar nicht mehr.

Es hängt am Wissen über die Einschränkung der Abfrage. :(
und da kann ich dich nur wieder auf meine aussagen bisher verweisen

ob startartikel ja oder neine steht in der

Code: Alles auswählen

CON_CAT_LANG -> startidartlang
die matched dann mit der

Code: Alles auswählen

CON_ART_LANG -> idartlang
und die dazugehörige

Code: Alles auswählen

CON_ART_LANG -> idart
muss dann ausgeklammert werden. mit deinem output bin ich gerade am probieren, generell fehlt ja dort ein abgleich mit der CON_CAT_LANG gänzlich, somit ist der startartikel immer drin :?

und zunächst bringt der mir in einer standard 4.6.4 folgendes
http://dev1.elflein-kosmetik.de/cont46v ... p?idcat=78
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams
Wutz
Beiträge: 50
Registriert: Mi 2. Nov 2005, 00:49
Wohnort: München
Kontaktdaten:

Beitrag von Wutz »

Ich bin auch schon die ganze Zeit am probieren. Ich habe gedacht, in $sql_2 müsste ja in das SELECT rein f.startidartlang AS startidartlang, damit er das ausliest. In das FROM habe ich {$cfg['tab']['cat_lang']} AS f, damit es weiß von wo er f auslesen soll.

Allein durch die zwei Angaben macht es aber die Liste schon kaputt und es kommen wirre Dinge raus.
i-fekt
Beiträge: 1520
Registriert: Mo 3. Jan 2005, 02:15
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von i-fekt »

Hier ist mein Ansatz, das auslesen der Unterrubriken fehlt aber:

Code: Alles auswählen

<?php

    # Konfiguration

    $kategorie = "CMS_VALUE[0]";

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

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

    $navigationslink['previous'] = "CMS_VALUE[4]";
    if( $navigationslink['previous'] == "" ) { $navigationslink['previous'] = "zur&uuml;ck"; }

    $navigationslink['next'] = "CMS_VALUE[5]";
    if( $navigationslink['next'] == "" ) { $navigationslink['next'] = "vor"; }

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

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

    # Liest die Artikel aus der Datenbank
    $sql_2 = "SELECT
               b.idart,
               b.created,
               b.lastmodified,
               b.online,
               b.idartlang
             FROM
               {$cfg['tab']['cat_art']} as a
             LEFT JOIN
               {$cfg['tab']['art_lang']} as b ON a.idart = b.idart
             LEFT JOIN
               {$cfg['tab']['cat_lang']} as c ON a.idcat = c.idcat
             LEFT JOIN
               {$cfg['tab']['cat']} as d ON a.idcat = d.idcat
             WHERE
               a.idcat = $kategorie
               AND b.idlang = $lang
               AND b.online = 1
               AND c.startidartlang != b.idartlang
             ORDER BY
               b.created DESC";

    $db->query($sql_2);

    echo '<table cellpadding="0" cellspacing="0" border="1" width="100%">';

    while( $db->next_record() ) {

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

      $db2->query($sql);

      $db2->next_record();
      $link = $sess->url("front_content.php?idcat=".$db->f("idcat")."&idart=".$db->f("idart"));
      echo "<tr><td><a href=\"$link\" class=\"artlist_headlinelink\">".urldecode($db2->f("value"))."</a>[".$db->f("idart")."] (".$db->f("created").")</td></tr>";

      $db2->next_record();
      $subheadline = strip_tags(urldecode($db2->f("value")));
      echo "<tr><td>".$subheadline."<br><br></td></tr>";

    }
    echo '</table>';
?>
Zuletzt geändert von i-fekt am Mi 15. Feb 2006, 01:26, insgesamt 1-mal geändert.
Gesperrt