Seite 1 von 2
dynamisches Layout
Verfasst: Di 3. Jun 2008, 21:28
von barnholdy
Hallo,
ist es möglich auf anderer Weise dynamisch Content auf Layouts zu platzieren als mit Modulen?
Mein Problem:
Ich möchte an mehreren Stellen im Head den Titel und auch die URL der aktuellen Seite sowie an diversen Stellen im Body dynamisch Klassennamen (für CSS) platzieren. Mit Modulen ist das sehr umständlich.
Ich würde mich freuen, wenn es eine Lösung gäbe.
Verfasst: Di 3. Jun 2008, 22:20
von unblack
Ich weiß nicht, wie tief du in Contenido drinsteckst und "wie dynamisch" du es willst, denn du musst dir ein eigenes Modul schreiben. Aber mal nachfolgend n Ansatz. Kann auch sein, dass schon was adäquates im Forum rumfliegt.
Modul müsste einfach nur im input ne Variable definierbar machen, nach der Du Dein css selektierst:
Code: Alles auswählen
echo "<select name='"."CMS_VAR[10]"."'>";
echo "<option value=''>keine Auswahl</option>";
echo "<option value='A'"; if( "CMS_VALUE[10]" == "A" ) { echo " selected"; } echo ">css A</option>";
echo "<option value='B'"; if( "CMS_VALUE[10]" == "B" ) { echo " selected"; } echo ">css B</option>";
echo "<option value='C'"; if( "CMS_VALUE[10]" == "C" ) { echo " selected"; } echo ">css C</option>";
echo "<option value='D'"; if( "CMS_VALUE[10]" == "D" ) { echo " selected"; } echo ">css D</option>";
echo "</select>";
und im output muss ein switch oder if rein
Code: Alles auswählen
if( "CMS_VALUE[10]" == "A" ) { css-Defintion für A } else { usw }
Das Modul setzt du in den header und kannst dann, je nachdem was du im switch/if definiert hast direkt, in die tags reinparsen wie meinetwegen
Also am Besten wär's du definierst unterschiedliche externe css files, die du in dem Modul auswählst.
Verfasst: Di 3. Jun 2008, 22:50
von OliverL
Gebe unblack recht!!!!
Externe CSS-Datei und dann separieren.
wie bei style.css für das Konstrukt und Extras (Menü, Rss, Infoboxen, Teaser) und tiny.css für die Definitionen im Content-Bereich (H[1-9],p,a,table...).
Wenn ein Farbschema herauskommen soll semtlichen dynamischen Farben aus der style.css und tiny.css raus lassen und in die extra, über das Modul dfinierte CSS-Datei setzen.
INPUT
Code: Alles auswählen
$aCSS_files = array("file_rot.css","file_blau.css","file_gruen.css","file_gelb.css");
echo '<select name="'."CMS_VAR[10]".'" class="text_medium">';
echo '<option value="">keine Auswahl</option>';
foreach( $aCSS_files as $sCSS_file ) {
echo '<option value="'.$sCSS_file.'"'.( "CMS_VALUE[10]" == $sCSS_file ? " selected":'').'>'.$sCSS_file.'</option>';
}
echo "</select>";
OUTPUT - im header
Code: Alles auswählen
<?php echo ("CMS_VALUE[10]" ? '<link rel="stylesheet" href="css/'."CMS_VALUE[10]".'" type="text/css" media="screen">':''); ?>
Als keines Betthüpfelcher mal den Code gekürzt ...

