Template System - ist es eins oder ist es keins.

  • Themenstarter Themenstarter Lukasz
  • Beginndatum Beginndatum
L

Lukasz

Hallo

Ich habe ein kleines TPL Systemchen geschrieben, was von anderen abweicht. Deshalb frage ich mich, ob es eins ist oder nicht. Dahinter erfüllt es den Zweck oder auch nicht. Ich sehe mir oft andere Templatesysteme an, und merke, andere abrbeiten mit Klassen oder implode() etc... Das alles ist bei mir nicht der Fall.

Ich bin zwar kein Parser Spezialsit, habe aber das ganze so realisiert, dass der Name einer Variable eines Arrays oder einer Klasse in ihren Wert ersetzt wird. Das wars auch schon.

Als kleine Firewall ersetze ich $ in HTML Code falls es der Inhalt einer Variable sein sollte, damit keine unerwünschte Markierung auftaucht.

Also hier folgt der Code. Einige meinen, es hat nicht mit einem Templatesystem zu tun, aber es funktioniert doch so und erfüllt auch selbigen zweck. Eure Meinung bitte:


PHP:
//-----> Definition <------||
$_reg_comp[] = 'TPLLIB2.1';

//-----> Einstellungen <-----||
$_TPLLIB_TPLDIR = 'templates'; //Ordnername zum Templateordner ohne (/) am Ende! Auch absoluter Pfad möglich und http:// Pfad falls Templates auf einem anderen Server liegen.
$_TPLLIB_CACHE = 1; //1 -> Template Cache an. Hat den Vorteil dass der Server die Templates jeweils nur einmal von der HDD ausliest, und dann für ernuete Verwendungen im Speicher bereit hält bis das Script verarbeitet wurde. | 0 -> Template Cahce ist aus. Es wird jedes mal das Template von der HDD ausgelsen, verbleibt aber dafür nicht bis zum Scriptende im Speicher.



function call_return_value($notlocal_int) {
	if((eregi('->',$notlocal_int) && eregi('\[',$notlocal_int)) || eregi('->',$notlocal_int)) {
		$notlocal_int = explode('->', $notlocal_int);
		@eval('global $'.$notlocal_int[0].'; $notlocal_var = $'.$notlocal_int[0].'->'.$notlocal_int[1].';');
		return $notlocal_var;
	} elseif(eregi('\[',$notlocal_int)) {
		$notlocal_int_0 =  preg_replace("/([^\[]*)\[(.*)\]/",'\\1',$notlocal_int);
		$notlocal_int_1 =  preg_replace("/([^\[]*)\[(.*)\]/",'\\2',$notlocal_int);
		@eval('global $'.$notlocal_int_0.'; $notlocal_var = $'.$notlocal_int_0.'['.$notlocal_int_1.'];');
		return  $notlocal_var;
	} else {
		@eval('global $'.$notlocal_int.'; $notlocal_var = $'.$notlocal_int.';');
		return  $notlocal_var;
	}
	return ''; //empty
}



function call_template($tplname) {
	global $_TPLLIB_TPLDIR, $_TPLLIB_CACHE, $_TPLLIB_PROTOKOLL;
	if ($_TPLLIB_CACHE == 1) {
		global $TPLLIB_TEMPLATES;
		if (!isset($TPLLIB_TEMPLATES["$tplname"])) {	
			$TPLLIB_TEMPLATES["$tplname"] = @file_get_contents($_TPLLIB_TPLDIR.'/'.$tplname) ? file_get_contents($_TPLLIB_TPLDIR.'/'.$tplname) : die('TPLLIB ERROR 01: Ein Template ist nicht vorhanden! Das Template ('.$tplname.') konnte nicht gefunden werden.');
		}
	} else {
		$TPLLIB_TEMPLATES["$tplname"] = @file_get_contents($_TPLLIB_TPLDIR.'/'.$tplname) ? file_get_contents($_TPLLIB_TPLDIR.'/'.$tplname) : die('TPLLIB ERROR 01: Ein Template ist nicht vorhanden! Das Template ('.$tplname.') konnte nicht gefunden werden.');
	}
	$muster = array(
		'/(\$)([a-z0-9_]*\[[a-z0-9_\[\]\'"]*\])([^\]])/miUe',
		'/(\$)([a-z0-9_]*\[[a-z0-9_\[\]\'"]*\])([^\]])/miUe',
		'/(\$)([a-z0-9_]*|[a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*)([^a-z0-9->_\'"\[\]])/miUe',
		'/(\$)([a-z0-9_]*|[a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*)([^a-z0-9->_\'"\[\]])/miUe',
		'/(\$)([a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*|[a-z0-9_]*)([^a-z0-9_>\[\]])/miUe',
		'/(\$)([a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*\[[a-z0-9_\[\]\'"]*\]|[a-z0-9_]*->[a-z0-9_]*|[a-z0-9_]*)([^a-z0-9_>\[\]])/miUe',
	);
	return preg_replace($muster,"''.call_return_value('\\2').return_escape_template('\\3').''",$TPLLIB_TEMPLATES["$tplname"]);
}

function return_escape_template($int) {
	if ($int == '\"') {
		return '"';
	} else {
		return $int;
	}
}


function call_outlook_eml($tplname) {
	$tpl = call_template($tplname);
	$emlmuster = array(
	'/(.*)(Version[^0-9\.0-9])(.*)/si'
	);
	return preg_replace($emlmuster,'\\2\\3',$tpl);
}

Nun ist es eins oder ist es keins? Die Variablen schreibe ich einfach in die Templates rein, so wie wenn man es in PHP auch einschreiben würde.
 
Was ich daraus erkenne, ist, dass es PHP-Variablendeklarationen durch ihren Wert ersetzt. Liege ich da richtig? In dem Fall sind die PHP-Variablendeklarationen eben die Platzhalter. Und eine Template Engine ist meines Wissens nichts anderes als eine Software, die eine Vorlage nach Platzhaltern durchsucht und diese durch endgültige Werte ersetzt. Also kannst du das ruhig als Template Engine bezeichnen.

Aber irgendwie finde ich das auch etwas kompliziert. Denn eine Template Engine wird oft dafür eingesetzt, um die Datenverarbeitung (PHP-Skript) von der Ausgabe/Auszeichnung (HTML-Dokument) zu trennen. Wenn nun aber als Platzhalter reelle Veriablen eingesetzt werden, sind sie doch wieder stark miteinander verbunden, da die Platzhalter nicht in dem Maße frei wählbar sind wie sie es eigentlich sein sollte.
 
Ja das ist doch mal gut zu wissen. Ich habe früher schon öfter mit Platzhaltern gearbeitet. Doch da hatte ich das Problem für jeden dieser Platzhalter Variablen zu deklarieren und zweitens eben später die richtigen Variablen für die Platzhalter zu finden. So habe ich das eher aus Bequemlichkeit gemacht, dass ich eben einfach meine Arrays meine Variablen bis zu Klassen Variablen einfach so inst Template schreibe, wie in den PHP Code auch. Mit ein wenige Aussagekräftigen Variablennamen kann sich das auch gut warten lassen.

Doch eher habe ich gedacht, dass man Template mit implode() etc, bearbeiten sollte, konnte so aber auch keien besonderen Vor oder Nachteile finden.

Danke fürs Statemant, mir ging es eher darum, ob man sowas auch mal als TPL Systemchen der Freeware zuscheiben kann, oder ob eher das Thema verfehlt wurde. Und dein Beitrag hat mich ermutigt, doch nicht alles zu glauben, was alle so vor sich schlecht reden.
 
Zurück