Container IDs dynamisch erstellen

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Container IDs dynamisch erstellen

Beitrag von KrissKrass » Di 7. Apr 2009, 14:38

Hallo zusammen,

habe die Forensuche genutzt, jedoch nichts wirklich passendes gefunden.

Habe folgendes Problem: Ich muss eine Übersichtsseite erstellen, die aus mehreren gleichen Elementen besteht, die jedoch immer verschiedenen Inhalt haben. Da ich das ganze so dynamisch wie möglich anlegen will, da es sein kann, dass später weitere Elemente hinzukommen, habe ich das ganze in einer FOR-Schleife angelegt. Daher kann ich jetzt natürlich nicht die Container-IDs nicht festvergeben. Wenn ich die IDs jedoch mit einer Variable anlege, dann werden die bei der "Editorausgabe" nicht mehr geparst - bedeutet die Inhalte können manuell nicht mehr eingetragen werden.

Meine Frage wäre daher, gibt es eine Möglichkeit das dynamisch umzusetzen ohne das ich die IDs direkt festlegen muss? Mein ersteller Code sieht bisher so aus, damit ihr euch besser vorstellen könnt, was ich meine:

Code: Alles auswählen

<?php
	$count_bgcolor = 0;
    
	for($count_teaser = 0; $count_teaser < 5; $count_teaser++) {
         if ($count_bgcolor == '0') {
             // Headlineschriftfarbe
             $textcolor1 = 'FFFFFF';
             $textcolor2 = '898989';
             $textcolor3 = 'FFFFFF';
             
             // Backgroundfarbe
             $bgcolor = '3B3B3B';
             
             $count_bgcolor++;
         } else
         {
             // Headlineschriftfarbe
             $textcolor1 = '3B3B3B';
             $textcolor2 = '898989';
             $textcolor3 = '000000';
             
             // Backgroundfarbe
             $bgcolor = 'FFFFFF'; 
             
             $count_bgcolor = 0;       
         }
         
         $count_elements = $count_teaser;
         
         echo '<div id="newsDiv" style="background-color: #'.$bgcolor.';">';
         echo '<div id="newsInnerDiv">';
         
         echo '<div id="newsBackgroundDiv" style="background-color: #'.$bgcolor.';">';
         echo '<div id="newsLeftDiv">', chr(10);
         if (!$edit) {
         	echo '<a href="front_content.php"><img src="'."CMS_IMG[$count_elements]".'" width="230" height="180" border="0" alt="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" title="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" /></a>';
         } else
         {
         	echo '<img src="'."CMS_IMG[$count_elements]".'" border="0" alt="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" title="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" />';
            echo "CMS_IMGEDIT[$count_elements]";
         } 
         echo '</div>', chr(10);
         
         echo '<div id="newsRightDiv" style="color: #'.$textcolor3.';">';
         echo '<div class="greyTextSmall">'."CMS_HTML[$count_elements]".'</div>';
         if (!$edit) {
            if ("CMS_HTMLHEAD[$count_elements]" != "") {
         		echo '<a href="front_content.php"><img src="textimage/text.php?c1='.$textcolor1.'&c2='.$textcolor2.'&imagesize=438&textsize=15&bgcolor='.$bgcolor.'&text='.urlencode("CMS_HTMLHEAD[$count_elements]").'" border="0" alt="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" title="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" /></a>', chr(10);
         	}
         } else {
            echo "CMS_HTMLHEAD[$count_elements]";
         } 
         
         $count_elements++;       
         
         echo '<div style="margin: 20px 0 0 0;"><a href="front_content.php" title="'.strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]")).'" class="news_link" style="color: #'.$textcolor3.';">'."CMS_HTML[$count_elements]".'</a></div>';
         echo '</div>';
         echo '<div style="clear: both;"></div>';
         echo '</div>';
         
         echo '</div>', chr(10);
         echo '</div>', chr(10);
         
         unset($count_elements);
    }
    unset($count_bgcolor);
    unset($count_teaser);
?>
Bin über Tipps und Tricks sehr dankbar.

Liebe Grüße
Christoph

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Di 7. Apr 2009, 22:49

in der DB unter con_types stehen die CMS_Typen drin
und auch der Code der den Content für die Platzhalter erstellt.

ich würde das in einer Funktion kapseln.
Schema

