Einzelnen Beitrag anzeigen
Alt 24.10.2008, 14:02  
KarlEgon
Erfahrener Benutzer
 
Registriert seit: 24.10.2008
Beiträge: 291
PHP-Kenntnisse:
Fortgeschritten
KarlEgon befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Variablen in einem Template ersetzen

Guten Tag,

Ich habe ein kleines Problem beim ersetzen von Template Variablen.
Template:
Code:
Test
Test
{multiply name="personen"}
{$personen.name} {$personen.vorname} {multiply name="hobbys"}
{$hobbys.name}
{/multiply}
{/multiply}
Im PHP Code weiße ich folgende Werte zu:
PHP-Code:
$multiArray = array(array("name"=>"Mueller","vorname"=>"Karl","hobbys"=>array(array("name"=>"Fußball"))));
$template->assign("personen",$multiArray); 
In meiner Template Klasse wird das ganze nun in $multiArrays abgespeichert.
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);
    } 
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:
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,$subpatternPREG_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,$subpatternPREG_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"));
    } 
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
KarlEgon ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten