• Wir werden in den nächsten Tagen verschiedene Wartungsoperationen und Optimierungen am Server durchführen. Es wird zu mehreren Ausfällen kommen, die teilweise auch mehrere Stunden umfassen können.

Hilfen zu Templates

Joined
Sep 10, 2004
Messages
6,765
Points
0
Nach numehr einem Monat Lustlosigkeit in Sachen Coding will ich mich jetzt mal wieder ein bisschen mit der Materie beschäftigen, bevor im März die nächsten großen Klausuren anstehen.

Ich bin nun beim Themengebiet OOP und u.a. auch bei den viel erwähnten Templates hängengeblieben. Ich habe mir dabei schon diverse Tutorials angesehen, komme aber auf keinen Nenner, da die meisten davon entweder elendig lang sind und/oder man die Vorgehensweise nicht versteht, zumal es anscheinend jeder Coder anders macht. Kurz gesagt, ist der Funke einfach noch nicht übergesprungen und daher frag ich hier mal an, ob jemand gute Tuts kennt, die man mit Semikenntnissen bewältigen kann, ohne viel Zeit aufwenden zu müssen.
 
Es gibt keine eindeutige Meinung über Templates, zB. ist es für einige ok wenn noch php stücke imn den Templates übrig bleiben, andere, wie ich ^^, wollen eine strikte trennung und die arbeitsweise der scripte ist auch völlig anders.

Willst du jetzt erstmal OOP lernen, oder hast du dies schon einigermaßen verstanden, oder willst du templates machen ?? ich kann dir gerne mal meine klasse zeigen und genau erklären, es gibt nicht gerade viele punkte, die ein templatesystem können muss :)

( es muss nur wissen wo es anfängt, aus der template sehen können, ob es weitere templates laden muss, was ja so gedacht ist, und variablen inhalt ersetzen. danach folgt dann auch schon die ausgabe )
 
Mhm, ich würde mir gern mal deine Klasse anschauen und dann ggf Fragen stellen, wenn ich bei bestimmten Punkten nicht weiterkomme.

Das Tut von tutorials.de ist mir zu flach, das kann sogut wie nix und das von proggen.net war unendlich lang. Das bei Yubb.de ist auch seltsam und dann war da noch eins bei webmasterpro wo ich noch nicht groß durchgeschaut habe.

Bis dato hab ich alles "hardcoded". Sprich, das Aussehen (Struktur, der Rest war extern in einem Stylesheet) der Ausgabe war bereits im Skript festgelegt, was etwaig Änderungen im Nachhinein natürlich erschwert. Aber für mein kleines Anfängertestprojekt hats gereicht. Jetzt treibt mich der Fortschritt :p
 
gerne, hier:

PHP:
<?php
class tpl 
{
// function __construct Variable
var $template	= array(); 
// function tpl_get() Variablen
var $get		= array();
var $pre		= array();
// function tpl_edit_tpl() Variablen
var $preg		= array();

// Konstrukt
function tpl($template,&$sql=NULL)
{
if(is_array($template))
	{
	for ($i=0;$i<count($template);$i++)
	if (array_search($template[$i],$this->pre)===false)
		$this->template[] = & $template[$i];
	}
else
	if (array_search($template,$this->pre)===false)
		$this->template[] = & $template;
if (isset($sql))
	{
	$this->sql = &$sql;
	$this->tpl_get_sql();
	}
else
	$this->tpl_get_ftp();
$this->tpl_edit_var();
$this->tpl_edit_tpl();
$this->tpl_output();
}

// Templatedaten per FTP ( Falls es mit Unterordner sein soll .$this->preg[$this->get[GLOBAL_PATH[$i]]].'/'. )
function tpl_get_ftp()
{
for ($i=0;$i<count($this->template);$i++) // StammTemplates werden geladen
if(!file_exists(GLOBAL_PATH.'templates/'.$this->template[$i].'.tpl.php'))
	return $this->tpl_errmsg('Die Template <code>'.$this->template[$i].'.tpl.php</code> existiert nicht!');
else
	$this->get[$this->template[$i]]=implode('',file(GLOBAL_PATH.'templates/'.$this->template[$i].'.tpl.php'));
$this->pre = $this->template;
for ($i=0;$i<count($this->pre);$i++) //SubTemplates werden geladen
	{
	preg_match_all('%{([^$](.+))}%iU',$this->get[$this->pre[$i]],$this->preg[$this->pre[$i]]);
	for ($n=0;$n<count($this->preg[$this->pre[$i]][0]);$n++)
		{
		if(preg_match('%^{!.+}$%iU',$this->preg[$this->pre[$i]][0][$n]))
		$this->preg[$this->pre[$i]][1][$n] = $GLOBALS['_tpl'][$this->preg[$this->pre[$i]][2][$n]];
		if (!is_string($this->preg[$this->pre[$i]][1][$n]))
			return $this->tpl_errmsg('Die Templatevariable <code>'.$this->preg[$this->pre[$i]][1][$n].'</code> ist kein string oder nicht definiert!<br>');
		elseif(!file_exists(GLOBAL_PATH.'templates/'.$this->preg[$this->pre[$i]][1][$n].'.tpl.php'))
			return $this->tpl_errmsg('Die Template <code>'.$this->preg[$this->pre[$i]][1][$n].'.tpl.php</code> existiert nicht!<br>');
		else
			{
			if (array_search($this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n],$this->pre)===false)
				$this->get[$this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n]]=implode('',file(GLOBAL_PATH.'templates/'.$this->preg[$this->pre[$i]][1][$n].'.tpl.php'));
			$this->pre[] = $this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n];
			}
		}
	}
}