Code: Alles auswählen

function make_cms_types( $typ, $id ) {
  -> per SQL den entsprechenden Code aus der DB holen
  -> stripslashes( auf code )
  -> $verwendetevariable_im_code = $typ
  -> $verwendetevariable_im_code = $id 
  -> eval( code )
  -> return ergebnis
}
dann die funktion anstelle der CMS_Platzhalter einsetzen.

TIPP:
nicht so gut: strip_tags(urldecode("CMS_HTMLHEAD[$count_elements]"))
funktioniert: urldecode(strip_tags("CMS_HTMLHEAD[$count_elements]"))

mfg oli

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von KrissKrass » Mi 8. Apr 2009, 10:28

Danke für den Tipp, nur irgendwie will das Ganze nicht so recht. was mache ich falsch?
Meine Function sieht wie folgt aus:

Code: Alles auswählen

function make_cms_types($container_type,$container_id) {
        $sql = "SELECT * FROM con_type WHERE type = '$container_type'";
        $db->query($sql);
    
        while ($db->next_record()) {
            $cms_code = $db->f("code");
        }
        
        stripslashes($cms_code);        
        $val = $container_id;        
        $ergebnis = eval($cms_code);
        
        return $ergebnis;
    }   
    make_cms_types("CMS_HTML","1");
Er holt sich auch den entsprechenden Code aus der Datenbank usw. nur wenn ich mir die Seite dann angucke bzw. im Backend als Inpage editieren will bekomme ich nur eine Fehlermeldung:

Code: Alles auswählen

a non-object in contenido/includes/include.con_editcontent.php(636) : eval()'d code on line 281
Was mache ich falsch? Die Function ist doch so richtig oder nicht? Vergesse ich noch eine Variable zu setzen?

Bin dankbar über jeden Tipp.

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 11:05

KrissKrass hat geschrieben: $ergebnis = eval($cms_code);
return $ergebnis;
der CMS-Code nutzt als Rückgabe die Variable "$tmp"
KrissKrass hat geschrieben: eval($cms_code);
return $tmp;
mfg OliverL

Tipp: Wenn es funktioniert ergänz doch bitte den Code im Wiki als Code-Schnipsel ganz am ende unter "Für Entwickler" vom Beitrag:
(Flasch machen im Wiki kann man nix / solange man nix löscht :) )
http://www.contenido-wiki.org/wiki/inde ... MS_TYP%27s

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von KrissKrass » Mi 8. Apr 2009, 11:19

So langsam bin ich mit meinem Latein am Ende... Es funktioniert einfach nicht. Die Fehlermeldung ist jetzt zwar weg, aber es wird einfach kein Inhalt angezeigt sondern nur eine weiße Seite. Nichts von einem Inpage-Div zum eintragen von Content zu sehen. Das kann doch nicht sein oder?

Mein Code sieht momentan so aus:

Code: Alles auswählen

<?php
    // HTML Container erstellen
    function make_cms_types($container_type,$container_id) {
        $db1 = new DB_Contenido;
        $sql1 = "SELECT * FROM con_type WHERE type = '$container_type'";
        $db1->query($sql1);
    
        while ($db1->next_record()) {
            $cms_code = $db1->f("code");
        }
        
        $cms_code = stripslashes($cms_code);        
        $val = $container_id;        
        eval($cms_code);
        return $tmp;
    }   
    
    make_cms_types("CMS_HTML","1");
?>
Ich weiß langsam nicht mehr wo ich noch ansetzen soll... Warum gibt der das nicht aus?

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 11:36

ich guck mir das heute Abend mal genau an.
was mir gerade noch auffällt ist das du auch diverse Variablen in die Funktion holen musst!

global $db, $edit, $client, $cfg, $cfgClient; // ... must mal schauen was im Code der Types verwendet wird

mfg OliverL

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von KrissKrass » Mi 8. Apr 2009, 12:51

Das mit Globalenvariablen wars... Jetzt wird nämlich bereits alles angezeigt und ist auch funktionstüchtig. Einzig der eingetragene Inhalt wird nicht dargestellt, was wohl daran liegt, dass er bei dem Replace-Script die "typeid" nicht findet.

Meine Function sieht nun so aus:

Code: Alles auswählen

