Seite 1 von 1

Neues Modul -> Werbebanner

Verfasst: Di 13. Jul 2004, 23:14
von Tom Quenten
Da ich sowas bisher nicht gefunden habe und ich sowas benötige habe ich mir eben gedacht steuer ich doch auch mal was bei. Naja vielleicht mache ich mich ja auch zum Löffel damit, weil es vielleicht eventuell möglicherweise doch jemand schon geschrieben hat und ich es nur nicht gefunden habe, ABER EGAL. Hier ist es, zwar noch nicht ganz fertig aber so gut wie.

Ich habe mir hier einen separaten Kategoriebaum angelegt, dort habe ich mir dann verschiedene Bannerthemen erstellt. Das Modul liest derzeit alle "Artikel" der Kategorie aus, interessant ist hier jedoch nur das 1. Bild, dessen Link und die Framinformation.

Handhabung
- Kategorie auswählen in der Konfiguration
- Artikel anlegen mit einem Bildlink und eventuell Frameinformation

Inputcode

Code: Alles auswählen

$selected = "CMS_VALUE[0]";

echo '<table cellspacing="0" cellpadding="10" border="0">';
echo '  <tr valign="top">';
echo '    <td>Kategorie wählen:</td>';
echo '    <td><select name="CMS_VAR[0]">';

if($selected!="0" && $selected!=""){
    echo"<option value=\"0\">--- kein ---</option>";
} else {
    echo"<option selected=\"selected\" value=\"0\">--- kein ---</option>";
}

$sql = "
    SELECT a.idcat, a.level, c.name
    FROM {$cfg['tab']['cat_tree']} AS a,
         {$cfg['tab']['cat']} AS b,
         {$cfg['tab']['cat_lang']} AS c
    WHERE
        a.idcat = b.idcat
        AND b.idcat = c.idcat
        AND c.idlang='$lang'
        AND b.idclient='$client'
        AND c.visible = 1
    ORDER BY a.idtree
    ";

$db->query($sql);

while ($db->next_record()) {
    $spaces = "|";
    $levels = $db->f("level");
    for ($i = 0; $i < $levels; $i ++) {
        $spaces = $spaces . "--";
    }
    $spaces .= ">";

    if ($selected == $db->f("idcat")) {
        echo "<option selected=\"selected\" value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";
    } else {
        echo "<option value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";
    }
}

echo "</select></td></tr>";
echo "</table>";
Outputcode

Code: Alles auswählen

<?

// Initialisieren
$db = new DB_Contenido;
$db2 = new DB_Contenido;

// Umsetzen der Konfiguration auf eine Variable
$categorie = "CMS_VALUE[0]";

// Anfrage formulieren
// Hier werden alle Artikelnummern der ausgewählten Kategorie ausgelesen
$sql="
SELECT *
FROM
{$cfg['tab']['cat']} AS a,
{$cfg['tab']['cat_lang']} AS b,
{$cfg['tab']['cat_art']} AS c
WHERE a.idcat = b.idcat
AND a.idcat = c.idcat
AND b.visible = 1
AND a.idcat = '$categorie'
";

// Absetzen der Anfrage auf die Datenbank
$db->query($sql);

// Array durchlaufen
while ($db->next_record())
  {
    // Artikelnummer einer Variable zuordnen
    $artikel = $db->f("idart");

    // Anfrage formulieren
    // idtype = 4 -> Bilder
    // idtype = 6 -> Bildlink
    // idtype = 7 -> Frameinformation (target)
    $sql = "SELECT  *
    FROM contenido_content AS a, contenido_art_lang AS d
    LEFT  JOIN contenido_type AS b ON a.idtype = b.idtype
    LEFT  JOIN contenido_upl AS c ON a.value = c.idupl
    WHERE a.idartlang = '$artikel'
    AND a.idartlang = d.idartlang
    AND
      (
        b.idtype = 4
        OR b.idtype = 6
        OR b.idtype = 7
      )
    AND d.online = 1
    ";

    // Absetzen der Anfrage auf die Datenbank
    $db2->query($sql);
    
    // Array durchlaufen
    while ($db2->next_record())
      {
        $bilddatei = $db2->f('dirname').$db2->f("filename");
        echo '<a href="??????"><img src="upload/'.$bilddatei.'" border="0" alt="" target="???????"></a><br><br>';

        // Hier liegt ein Array vor, Problem -> das Feld $db->f("value") liegt 3 mal vor, Dateinamen des Bildes, Frameinformation
        // und Weiterleitungslink, ich habe aber keine Ahnung wie ich die Felder ansprechen soll, da es ja immer gleich heißt
        // Meine Versuche schlugen alle fehl, mit var_dump kam aber alles raus, hier ist also ein klitzekleine Verbessrung nötig
        // foreach ($db2 as $var)
        // echo $var;
        // echo var_dump($db2);
    	}
  }