// Templatedaten per SQL ( Die TemplateDaten müssen in der Spalte 'inhalt' stehen )
function tpl_get_sql()
{
$query['tpl_template'] = "SELECT `inhalt` FROM `template` WHERE "; // StammTemplates werden geladen
for ($i=0;$i<count($this->template);$i++) 
$tpl_query[] = "`name`='".$this->template[$i]."'";
$query['tpl_template'] .= implode(' OR ',$tpl_query);
$this->sql->db_query($query); unset($query);
if (empty($this->sql->fetch['tpl_template']))
	return $this->tpl_errmsg('Die Template(s) konnte(n) in der Datenbank nicht gefunden werden!');
$this->pre = $this->template;
for ($i=0;$i<count($this->sql->fetch['tpl_template']);$i++)
$this->get[$this->pre[$i]] = $this->sql->fetch['tpl_template'][$i]['inhalt'];
for ($i=0;$i<count($this->pre);$i++) //SubTemplates werden geladen
	{
	unset($tpl_query);
	unset($this->sql->fetch);
	preg_match_all('%{([^$](.+))}%iU',$this->get[$this->pre[$i]],$this->preg[$this->pre[$i]]);
	for ($n=0;$n<count($this->preg[$this->pre[$i]][0]);$n++)
		{
		if(preg_match('%^{!.+}$%iU',$this->preg[$this->pre[$i]][0][$n]))
		$this->preg[$this->pre[$i]][1][$n] = $GLOBALS['_tpl'][$this->preg[$this->pre[$i]][2][$n]];
		$query['tpl_template'] = "SELECT `inhalt` FROM `template` WHERE `name`='".$this->preg[$this->pre[$i]][1][$n]."'";
		$this->sql->db_query($query); unset($query);
		if (!is_string($this->preg[$this->pre[$i]][1][$n]))
			return $this->tpl_errmsg('Die Templatevariable <code>'.$this->preg[$this->pre[$i]][1][$n].'</code> ist leer oder nicht definiert!<br>');
		elseif (empty($this->sql->fetch['tpl_template']))
			return $this->tpl_errmsg('Die Template konnte in der Datenbank nicht gefunden werden!');
		else
			{
			if (array_search($this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n],$this->pre)===false)
			$this->get[$this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n]] = $this->sql->fetch['tpl_template'][0]['inhalt'];
			$this->pre[] = $this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n];
			}
		}
	}
}

// Ersetzen der pseudo-Variablen ( Variable: { VARNAME } )
function tpl_edit_var()
{
for ($i=0;$i<count($this->pre);$i++)
	{
	preg_match_all('%{\$(.*)}%iU',$this->get[$this->pre[$i]],$preg);
	if (isset($preg[0]))
		{
		for ($n=0;$n<count($preg[0]);$n++)
			$count[$i][] = count($GLOBALS['_tpl'][$preg[1][$n]]);
		$max[$i] = (is_array($count[$i])) ? max($count[$i]) : 0;
		}
	$getbackup = $this->get[$this->pre[$i]];
	for ($n=0;$n<$max[$i];$n++) // Falls Arrays als Variablen gesetzt wurden
		{
		for ($m=0;$m<count($preg[0]);$m++)
			if (isset($GLOBALS['_tpl'][$preg[1][$m]]))
				if (is_array($GLOBALS['_tpl'][$preg[1][$m]]))
					$this->get[$this->pre[$i]] = str_replace($preg[0][$m],$GLOBALS['_tpl'][$preg[1][$m]][$n],$this->get[$this->pre[$i]]);
				else
					$this->get[$this->pre[$i]] = str_replace($preg[0][$m],$GLOBALS['_tpl'][$preg[1][$m]],$this->get[$this->pre[$i]]);
			else
				return $this->tpl_errmsg('Die Variable <code>'.$preg[1][$m].'</code> ( Template: <code>'.substr_replace($this->pre[$i],'',0,strrpos($this->pre[$i],__)).'.tpl.php</code> ) ist  in <code>$GLOBALS</code> nicht zu finden!');
		if ($n!=($max[$i]-1))
			$this->get[$this->pre[$i]] = $this->get[$this->pre[$i]].$getbackup;	
		}
	}
}