<?php   
    // HTML Container erstellen
    function make_cms_types($container_type,$container_id) {       
        global $idartlang, $idart, $idcat, $lang, $db, $edit, $sess, $client, $cfg, $cfgClient;
        
        $db1 = new DB_Contenido;
        $sql1 = "SELECT * FROM con_type WHERE type = '$container_type'";
        $db1->query($sql1);
    
        while ($db1->next_record()) {
            $cms_code = $db1->f("code");
        }
        
        //$cms_code = stripslashes($cms_code);        
        $val = $container_id;        
        eval($cms_code);
        $tmp_output = str_replace('\\\"','"',$tmp);
        $tmp_output = stripslashes($tmp_output);
        echo $tmp_output;
    }   
    
    make_cms_types("CMS_HTML","1");  
?>
In dem eigentlichen Replacescript welches er aus der Datenbank ausließt, wird in folgendem Aufruf die Variable $db->f("idtype") verwendet, die er scheinbar nicht findet, da sie nicht mit in die Function übernommen wird.

Code: Alles auswählen

$insiteEditingDIV->setId("HTML_".$db->f("idtype")."_".$val); 
Meine Frage ist jetzt, wie schaffe ich es diese Variable auch in der Function auszugeben bzw. zu verwenden? Habe mir schon überlegt einfach die Stelle am Ende der Function mit str_replace() manuell zu überschreiben. Oder gibt es eine andere, bessere Lösung?

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 12:57

*vorkau 8)

entfernen $db1 = new DB_Contenido;

da in global die $db drin ist mach mal aus:
$db1->...
über all das
$db->...

sonnige grüße
OliverL

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von KrissKrass » Mi 8. Apr 2009, 13:26

Danke fürs vorkauen, aber es ändert sich trotzdem nichts... :?

Code: Alles auswählen

<?php   
    // HTML Container erstellen
    function make_cms_types($container_type,$container_id) {       
        global $idartlang, $idart, $idcat, $lang, $db, $edit, $sess, $client, $cfg, $cfgClient;
        
        $sql = "SELECT * FROM con_type WHERE type = '$container_type'";
        $db->query($sql);
    
        while ($db->next_record()) {
            $cms_code = $db->f("code");
            $cms_idtype = $db->f("idtype");
        }
        
        $val = $container_id;              
        eval($cms_code);     
        $tmp_output = str_replace('\\\"','"',$tmp);
        $tmp_output = stripslashes($tmp_output);
        
        echo $tmp_output;
    }   
    
    make_cms_types("CMS_HTML","1");  
?>
So sieht also die Function aus... Bei dem Inpage-Editing DIV fehlt in der ID jedoch jetzt die "idtype", sprich die ID heißt momentan einfach "HTML__1" und müsste ja eigentlich "HTML_2_1" heißen.
Außerdem ist in der Box bereits Text eingetragen, den ich in der HTML-Editor-Ansicht auch sehe usw. nur eben in der Inpage-Editing-Ansicht nicht. Als wenn er den eingetragenen Text der Box nicht findet. Und das ist komisch.

Habe mir dann mal das Parser-Script aus der Datenbank noch mal angeguckt und da gibt es die Stelle

Code: Alles auswählen

$insiteEditingDIV->setStyleDefinition("direction", langGetTextDirection($lang)); 
die wohl dafür da ist, den vorhandenen Text auszulesen und darzustellen. Das macht sie aber nicht!!!

Was kann ich also noch tun? Kann ja nicht sein das es beim Überschreiben eines Platzhalters funktioniert das Script und wenn man es manuell ausführ nicht!

Ich danke für Ratschläge und verbleibe ebenfalls mit sonnigen Grüßen.

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 13:38

Code: Alles auswählen

<?php   
    // HTML Container erstellen
    function make_cms_types($container_type,$container_id) {       
        global $idartlang, $idart, $idcat, $lang, $db, $edit, $sess, $client, $cfg, $cfgClient;
       
        $sql = "SELECT * FROM con_type WHERE type = '$container_type'";
        $db->query($sql);
   
        $db->next_record();
        $cms_code = $db->f("code");
        $cms_idtype = $db->f("idtype");
        
       
        $val = $container_id;             
        eval($cms_code);     
        $tmp_output = str_replace('\\\"','"',$tmp);
        $tmp_output = stripslashes($tmp_output);
       
        echo $tmp_output;
    }   
   
    make_cms_types("CMS_HTML","1"); 