Hatte heute auch eine ähnliche Idee für ein modul das mir div. Sprachspezifischen Mandanten einstellungen macht. Mit auslesen des css und js Verzeichnis. Und klassifizierung der CSS-Datei (Screen, Print, Default, Handheld ...). Gucken ob ich das morgen zusammen haue.
Verfasst: Mi 4. Jun 2008, 06:51
von tinof
Verfasst: Mi 4. Jun 2008, 07:56
von OliverL
(Immer wieder überraschend wie viele sich hier im Forum beteiligen)
Als Basis sicher auch gut (was ich so in der codierten XML-Datei gesehen hab).
Fehlt nur die Auswahl des media-Type dann wäre es schon optimal für mehrere CSS-Files.
Für ein normales Farbschema würde ich unblack's (bzw. meine darauf aufsetzende) Variante nehmen da dann eine Datei ausreicht.
Oder im Output von baumpaul den media-Type ergänzen.
mfg OliverL
Verfasst: Mi 4. Jun 2008, 08:04
von tono
zur Ursprungsfrage: Kann man auch ohne Module was dynamisch machen?
Ja, man kann auch einfach php-Code in das Layout schreiben. Das ist manchmal bei einfachen Operationen schneller gemacht als ein neues Modul, ist allerdings nicht so übersichtlich, wie alles in Modulen zu haben.
Verfasst: Mi 4. Jun 2008, 08:44
von OliverL
back to basic
Ja, kann man wie tono schon sagte.
> Quick and dirty <
Wenn du dynamisch diverse Sachen einplegen willst brauchst du aber eine bestimmte Konstante an der du dich orientieren kannst.
s. Beispiel: Logo - hier ist es die $lang (ID der aktiven Sprache)
s. Beispiel: Begrüßungen - hier ist es die aktuelle Stunde in 24er von date()
Individualisierung für Sprachen:
(setzt voraus das entsprechend ein Bild vorhanden ist)
Für zeit gesteuerte Begrüßungen:
(Komplexer)
Code: Alles auswählen
<?php
$sTime_h = date("G");
if( $sTime_h >= 3 and $sTime_h <= 10 ) echo "Guten morgen!";
elseif( $sTime_h > 10 and $sTime_h <= 15 ) echo "Mahlzeit!";
elseif( $sTime_h > 15 and $sTime_h <= 21 ) echo "Nabend!";
elseif( ( $sTime_h > 21 and $sTime_h <= 24 ) or ( $sTime_h > 0 and $sTime_h < 3 ) ) echo "Nacht!";
?>
Man kann sich denn Kompletten Code der einzelnen Seiten auch in der DB-Tabelle con_code anschen (hier wird diese gecacht).
Der gecachte Code wird behandelt wie eine PHP-Datei.
Somit ist alles das möglich was in PHP möglich ist.
mfg Oliver
Verfasst: Mi 4. Jun 2008, 08:44
von unblack
Ich habe da neulich n sehr seltsamen Effekt beobachtet (kann auch sein, dass der schon mal hier diskutiert wurde). Ich hatte n sehr langen switch direkt im Layout. Ab einer bestimmten Zeichenzahl zwischen <? und ?> hat er das Layout abgeschossen. D.h., es wurde gespeichert, aber nicht mehr im Layout-Editor angezeigt.
Nachdem wir alles in ein Modul gepackt haben, ging es.
Verfasst: Mi 4. Jun 2008, 10:14
von tono
unblack hat geschrieben:Ab einer bestimmten Zeichenzahl zwischen <? und ?> hat er das Layout abgeschossen.
Interessant. Hab ich noch nichts davon gehöhrt, klingt aber nach einem Fehler bzw. einer Beschränkung der PHP-regexp Unterstützung. Vielleicht gehts mit einer anderen PHP-Version.
Verfasst: Mi 4. Jun 2008, 10:36
von OliverL
@tono:
wird nicht der gesamte Code durchs eval() ausgegeben?
wo sollen denn da eine RegEx sein?
(Wenn ich weiss wo ich schauen muss guck ich mir das RegEx-Muster mal an)
Verfasst: Mi 4. Jun 2008, 14:01
von barnholdy
Danke für die Antworten.
Die Lösung mit den dynamisch erstellten Links auf CSS-Dateien ist nicht das was ich wollte.
Eventuell ist es besser, weil php und html getrennt bleiben.
Mein Problem war, dass ich viele automatisch zu generierende Daten möglichst zentral (in einem Modul) erstelle und dann an diversen Stellen im Layout platziere und nicht für jede der Daten ein extra Modul benötige. Das war evtl. nicht so auf den Punkt formuliert.
Ich mache es jetzt so, dass ich ein Modul habe, welches die Daten erzeugt und in Konstanten speichert. Diese lese ich dann im Layout aus (mit <? echo KONSTANTE;?>). Das funktioniert auch so. Mit zu langem php-code im Layout hatte ich auch Probleme.
Wenn es noch eine bessere Möglichkeit gibt, bin ich offen dafür.
Vielen Dank nochmal an alle.
Verfasst: Mi 4. Jun 2008, 14:25
von unblack
Na für so was nehme ich die html-templates (dazu sind die ja da) mit Platzhaltern für Variablen, die dann vom Modul entsprechend geparst werden.
Verfasst: Mi 4. Jun 2008, 15:00
von barnholdy
Das Problem ist ja das mein Template das Contenido-Layout ist. Ich weiß nicht, ob es beim Aufruf der Module schon aus der Datenbank rausgeholt wurde und im Code verfügbar ist. Sonst macht es ja keinen Sinn. Wenn ja, wie kann man darauf zugreifen?
Das wäre ja eine saubere Alternative.
Verfasst: Mi 4. Jun 2008, 16:01
von unblack
layout != html-templates
Im Layout definierst du dein HTML-Grundgerüst (mit html, body usw).
Dann nimmst du den Teil, der später dynamisch sein soll von/bis aus dem Layout raus und packst ihn in ein neues html-template und setzt an die "dynamischen" Stellen Platzhalter für die Variablen
Dann setzt du im Modul output ne neues template
Code: Alles auswählen
// generate html output
cInclude('classes', 'class.template.php');
if (!is_object($itpl)) {
$itpl = new Template;
}
$itpl->reset();
ersetzt die vars in deinem switch
Code: Alles auswählen
switch( "CMS_VALUE[10]" ) {
case 'A' :
$itpl->set('s', 'VARIABLE_A', "wert");
$itpl->set('s', 'VARIABLE_B', "wert");
break;
case 'B' :
$itpl->set('s', 'VARIABLE_A', "wert2");
$itpl->set('s', 'VARIABLE_B', "wert2");
}
und generierst den output
Code: Alles auswählen
$itpl->generate($cfgClient[$client]["path"]["frontend"].'templates/meintemplate.html');
Zentraler und sauberer kannst du es nicht machen. Ist aber grad aus dem Gedächtnis hingeschmiert und draußen lärmt eine schreckliche Blaskapelle, daher übernehme ich grad keine Verantwortung für das was ich schreibe

Verfasst: Mi 4. Jun 2008, 16:07
von tono
OliverL hat geschrieben:
wird nicht der gesamte Code durchs eval() ausgegeben?
wo sollen denn da eine RegEx sein?
(Wenn ich weiss wo ich schauen muss guck ich mir das RegEx-Muster mal an)
Er schrieb der switch war im Layout. Das Layout wird geregexpt (<-- gibts das Verb

) um die Container zu finden. Meiner Vermutung nach könnte dort ein Fehler sein, aber ich habs weder ausprobiert noch angeguckt. War eine intuitiv-Diagnose.