// Einfügen der SubTemplates und PseudoSubTemplates ( SubTemplate: { TEMPNAME } PseudoSubTemplates: {!TEMPNAME} )
function tpl_edit_tpl()
{
for ($i=count($this->pre);$i>=0;--$i)
	for ($n=0;$n<(count($this->preg[$this->pre[$i]][0]));$n++)
		$this->get[$this->pre[$i]] = str_replace($this->preg[$this->pre[$i]][0][$n],$this->get[$this->pre[$i].'__'.$this->preg[$this->pre[$i]][1][$n]],$this->get[$this->pre[$i]]);
}

// Output
function tpl_output()
{
#ob_start('ob_gzhandler');
for($i=0;$i<count($this->template);$i++)
	echo $this->get[$this->template[$i]];
#ob_end_flush();
exit(0);
}

// Fehlermeldungen
function tpl_errmsg($errormsg)
{
if ($_SESSION['error']===true)
	{
	global $mailto;
	$errormsg	= '<pre><b>Fehler in der Template Klasse</b><br><br>'.$errormsg.'<br>Bitte probieren sie es erneut oder wenden sie sich an <a href="mailto:'.$mailto['name'].'%20%3C'.$mailto['email'].'%3E?subject=Fehler%20bei%20den%20Templates&body=Fehler:%20'.text_emailcodierung($errormsg).'%0D%0ADatum:%20'.date('d.m.Y%20@%20H:i').'%0D%0AUrl:%20'.getenv('REQUEST_URI').'">'.$mailto['email'].'</a><br>';
	$errormsg .= '-----------------------------<br>';
	$errormsg	.= '<b>Datum: </b>'.date('d.m.Y @ H:i').'<br>';
	$errormsg	.= '<b>Url: </b>'.getenv('REQUEST_URI').'<br>';
	$errormsg	.= '<b>Referer: </b>';
	(!getenv('HTTP_REFERER')) ? $errormsg	.= 'unbekannt<br>' : $errormsg .= getenv('HTTP_REFERER').'<br>';
	echo $errormsg;
	exit(0);
	}
else
require (GLOBAL_PATH.'error.php');
exit(0);
}
}
?>

diese klasse muss jediglich initialisiert werden und läuft dann komplett ab, weshalb es auch das ende meiner scripte darstellt.

der übergabewert ist die haupttemplate die ich haben will, in dieser template werden dann weitere gesucht und die variablen gefüllt ( sofern eine untergeordnete template variable werte hat oder templates laden will geht dies auch ).

es gibt wie du siehst einmal die möglichkeit templates als von einer datei, oder von der datenbank zu laden.

es können aber auch mehrere haupttemplates geben, diese müssen dann als array übergeben werden.

sollte der wert einer variable ein array sein wird die template so oft wiederholt, wie lang der größte array innerhalb dieser te,plate ist ( bsp, ich habe 10mal die daten für die news und habe alle in einem array, dann wird die newstemplate 10 mal aufgerufen und immer mit dem nächsten wert gefüllt ).


desweiteren kennt es 3 arten von wert übergaben

{NAME} ruft eine template auf

{$NAME} wird durch den wert einer Variabele ersetzt ( bzw gilt ein besonderes verhalten, wenn es ein array ist, hab ich ja oben erläutert )

{!NAME} fragt den Wert dieser variable ab ( muss ein string sein ) und ruft dann die template auf, welche diesen wert als namen hat


nunja, du wirst noch einige fragen habe, aber ich hoffe ich konnte schon ein paar wenige klären :) ( dies ist übeigens eine frühere version, ich bin etwas zimperlich meine aktuelle templateversion zu veröffentlichen ;) )
 
Last edited:
Ich will auch gar keine aktuelle, sondern nur eine halbwegs verständliche ;)
Zumindest die Funktion "tpl_errmsg" habe ich schonmal in Aktion gesehen :p

Werd sie in den nächsten Tagen mal durchgehen.
 
wobei dies eine ältere war ^^

ich weiß nicht ob es für dich gleich verständlich ist, aber ich erkläre es gerne :) ( fremder code ist ja immer erstmal ungewöhnlich )
 
Also ich muss sagen, die Klasse mit ihren Methoden ist schon sehr abstrakt :p Da wird das durchgehen wohl noch ne Weile dauern.
 
Back
Top Bottom