?>
Wenn das nicht tut, guck/kau ich das heute Abend durch.

mfg OliverL

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 13:40

Die While läuft solange bis es kein Ergebnis mehr gibt.
d.h. im Eval ist das aktuelle Ergebnis auf "leer" gesetzt und $db->f() gibt nix mehr zurück.

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von KrissKrass » Mi 8. Apr 2009, 13:54

Also die ID des DIVs heißt jetzt wie sie soll, nämlich "HTML_2_1".

Jetzt gibt es nur noch das Porblem, dass er den eingetragenen Text in der Inpage-Editing-Ansicht immer noch nicht anzeigt. In der HTML-Editor-Ansicht wird er angezeigt. Heißt: Er wird also auch richtig in der Datenbank gespeichert. Verdammt komisch das Ganze!

Vielleicht hast du dafür ja auch noch einen Tipp!? :D

KrissKrass
Beiträge: 86
Registriert: Mi 2. Jun 2004, 16:01
Wohnort: Bochum
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von KrissKrass » Mi 8. Apr 2009, 14:59

Bin echt am verzweifeln... Wenn ich dann Inhalte eintrage und Bilder anlege, dann werden die in dem HTML-Editor und auf der Bildseite auch angezeigt. Sobald ich mir die Seite jedoch live ansehe, also wie sie ein User sieht, dann hat sie überhaupt keine Inhalte.

Was mache ich nur falsch? Es will mir einfach nicht in den Kopf, dass es funktioniert wenn die Funktion die Platzhalter überschreibt und wenn ich ich die Funktion direkt nutze, es nicht klappt. Ist für mich irgendwie nicht so ganz logisch...

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 15:10

Das sind irgendwelche kleinigkeiten wie eine While-schleife zuviel oder $db1 anstelle von $db usw.
ich mach dir das heute Abend fertig.

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Re: Container IDs dynamisch erstellen

Beitrag von OliverL » Mi 8. Apr 2009, 21:06

Code: Alles auswählen

<?php   
    // HTML Container erstellen
    function make_cms_type( $container_type, $container_id ) {       
        global $a_content, $idartlang, $idart, $idcat, $lang, $db, $edit, $sess, $client, $cfg, $cfgClient;
        
        $sql = "SELECT * FROM ".$cfg["tab"]["type"]." WHERE type = '$container_type'";
        $db->query($sql);
   
        $db->next_record();
        $cms_code = $db->f("code");
        $cms_idtype = $db->f("idtype");

        if( !$edit ) {
            $db2 = new DB_Contenido;
            $sql = "SELECT * FROM ".$cfg["tab"]["content"]." AS A, ".$cfg["tab"]["art_lang"]." AS B, ".$cfg["tab"]["type"]." AS C
                    WHERE A.idtype = C.idtype AND A.idartlang = B.idartlang AND B.idart = '".Contenido_Security::toInteger($idart)."' AND B.idlang = '".Contenido_Security::escapeDB($lang, $db)."' AND
                          A.idtype = '".$cms_idtype."' AND A.typeid = '".$container_id."'";
            $db2->query($sql);
            $db2->next_record();
            $a_content[$db2->f("type")][$db2->f("typeid")] = $db2->f("value");
        }

        $val = $container_id;
        
        eval($cms_code);
        $tmp_output = str_replace('\\\"','"',$tmp);
        $tmp_output = stripslashes($tmp_output);
       
        return $tmp_output;
    }   

    echo '<div>'.make_cms_type("CMS_HTML","1").'</div>';

?>
1. in dem Code des CMS-Type wird die Variable $a_content verwendet.
Die enthält den Content aus con_content.
d.h. global $a_content

2. im Frontend wird nur der Cache ausgeführt der schon faktisch den Inhalt von $a_content enthält. Darum hole ich den Inhalt nachträglich in $a_content wenn !$edit.

3. return ist besser damit man template class verwenden kann und das machen kann:
<?php $tpl->set("d", make_cms_types("CMS_HTML","1") ); ?>

4. make_cms_types == make_cms_type (einzahl 8) )
Ja ja ... :oops: ... mein fehler

5. kau ... kau ... kau ... wupp es funktioniert. :D

mfg OliverL

Gesperrt