Guten Tag,
Ich habe ein kleines Problem beim ersetzen von Template Variablen.
Template:
Im PHP Code weiße ich folgende Werte zu:
In meiner Template Klasse wird das ganze nun in $multiArrays abgespeichert.
Einfache {multiply} ersetze ich mit folgendem Code:
Dies klappt aber nun bei mehreren verschachtelten {multiply} nicht, da es nicht bis zum ende durchgeht.
Um alle benötigten Informationen zu erhalten habe ich folgendes geschrieben:
Damit erhalte ich die Information, welche {multiply} ich habe und außerdem weiß ich über den Index, welches {/multiply} zu welchem {multiply name="(.*)"} gehört.
Später sortiere ich das ganze noch nach dem zugewiesenem Index absteigend, weil ich denke, dass ich so zuerst die inneren ersetze, allerdings komme ich nicht weiter, wie ich meine beiden Funktionen zusammen bekomme.
Das Ersetzen in der ersten Funktion dürfte erst an einer bestimmten Position starten (kein Problem, Position habe ich), aber nun weiß ich nicht wie ich es machen soll, dass er die Informationen aus dem Personen Array nimmt und darin dann mit den Hobbys weiter macht, eine rekursive Funktion wäre natürlich am besten, sodass ich beliebig viele {multiply} ineinander schachteln kann.
Tschuldigung für den vielen Text, aber ich hoffe es steigt trotzdem irgendwer durch und kann mir helfen
Ich habe ein kleines Problem beim ersetzen von Template Variablen.
Template:
Code:
Test Test {multiply name="personen"}{$personen.name} {$personen.vorname} {multiply name="hobbys"}{/multiply}{$hobbys.name}{/multiply}
PHP-Code:
$multiArray = array(array("name"=>"Mueller","vorname"=>"Karl","hobbys"=>array(array("name"=>"Fußball"))));
$template->assign("personen",$multiArray);
Einfache {multiply} ersetze ich mit folgendem Code:
PHP-Code:
private function replaceMultiArrays() {
foreach($this->multiArrays as $key => $value) {
$pattern = '/\{multiply\sname=[\"\']'.$key.'[\"\']\}(.*)\{\/multiply}/isUe';
if(preg_match($pattern,$this->template,$subpattern)) {
$out="";
foreach($value as $valKey => $valValue) {
$output=$subpattern[1];
foreach($valValue as $valvalKey => $valvalValue) {
$output = str_replace($this->leftDelimiter.$key.'.'.$valvalKey.$this->rightDelimiter,$valvalValue,$output);
}
$out .= $output;
}
$this->template = str_replace($subpattern[0],$out,$this->template);
}
}
$pattern = '/\{multiply\sname=[\"\'](.*)[\"\']\}(.*)\{\/multiply}/isUe';
$this->template = preg_replace($pattern,"",$this->template);
}
Um alle benötigten Informationen zu erhalten habe ich folgendes geschrieben:
PHP-Code:
private function replaceMultiArrays2() {
$pattern_begin = '/\{multiply\sname\=[\"\'](.*)[\"\']\}/isU';
$pattern_end = '/\{\/multiply\}/isU';
$start=0;
$index=1;
$Begins=array();
while(preg_match($pattern_begin,$this->template,$subpattern, PREG_OFFSET_CAPTURE,$start)) {
$start=$subpattern[0][1]+strlen("{multiply name='".$subpattern[1][0]."'}");
array_push($Begins,array("name"=>$subpattern[1][0],
"index"=>$index,
"pos"=>$subpattern[0][1]));
$index++;
}
$countBegins = count($Begins);
$start=0;
$index=$Begins[count($Begins)-1]['index'];
$Ends=array();
$belegt=array();
while(preg_match($pattern_end,$this->template,$subpattern, PREG_OFFSET_CAPTURE,$start)) {
$start=$subpattern[0][1]+strlen("{/multiply}");
while($Begins[$index-1]['pos']>$subpattern[0][1] AND $index>1) {
$index--;
}
while(in_array($index,$belegt)) {
$index--;
}
array_push($Ends,array("index"=>$index,
"pos"=>$subpattern[0][1]));
array_push($belegt,$index);
$index=$Begins[count($Begins)-1]['index'];
}
$countEnds = count($Ends);
if($countEnds!=$countBegins) {
throw new Exception("Fehlermeldung");
}
usort($Begins,array(&$this,"compareMultiArrayIndex"));
usort($Ends,array(&$this,"compareMultiArrayIndex"));
}
Später sortiere ich das ganze noch nach dem zugewiesenem Index absteigend, weil ich denke, dass ich so zuerst die inneren ersetze, allerdings komme ich nicht weiter, wie ich meine beiden Funktionen zusammen bekomme.
Das Ersetzen in der ersten Funktion dürfte erst an einer bestimmten Position starten (kein Problem, Position habe ich), aber nun weiß ich nicht wie ich es machen soll, dass er die Informationen aus dem Personen Array nimmt und darin dann mit den Hobbys weiter macht, eine rekursive Funktion wäre natürlich am besten, sodass ich beliebig viele {multiply} ineinander schachteln kann.
Tschuldigung für den vielen Text, aber ich hoffe es steigt trotzdem irgendwer durch und kann mir helfen
Kommentar