?>
Kann mir hier jemand noch einen Tipp geben? Das Modul in der jetzigen Form läuft hier http://cms.tlcc.de/frontend/front_content.php?idcat=1 auf der rechten Seite, nicht wundern das dort 2 Bilder nicht angezeigt werden, das rührt daher das es die Linkinformion und die Frameinformation ist, das Array also 3 mal durchlaufen wird und ich ja bisher noch keine Lösung dafür habe.

Gruss
Tom

Verfasst: Mi 14. Jul 2004, 07:46
von kummer
hi tom

das problem entsteht durch die verwendung der joins. da entstehen dann halt zuerst kartesische produkte, die die anzahl rückgabewerte vervielfachen.

aber du kannst ja einfach prüfen, ob $db2->f("dirname") leer ist oder nicht. also...

Code: Alles auswählen

if (!empty($db2->f("dirname")) {
    // ausgabe link und bild
}
im übrigen kennst du ja den idtype. du kannst also prüfen, welchen wert $db2->f("idtype") hat und entsprechend reagieren.

aber die vermutlich einfachste lösung ist folgende:

(1) du gehst mit while durch alle einträge

(2) innerhalb der schlaufe erstellst du ein zweidimensionales array mit den resultaten. und zwar verwendest du als ersten index die idartlang. dadurch entsteht je artikel (also je banner) nur ein eintrag im array. als zweiten index verwendest du idtype. also so...

Code: Alles auswählen

$meinarray[$db2->f('idartlang')][$db2->f('idtype')] = $db2->f('value');
(3) nach der while-schlaufe machst du ein foreach auf $meinarray...

Code: Alles auswählen

foreach ($meinarray as $banner) {
[...]
}
(4) innerhalb der schleife hast du dann mit $banner[4] der bildpfad, mit $banner[6] den bildlink usw.

(5) innerhalb der while-schlaufe machst du keinerlei ausgaben an den browser. diese erfolgen alle innerhalb der foreach-schlaufe.

hope this helps.

gruss,
andreas

Verfasst: Mi 14. Jul 2004, 13:02
von Tom Quenten
Hallo Andreas,

dein Tipp war ja fast richtig, musste beide Hinweise benutzen, nach 4 Stunden habe ich es nu endlich gefressen. Hier der funktionsfähige Code. Beim Inputcode hat sich nix geändert. Das Modul ist unter der oben genannten Adresse jetzt lauffähig als Beispiel zu sehen.

Outputcode

Code: Alles auswählen

<?

// Initialisieren
$db = new DB_Contenido;
$db2 = new DB_Contenido;

// Umsetzen der Konfiguration auf eine Variable
$categorie = "CMS_VALUE[0]";

// Anfrage formulieren
// Hier werden alle aktiven Artikelnummern der Kategorie ausgelesen
$sql="
SELECT *
FROM
{$cfg['tab']['cat']} AS a,
{$cfg['tab']['cat_lang']} AS b,
{$cfg['tab']['cat_art']} AS c
WHERE a.idcat = b.idcat
AND a.idcat = c.idcat
AND b.visible = 1
AND a.idcat = '$categorie'
";

// Absetzen der Anfrage auf die Datenbank
$db->query($sql);

// Array durchlaufen
while ($db->next_record())
  {
    // Artikelnummer einer Variable zuordnen
    $artikel = $db->f("idart");

    // Anfrage formulieren
    $sql = "SELECT  *
    FROM contenido_content AS a, contenido_art_lang AS d
    LEFT  JOIN contenido_type AS b ON a.idtype = b.idtype
    LEFT  JOIN contenido_upl AS c ON a.value = c.idupl
    WHERE a.idartlang = '$artikel' AND a.idartlang = d.idartlang
    AND
      (
        b.idtype = 4
        OR b.idtype = 6
        OR b.idtype = 7
      )
    AND d.online = 1
    ";

    // Absetzen der Anfrage auf die Datenbank
    $db2->query($sql);
    
    // Array durchlaufen
    while ($db2->next_record())
      {
        // $arraywert generieren, wird benötigt um im Falle des Bildlinks überschrieben werden zu können
        $arraywert = $db2->f('value');

        // $bilddatei generieren
        $bilddatei = ($db2->f('dirname'));

        // prüfen ob $bilddatei leer ist
        if (!empty($bilddatei))
          {
            // Variable Bilddatei wird mit Pfadangabe ergänzt
            $bilddatei = $db2->f('dirname').$db2->f('filename');

            // $arraywert muss mit dem Bildlink überschrieben werden um ins Array aufegommen werden zu können
            $arraywert = $bilddatei;
          }

        // Neues Array generieren, damit die Elemente Bild, Bildlink, Bildframeinfo später gezielt angesprochen werden können
        $bannerarray[$db2->f('idart')][$db2->f('idtype')] = $arraywert;
      }
  }

// Ausgabe an den Browser
foreach ($bannerarray as $banner)
  {
    echo '<a href="'.urldecode($banner[6]).'"><img src="upload/'.$banner[4].'" border="0" alt="" target="'.urldecode($banner[7]).'"></a><br><br>';
  }
?>
Weitere Verbesserungsvorschläge erwünscht ...

Gruss
Tom

*stolz sein* :lol:

Verfasst: Mi 14. Jul 2004, 13:31
von Tom Quenten
Hallo Andreas,

ein klitzekleines problemchen habe ich noch entdeckt. Solange die Verlinkung der Banner auf externe Seiten oder auf Bilddateien oder ein Dokument verweist, ist alles fein in Ordnung.

Aber wenn das Wörtchen ABER nicht währ...

Auf interne Artikel gehts leider noch net. Problem ist, das in der Tabelle Content nur die Artikelnummer im Feld 'value' gespeichert wird. Ich weiß leider nicht wie ich das jetzt prüfen soll ob es ein Artikelverweis oder ein externer Verweis ist. Beide Information befinden sich im Feld 'value'. Also einfach prüfen ob das Feld leer ist oder nicht bringt hier in dem Falle nichts.

Mhhhhh...

Verfasst: Mi 14. Jul 2004, 13:49
von kummer
don't worry: ist nicht wirklich ein problem.

bei einer internen verlinkung handelt es sich um einen ganzzahlingen wert (integer). und das kann man mit einer regular expression erkennen:

Code: Alles auswählen

if ($stringtobechecked == preg_replace("\d",'',$stringtobechechecked)) {
	//stringtobechecked ist ein integer
	//folglich interne referenz
} else {
	//stringtobechecked ist kein integer
	//folglich url
}

Verfasst: Mi 14. Jul 2004, 13:56
von Tom Quenten
wenn ichs kapiert habe sind NUR interne Artikel als Zahlen gespeichert im Feld 'value'?

na wieder was gelernt ...
ich werds mal umsetzen, und dann noch mal posten

Gruss
Tom

Verfasst: Mi 14. Jul 2004, 15:25
von kummer
soweit ich weiss: ja. (irrtum stets vorbehalten) :roll: :lol:

Verfasst: Mi 14. Jul 2004, 17:03
von Tom Quenten
So hier endlich das fertige Bannermodul Version 0.1

Code: Alles auswählen

<?

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     tlcc.bannermodul
* Author      :     Andre Domaschke / Tom Quenten
* Copyright   :     s.o.
* Created     :     13.07.2004
* Modified    :     14.07.2004
************************************************/

// Initialisieren
$db = new DB_Contenido;
$db2 = new DB_Contenido;

// Umsetzen der Konfiguration auf eine Variable
$categorie = "CMS_VALUE[0]";

// Anfrage formulieren
// Hier werden alle Artikelnummern der Kategorie ausgelesen
$sql="
SELECT *
FROM
{$cfg['tab']['cat']} AS a,
{$cfg['tab']['cat_lang']} AS b,
{$cfg['tab']['cat_art']} AS c
WHERE a.idcat = b.idcat
AND a.idcat = c.idcat
AND b.visible = 1
AND a.idcat = '$categorie'
";

// Absetzen der Anfrage auf die Datenbank
$db->query($sql);

// Array durchlaufen
while ($db->next_record())
  {
    // Artikelnummer einer Variable zuordnen
    $artikel = $db->f("idart");

    // Anfrage formulieren
    $sql = "SELECT  *
    FROM contenido_content AS a, contenido_art_lang AS d
    LEFT  JOIN contenido_type AS b ON a.idtype = b.idtype
    LEFT  JOIN contenido_upl AS c ON a.value = c.idupl
    WHERE a.idartlang = '$artikel' AND a.idartlang = d.idartlang
    AND
      (
        b.idtype = 4
        OR b.idtype = 6
        OR b.idtype = 7
      )
    AND d.online = 1
    ";

    // Absetzen der Anfrage auf die Datenbank
    $db2->query($sql);
    
    // Array durchlaufen
    while ($db2->next_record())
      {
        $idtype = ($db2->f('idtype'));

        // Fallunterscheidung -> ist $idtype 4 befindet sich im Feld 'value' die Bildnummer
        if ($idtype == 4)
          {
            // $link erstellen
            $bild = $db2->f('dirname').$db2->f('filename');
            $arraywert = $bild;
          }

        // Fallunterscheidung -> ist $idtype 6 befindet sich im Feld 'value' die Linkinformation
        if ($idtype == 6)
          {
            // $link erstellen
            $link = $db2->f('value');
            
            if ($link > 1)
              {
                //$link muss eine Zahl größer 1 sein, folglich interne referenz
                $link = $sess->url("front_content.php?client=$client&lang=$lang&idcatart=".$db2->f('value'));
              }
            else
              {
                //$link ist keine Zahl
                $link = $db2->f('value');
              }
            $arraywert = $link;
          }

        // Fallunterscheidung -> ist $idtype 7 befindet sich im Feld 'value' die Targetinformation
        if ($idtype == 7)
          {
            // $target erstellen
            $target = $db2->f('value');
            $arraywert = $target;
          }

        // Neues Array generieren, damit die Elemente Bild, Bildlink, Bildframeinfo später gezielt angesprochen werden können
        $bannerarray[$db2->f('idart')][$db2->f('idtype')] = $arraywert;
      }
  }

// Ausgabe an den Browser
foreach ($bannerarray as $banner)
  {
    echo '<a href="'.urldecode($banner[6]).'"><img src="upload/'.$banner[4].'" border="0" alt="" target="'.urldecode($banner[7]).'"></a><br><br>';
  }
?>
@kummer

Code: Alles auswählen

if ($stringtobechecked == preg_replace("\d",'',$stringtobechechecked)) { 
   //stringtobechecked ist ein integer 
   //folglich interne referenz 
} else { 
   //stringtobechecked ist kein integer 
   //folglich url 
}
Funktionierte leider nicht, warum auch immer. Auch in der Funktionsrefernez zu PHP habe ich leider keine Antwort darauf gefunden.

Aber nu gehts ja wie oben beschrieben, und jetzt ist alles fein.


Gruss
Tom

Verfasst: So 25. Jul 2004, 23:10
von Tom Quenten
Nach einem Feinschliff und diversen kleinen Verbesserungen jetzt die Version 1.0

Die Menge der ausgelesenen Variablen kann weiter unten je nach Bedarf weiter modifiziert werden. Die Flexibilität ist demnach gegeben. Viel Spass damit.

Code: Alles auswählen

<?
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :	  tlcc.bannermodul
* Author      :     Andre Domaschke
* Copyright   :     Andre Domaschke
* Created     :     13.07.2004
* Modified    :     14.07.2004 | 25.07.2004
*                   Sortierung, aktive Artikel
************************************************/

// Initialisieren
$db1 = new DB_Contenido;
$db2 = new DB_Contenido;

// Umsetzen der Konfiguration auf eine Variable
$categorie = "CMS_VALUE[0]";

// Anfrage formulieren
// Datenfeldmenge pro Artikel ermitteln
$sql1="SELECT     d.idartlang, count(*) AS menge
       FROM       contenido_cat AS a,
                  contenido_cat_lang AS b,
                  contenido_cat_art AS c,
                  contenido_content AS d,
                  contenido_art_lang AS e
       LEFT  JOIN contenido_type AS f ON d.idtype = f.idtype
       LEFT  JOIN contenido_upl AS g ON d.value = g.idupl
       WHERE      a.idcat = b.idcat
       AND        a.idcat = c.idcat
       AND        c.idart = e.idart
       AND        d.idartlang = e.idartlang
       AND        b.visible = 1
       AND        e.online = 1
       AND        a.idcat = '$categorie'
       GROUP BY   d.idartlang
       ORDER BY   e.artsort ASC
      ";

// Absetzen der Anfrage auf die Datenbank
$db1->query($sql1);

// Array durchlaufen
while ($db1->next_record())
  {
    $idartlang = $db1->f('idartlang');
    $menge = $db1->f('menge');
    
    // Anfrage formulieren
    $sql2="SELECT     *
           FROM       contenido_content AS a,
                      contenido_art_lang AS b
           LEFT  JOIN contenido_type AS c ON a.idtype = c.idtype
           LEFT  JOIN contenido_upl AS d ON a.value = d.idupl
           WHERE      a.idartlang = b.idartlang
           AND        b.online = 1
           AND        a.idartlang = '$idartlang'
          ";

     // Absetzen der Anfrage auf die Datenbank
     $db2->query($sql2);

     // Array durchlaufen
     while ($db2->next_record())
       {
         // ******************************************************************************************
         // aus der Bildnummer wird die Bild URL gebildet
         // ******************************************************************************************
         $idtype = $db2->f('idtype');
         if ($idtype == 4)
           {
             // $link erstellen
             $bildurl = $db2->f('dirname').$db2->f('filename');
             $arraywert = $bildurl;
           }
         // ******************************************************************************************
         // die weiterführenden Links werden gebildet
         // ******************************************************************************************
         if ($idtype == 6)
           {
             // $link erstellen
             $link = $db2->f('value');

             if ($link > 1)
               {
                 //$link muss eine Zahl größer 1 sein, folglich interne referenz
                 $linkurl = $sess->url("front_content.php?client=$client&lang=$lang&idcatart=".$db2->f('value'));
               }
             else
               {
                 //$link ist keine Zahl
                 $linkurl = $db2->f('value');
               }
             $arraywert = $linkurl;
           }
         // ******************************************************************************************
         // targetinformation werden gebildet
         // ******************************************************************************************
         if ($idtype == 7)
           {
             // $target erstellen
             $target = $db2->f('value');
             $arraywert = $target;
           }
         // ******************************************************************************************
         // Neues Array generieren, damit die Elemente gezielt angesprochen werden können
         // ******************************************************************************************
         $bannerarray[$db2->f('idtype')][$db2->f('typeid')] = $arraywert;
       }
     // ausgabe an den browser
     echo '<a href="'.urldecode($bannerarray[6][1]).'"><img src="upload/'. $bannerarray[4][1].'" border="0" alt="" target="'.urldecode($bannerarray[7][1]).'"></a><br><br>';
   }
?>