Welches Template System?

Hallo ...

Gumbo ... ich versuche gerade etwas über Template herauszufinden da meine Projekte zur Zeit ein Eintopf aus HTML-Schnipsel, PHP-Stücken und CSS ist: kurz: schlimm aussieht.

Kannst du mir erklären, wie man sich ein Templatesystem aufbaut.
 
Prinzipiell läuft es wie folgt ab:
  • Vorlage wird geladen
  • Variablen-/Platzhalter-Wertepaare werden bestimmt
  • verarbeitete Vorlage wird zurückgegeben
Soll daraus eine Klasse entstehen, würde diese also sinnvollerweise drei Methoden benötigen (es geht auch mit weniger), etwa:
PHP:
class Template
{
	private $_vars;
	private $_template;

	public function __construct()
	{
		$this->_vars = array();
		$this->_template = '';
	}

	public function setTempalte( $str )
	{
		$this->_template = $str;
	}

	public function assignVar( $name, $value )
	{
		$this->_vars[$name] = $value;
	}

	public function getCompiledTemplate()
	{
		$retVal = $this->_template;
		foreach( $this->_vars as $key => $value ) {
			$retVal = str_replace('{'.$key.'}', $value, $retVal);
		}
		return $retVal;
	}
}
Das Ganze könnte aber auch mit einer Änderung der getCompiledTemplate()-Methode als alleinstehende Funktion gelöst werden:
PHP:
function getCompiledTemplate( $template, $vars )
{
	foreach( $vars as $key => $value ) {
		$template = str_replace('{'.$key.'}', $value, $template);
	}
	return $template;
}
 
Öhm... Ich verstehe net so ganz, was eine TemplateEngine mit dem Cachen von SQL-Abfragen zutun haben soll?!

Smarty "kompiliert" quasi das Template, um es nicht bei jedem Seitenaufruf neu parsen zu müssen. Aus sowas wie

PHP:
<h1>{$ueberschrift}</h1>

"kompiliert" Smarty dann

PHP:
<h1><?php echo $ueberschrift ?></h1>

Vermutlich meint ihr das damit, oder ist es einfach schon zu spät?! :)

MfG. Daniel
 
Hallo Gumbo;

in den letzten Wochen habe ich versucht mich in der Template-Geschichte einzuarbeiten und ich komme nicht wirklich weiter!

Ein Grund ist sicher, dass mir viele Erklärungen zu hoch sind.

Also: gerade versuch ich SMARTY zu nutzen, aber das was ich eigentlich (nur) machen will; also den HTML-Kram und den PHP-Kram sauber voneinander zu trennen; scheint bei SMARTY nur nebensache zu sein, denn die haben ne dicke Beschreibung von irgend welchen anderen Funktionen wie: Wörterzählen; Zeichenketten formatieren; in Großbuchstaben umwandeln ... also eine Sammlung von Funktionen, die ich nicht brauche.

was ich will ist eigentlich das:


eine "index.php" -> Basisdatein in der alles zusammengefügt wird

im Ordner tpl:
index.tpl -> das Grundgerüst
kopf.tpl -> der "Baustein Kopf" der in der index.tpl eingefügt werden soll
content.tpl -> der "Baustein Content" der in der index.tpl eingefügt werden soll
fuss.tpl -> der "Baustein Fuss" der in der index.tpl eingefügt werden soll

im Ordner php:
kopf.php -> Berechnungen / Funktionen / Datenbankabruf für kopf.tpl
content.php -> Berechnungen / Funktionen / Datenbankabruf für content.tpl
fuss.php -> Berechnungen / Funktionen / Datenbankabruf für fuss.tpl

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Mir stellt sich auch die Frage, ob es nicht doch nur Wunschdenken ist (von mir), PHP und HTML sauber trennen zu können. Zum Beispiel hier ein CODE um einen Kalender anzuzeigen:

