Hi
ich entwickle gerade eine kleine Templateklasse. Ohne Schleifen im Template funktionierte sie bereits gut. Da ich aber auch Schleifen parsen möchte, habe ich sie ein wenig umgeschrieben. Funktioniert eigentlich auch alles, bis auf die output() funktion. Ich wäre um Hilfe froh, wie ich die output funktion umschreiben muss, damit das ganze funktioniert. Meine Versuche waren bis jetzt erfolglos.
Hier aber mal die Klasse:
Die Outputfunktion sollte folgendermassen funktionieren:
- Array tpl_loops umkehren, damit die Bearbeitung rückwärts erfolgt, so dass eben auch subloops in loops eingefügt werden können.
- In der foreachschleife wird mittels strstr() geprüft, ob die entsprechende Variable des Loops im übergeordneten Loop zu finden ist. Falls dies zutrifft, wird der Loop im übergordneten Loop eingefügt. Wenn dies nicht zutrifft, wird der Loop im obersten Loop, also in default eingefügt!
Leider will dieses Prinzip nicht funktionieren, deshalb bitte ich euch um Hilfe!
Vielen Dank!
mfg rogerworld
EDIT: Hoffe nun, dass diese Fragenstellung nun so erlaubt ist!
ich entwickle gerade eine kleine Templateklasse. Ohne Schleifen im Template funktionierte sie bereits gut. Da ich aber auch Schleifen parsen möchte, habe ich sie ein wenig umgeschrieben. Funktioniert eigentlich auch alles, bis auf die output() funktion. Ich wäre um Hilfe froh, wie ich die output funktion umschreiben muss, damit das ganze funktioniert. Meine Versuche waren bis jetzt erfolglos.
Hier aber mal die Klasse:
PHP-Code:
<?php
////////////////////////////////////////////////////////////////////////////////
// //
// Copyrights 2005 by Roger Jaggi //
// //
////////////////////////////////////////////////////////////////////////////////
class Template
{
var $loop_names;
var $loop_values;
var l$tpl_loops;
// Template laden
function loadtemplate($file=false)
{
if(!file_exists($file)){
die('Das Template "'.$file.'" konnte nicht gefunden werden!');
}
$this->loop_names = array("default" => array());
$this->loop_values = array("default" => array());
$this->tpl_loops = array();
$this->tpl_loops['default'] = $this->string_parse(file_get_contents($file));
}
// String parsen, um event. Funktionen darin zu registrieren in tpl_loops[]
function string_parse($parsestring){
preg_match_all("/<!--\s+BEGIN\s+(.*)?\s+-->(.*)<!--\s+END\s+(\\1)\s+-->/ms",$parsestring,$pma);
for ($i = 0; $i < count($pma[0]); $i++)
{
$search = "/\s*\n*<!--\s+BEGIN\s+(" . $pma[1][$i] . ")?\s+-->(.*)<!--\s+END\s+(" . $pma[1][$i]. ")\s+-->\s*\n*/ms";
$replace = "{".$pma[1][$i]."}";
$this->loop_names[''.$pma[1][$i].''] = array();
$this->loop_values[''.$pma[1][$i].''] = array();
$this->string_parse(''.$pma[2][$i].'');
$parsestring = preg_replace($search,$replace,$parsestring);
$this->tpl_loops[''.$pma[1][$i].''] = $parsestring;
}
return $parsestring;
}
// Variable hinzufügen
function value_assign($name, $value, $loopname='default')
{
if (is_array($name))
{
foreach ($name as $key => $val)
{
array_push($this->loop_names[$loopname], '{'.$key.'}');
array_push($this->loop_values[$loopname], $val);
}
}
else
{
array_push($this->loop_names[$loopname], '{'.$name.'}');
array_push($this->loop_values[$loopname], $value);
}
}
// Dieser Abschnitt funktioniert nicht, es kommt keine Fehlermeldung, und führt auch nicht den gewünschten Ablauf durch!
function output()
{
// Alle Elemte des Array umkeheren, um sie in umgekehrter Reihenfolge zu bearbeiten!
$elemente = array_reverse($this->tpl_loops);
$letztes = count($elemente)-1;
$i = 0;
// Subloobs müssen in den Variablen der übergeordneten Loops gespeichert werden, wenn dort die entsprechende Variable vorhanden ist!
foreach($elemente as $name => $value){
$el = $i + 1;
if($i >= $letztes){
$el = $letztes;
}
// prüfen, ob das Element im nächsten Element vorkommt, sonst ins Defaultelement einfügen
if(strstr("{".$name."}", "%".$elemente[$el]."")){
$elemente[$i+1] = str_replace($this->loop_names[$name], $this->loop_values[$name], $elemente[$el]);
}
else{
$elemente[$letztes] = str_replace($this->loop_names[$name], $this->loop_values[$name], $elemente[$letztes]);
}
$i++;
}
return "".$elemente[$letztes]."";
}
}
?>
- Array tpl_loops umkehren, damit die Bearbeitung rückwärts erfolgt, so dass eben auch subloops in loops eingefügt werden können.
- In der foreachschleife wird mittels strstr() geprüft, ob die entsprechende Variable des Loops im übergeordneten Loop zu finden ist. Falls dies zutrifft, wird der Loop im übergordneten Loop eingefügt. Wenn dies nicht zutrifft, wird der Loop im obersten Loop, also in default eingefügt!
Leider will dieses Prinzip nicht funktionieren, deshalb bitte ich euch um Hilfe!
Vielen Dank!
mfg rogerworld
EDIT: Hoffe nun, dass diese Fragenstellung nun so erlaubt ist!
Kommentar