PHP:
<?php


    /* --------------------------- Konstanten ANFANG --------------------------- */
    $wochen_tage = array("Sonntag", "Montag", "Dienstag", "Mittwoch","Donnerstag", "Freitag", "Samstag");
    $alle_monate = array("Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli","August", "September", "Oktober", "November", "Dezember");
    $monats_anfag = 1;
    $monats_anzahl = 6;// Menge der Monate die untereinander angezeigt werden sollen (&uuml;ber 350 kommt ne Fehlermeldung)
    $heute = time();
    /* --------------------------- Konstanten ENDE --------------------------- */
    for ($x=0;$x <= $monats_anzahl;$x++){
        if ($x==0){
            $datum = $heute;
            $tag = date("j", $datum);
            $monat = date("n", $datum);
            $jahr = date("Y", $datum);
            $tagderwoche = date("w", $datum);
            $monats_ende = date("t", $datum);
            $monatstag_name= $alle_monate[$monat-1];
            /* --------------------------- Feiertage ANFANG --------------------------- */
            $neujahr = date("d-m-Y", mktime(0, 0, 0, 1, 1, $jahr));// echo "Neujahr ".$neujahr;
            $karfreitag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))-2), $jahr));
            $ostersonntag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), date("d", easter_date($jahr)), $jahr));// echo "Ostersonntag ".$ostersonntag."<br>\n";
            $ostermontag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+1), $jahr));// echo "Ostermontag ".$ostermontag."<br>\n";
            $christi_himmelfahrt = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+39), $jahr));// echo "christi_himmelfahrt ".$christi_himmelfahrt."<br>\n";
            $pfingstsonntag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+49), $jahr));// echo "pfingstsonntag ".$pfingstsonntag."<br>\n";
            $pfingstmontag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+50), $jahr));// echo "pfingstmontag ".$pfingstmontag."<br>\n";
            $deutsche_einheit = date("d-m-Y", mktime(0, 0, 0, 10, 3, $jahr));// echo "deutsche_einheit ".$deutsche_einheit."<br>\n";
            $erster_mai = date("d-m-Y", mktime(0, 0, 0, 5, 1, $jahr));// echo "erster_mai ".$erster_mai."<br>\n";
            $weihnachten_erster = date("d-m-Y", mktime(0, 0, 0, 12, 25, $jahr));// echo "weihnachten_erster ".$weihnachten_erster."<br>\n";
            $weihnachten_zweiter = date("d-m-Y", mktime(0, 0, 0, 12, 26, $jahr));// echo "weihnachten_zweiter ".$weihnachten_zweiter."<br>\n";
            /* --------------------------- Feiertage ENDE --------------------------- */

        }else {
        /* --------------------------- Neutag ANFANG Wechsel vom alten Jahr ins neue --------------------------- */
            if (($monat+1)>=13){
                $monat = 1;
                $jahr = $jahr+1;
            }else {
                $monat = $monat+1;
            }

            $datum = mktime(0, 0, 0, $monat, $monats_anfag, $jahr);
            $tag = date("j", $datum);
            $monat = date("n", $datum);
            $jahr = date("Y", $datum);
            $tagderwoche = date("w", $datum);
            $monats_ende = date("t", $datum);
            $monatstag_name= $alle_monate[$monat-1];
            /* --------------------------- Neutag ENDE --------------------------- */
            /* --------------------------- Feiertage ANFANG --------------------------- */
            $neujahr = date("d-m-Y", mktime(0, 0, 0, 1, 1, $jahr));// echo "Neujahr ".$neujahr;
            $karfreitag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))-2), $jahr));
            $ostersonntag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), date("d", easter_date($jahr)), $jahr));// echo "Ostersonntag ".$ostersonntag."<br>\n";
            $ostermontag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+1), $jahr));// echo "Ostermontag ".$ostermontag."<br>\n";
            $christi_himmelfahrt = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+39), $jahr));// echo "christi_himmelfahrt ".$christi_himmelfahrt."<br>\n";
            $pfingstsonntag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+49), $jahr));// echo "pfingstsonntag ".$pfingstsonntag."<br>\n";
            $pfingstmontag = date("d-m-Y", mktime(0, 0, 0, date("m", easter_date($jahr)), ((date("d", easter_date($jahr)))+50), $jahr));// echo "pfingstmontag ".$pfingstmontag."<br>\n";
            $deutsche_einheit = date("d-m-Y", mktime(0, 0, 0, 10, 3, $jahr));// echo "deutsche_einheit ".$deutsche_einheit."<br>\n";
            $erster_mai = date("d-m-Y", mktime(0, 0, 0, 5, 1, $jahr));// echo "erster_mai ".$erster_mai."<br>\n";
            $weihnachten_erster = date("d-m-Y", mktime(0, 0, 0, 12, 25, $jahr));// echo "weihnachten_erster ".$weihnachten_erster."<br>\n";
            $weihnachten_zweiter = date("d-m-Y", mktime(0, 0, 0, 12, 26, $jahr));// echo "weihnachten_zweiter ".$weihnachten_zweiter."<br>\n";
            /* --------------------------- Feiertage ENDE --------------------------- */
        }


        echo "
            <div class='kalender_kalenderblatt_box_monatstext' id='kalender_heute'>
                <p class='kalender_kalenderblatt_monatstext'>".$monatstag_name."&nbsp;".$jahr."</p>
            </div>
            <div class='kalender_kalenderblatt_woche_wochentage' id='kalender_hintergrund'>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>MO</p></div>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>DI</p></div>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>MI</p></div>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>DO</p></div>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>FR</p></div>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>SA</p></div>
                <div class='kalender_wochentagsnamen' id='leer'><p class='kalender_kalenderblatt_wochentagtext'>SO</p></div>
            </div>
            <div class='kalender_kalenderblatt_woche' id='kalender_hintergrund'>\n";

        for ($i=0;$i < date("w", mktime(0, 0, 0, $monat, 0, $jahr)); $i++){
            echo "  <div class='kalender_kalenderblatt' id='kalender_leer'><p class='kalender_kalenderblatt_text_01'>&nbsp;</p></div>\n";
        }

        for ($k=$monats_anfag; $k <= $monats_ende; $k++){
            $aktueller_wtag = date("w", mktime(0, 0, 0, $monat, $k, $jahr));
            $aktueller_tag = mktime(0, 0, 0, $monat, $k, $jahr); // HIER MUSS GEPRFUEFT WERDEN, OB DER TAG EINE VERANSTALTUNG ENTHAELT

            $anfrage_id = @mysql_query("SELECT * FROM veranstaltungen WHERE `veranstaltungszeit` = '".$aktueller_tag."'");
            if (!$anfrage_id){
                die ("Die Anfrage zur Tabelle \"veranstaltungskalender_user\" ist <span id='rot'>FEHLGESCHLAGEN</span><br />");
            }
            $veranstaltungspruefung = mysql_fetch_array($anfrage_id); // dieses Datum wird mit dem Datum "aktueller Tag" verglichen unterhalb bei "veranstaltung"


            if (date("d-m-Y") == date("d-m-Y", $aktueller_tag)){// $heute_tag
                echo "  <div class='kalender_kalenderblatt_link' id='kalender_heute' onclick='javascript:self.location.href=\"kalender.php?veranstaltungs_tag_auswahl=".$aktueller_tag."\"'><p class='kalender_kalenderblatt_text_01'>$k</p></div>\n";
            }else if ($heute > $aktueller_tag){// Vergangene Tage grau
                echo "  <div class='kalender_kalenderblatt' id='kalender_damals'><p class='kalender_kalenderblatt_text_01'>$k</p></div>\n";
            }else if ($veranstaltungspruefung[veranstaltungszeit]==$aktueller_tag){// VERANSTALTUNG
                echo "  <div class='kalender_kalenderblatt_link' id='kalender_".$veranstaltungspruefung[veranstaltungstypen_id]."' onclick='javascript:self.location.href=\"kalender.php?veranstaltungs_tag_auswahl=".$aktueller_tag."\"'><p class='kalender_kalenderblatt_text_01'>$k</p></div>\n";
            }
            else if (date("w", $aktueller_tag)==0 or date("w", $aktueller_tag)==6){// Samstag und Sonntag
                echo "  <div class='kalender_kalenderblatt_link' id='kalender_wochenende' onclick='javascript:self.location.href=\"kalender.php?veranstaltungs_tag_auswahl=".$aktueller_tag."\"'><p class='kalender_kalenderblatt_text_01'>$k</p></div>\n";
            }else if ($neujahr == date("d-m-Y", $aktueller_tag) or $karfreitag == date("d-m-Y", $aktueller_tag) or $ostersonntag == date("d-m-Y", $aktueller_tag) or $ostermontag == date("d-m-Y", $aktueller_tag) or $christi_himmelfahrt == date("d-m-Y", $aktueller_tag) or $pfingstsonntag == date("d-m-Y", $aktueller_tag) or $pfingstmontag == date("d-m-Y", $aktueller_tag) or $deutsche_einheit == date("d-m-Y", $aktueller_tag) or $erster_mai == date("d-m-Y", $aktueller_tag) or $weihnachten_erster == date("d-m-Y", $aktueller_tag) or $weihnachten_zweiter == date("d-m-Y", $aktueller_tag)){// Feiertage
                echo "  <div class='kalender_kalenderblatt_link' id='kalender_feiertag' onclick='javascript:self.location.href=\"kalender.php?veranstaltungs_tag_auswahl=".$aktueller_tag."\"'><p class='kalender_kalenderblatt_text_01'>$k</p></div>\n";
            }else {
                echo "  <div class='kalender_kalenderblatt_link' id='kalender_normal' onclick='javascript:self.location.href=\"kalender.php?veranstaltungs_tag_auswahl=".$aktueller_tag."\"'><p class='kalender_kalenderblatt_text_01'>$k</p></div>\n";
            }

            if ($aktueller_wtag == 0 && $k !=$monats_ende ){//echo date("w", $aktueller_tag);
                echo "</div>\n<div class='kalender_kalenderblatt_woche' id='kalender_hintergrund'>\n";
            }
        }

        if (date("w", mktime(0, 0, 0, $monat, $monats_ende, $jahr)) > 0){
        for ($i=date("w", mktime(0, 0, 0, $monat, $monats_ende, $jahr));$i < 7;$i++){
            echo "  <div class='kalender_kalenderblatt' id='kalender_leer'><p class='kalender_kalenderblatt_text_01'>&nbsp;</p></div>\n";
        }
    }
    echo "</div>
    <div class='kalender_leerbox'>

    </div>\n";
}
?>
                    </div>
                    <!-- ########################################### SPALTE 3 ENDE ########################################### -->
                </div>
                <!-- ############################################################### HAUPTBOX ENDE ############################################################### -->

da ist es doch zum Beispiel unmöglich den HTML-CODE aus den "FOR-Schleifen" herauszulösen.
 
Nö, denn du könntest mit Smarty ja folgendes machen

PHP:
  [...]
  $dummesArray = array();
  $date = date("w", mktime(0, 0, 0, $monat, 0, $jahr));
  for($n = 0; $n < $date; $n++) {
    $dummesArray[$n] = "blub";
  }

  $smarty->assign("date_tpl", $dummesArray);
  [...]

PHP:
  {foreach from=$dummesArray item=dummesItem}
    <div class='kalender_kalenderblatt' id='kalender_leer'><p class='kalender_kalenderblatt_text_01'>&nbsp;</p></div>
  {/foreach}

Das geht mit SICHERHEIT auch schöner, aber unmöglich ist es schonmal nicht ;)

EDIT:
Und so bekommst du auch deine andere for-schleife mit einem Templatesystem hin

PHP:
	$kblaetter_Arr = array();

  for ($k=$monats_anfag; $k <= $monats_ende; $k++){
		array_push($kblaetter_Arr, array());
		$kb_idx = sizeof($kblaetter) - 1;
						
		$kblaetter_Arr[$idx]['akt_wtag'] = date("w", mktime(0, 0, 0, $monat, $k, $jahr));
		$kblaetter_Arr[$idx]['akt_tag'] = mktime(0, 0, 0, $monat, $k, $jahr); // HIER MUSS GEPRFUEFT WERDEN, OB DER TAG EINE VERANSTALTUNG ENTHAELT

    $anfrage_id = @mysql_query("SELECT * FROM veranstaltungen WHERE `veranstaltungszeit` = '".$aktueller_tag."'");
    if (!$anfrage_id){
	    die ("Die Anfrage zur Tabelle \"veranstaltungskalender_user\" ist <span id='rot'>FEHLGESCHLAGEN</span><br />");
    }

    $veranstaltungspruefung = mysql_fetch_array($anfrage_id); // dieses Datum wird mit dem Datum "aktueller Tag" verglichen unterhalb bei "veranstaltung"


    if (date("d-m-Y") == date("d-m-Y", $aktueller_tag)){// $heute_tag
			$kblaetter_Arr[$idx]['typ'] = "heute";
    }else if ($heute > $aktueller_tag){// Vergangene Tage grau
			$kblaetter_Arr[$idx]['typ'] = "vergangenerTag";
    }else if ($veranstaltungspruefung[veranstaltungszeit]==$aktueller_tag){// VERANSTALTUNG
			$kblaetter_Arr[$idx]['typ'] = "veranstaltung";						
    }else if (date("w", $aktueller_tag)==0 or date("w", $aktueller_tag)==6){// Samstag und Sonntag
			$kblaetter_Arr[$idx]['typ'] = "samstagusonntag";
    }else if ($neujahr == date("d-m-Y", $aktueller_tag) or $karfreitag == date("d-m-Y", $aktueller_tag) or $ostersonntag == date("d-m-Y", $aktueller_tag) or $ostermontag == date("d-m-Y", $aktueller_tag) or $christi_himmelfahrt == date("d-m-Y", $aktueller_tag) or $pfingstsonntag == date("d-m-Y", $aktueller_tag) or $pfingstmontag == date("d-m-Y", $aktueller_tag) or $deutsche_einheit == date("d-m-Y", $aktueller_tag) or $erster_mai == date("d-m-Y", $aktueller_tag) or $weihnachten_erster == date("d-m-Y", $aktueller_tag) or $weihnachten_zweiter == date("d-m-Y", $aktueller_tag)){// Feiertage
			$kblaetter_Arr[$idx]['typ'] = "feiertag";
    }else {
			$kblaetter_Arr[$idx]['typ'] = "irgendwas anderes da kein kommentar...";
  }

  if ($aktueller_wtag == 0 && $k !=$monats_ende ){//echo date("w", $aktueller_tag);
		//Was hier passiert weiß ich auch net... Oo
  }

  $smarty->assign("kalenderblaetter", $kblaetter_Arr);
  $smarty->assign("konstanten" $deine_wilden_konstanten_von_oben);

Das durchläufst du mit deiner for-schleife und gibst je nach Typ des Tages was anderes aus...
 
Zuletzt bearbeitet:
lol, was manche Leute für Probleme haben.

PHP ist ursprünglich eine Template Sprache und hat in all den Jahren nichts davon verloren. Wer Anwendungslogik mit Dsignlogik vermischt, nur weil man keine externe, pasende Lib findet, der sollte überlegen ob PHP wirklich das Richtige für einen ist.

Ich habs hier schon im Thread glaube ich gelesen und so sollte man es auch machen, wenn man es performant haben möchte. PHP als Template Engine nutzen. Eine einfache Klasse reicht dabei sogar schon.

Des weiteren kann man bei Smarty genauso gut das Chachen abstellen. Stellt sich nur die Frage wieviel Sinn das Chachen allgemein macht.

Wenn ich etwas in PHP schreibe, dann weil ich es gerne dynmaisch haben möchte. Sobald aber ein Grad von dynamik reingebracht wird ist cachen für ein solch kleines Template System nicht wirklich brauchbar.


Na dann viel Spaß euch, CerebrosuS
 
Hallo!
Du kennst vielleicht schon die Partnerseite von tutorials.de!? Auf jeden Fall gab es dort eine sehr schöne Debatte zu den verschiedenen Möglichkeiten und auch viele hilfreiche Codeschnipsel. Schau doch mal vorbei.
Mfg, Andy
 
Zurück