php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack (3) Themen-Optionen Thema bewerten
Alt 24.10.2008, 14:02   1 links from elsewhere to this Post. Click to view. #1 (permalink)
Erfahrener Benutzer
 
Registriert seit: 24.10.2008
Beiträge: 150
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

Alt 24.10.2008, 17:37   #2 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.138
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KarlEgon,

auf den ersten Blick würde ich sagen: nimm Smarty, da bist du schneller am Ziel.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 27.10.2008, 08:14   #3 (permalink)
Erfahrener Benutzer
 
Registriert seit: 06.09.2008
Beiträge: 189
#Avedo befindet sich auf einem aufstrebenden Ast
Standard

Oder sieh dir mal diesen Thread an, wenn du nicht auf Smarty zurückgreifen möchtest.
MfG, Andy
__________________
I'm so tired of slitting the throats of people calling me a violent psychopath.
#Avedo ist offline   Mit Zitat antworten
Alt 27.10.2008, 13:34   #4 (permalink)
Erfahrener Benutzer
 
Registriert seit: 24.10.2008
Beiträge: 150
PHP-Kenntnisse:
Fortgeschritten
KarlEgon befindet sich auf einem aufstrebenden Ast
Standard

Habe mir den Thread durchgelesen, aber das ist nicht so ganz das was ich will.

Smarty habe ich benutzt, will ich aber nicht mehr.
Ich will es nämlich ein bisschen modular haben. Im moment definiere ich in den Templates verschiedene Sections(z.B. north, south, center usw.)
Nun kann ich durch $tpl->addTemplate("templatefile.tpl","center"); beliebig viele Templates zu diesen Sections hinzufügen.
Diese Möglichkeit habe ich meiner Meinung nach bei Smarty nicht. Und auf <?php echo $this->var ?> will ich nicht umsteigen.

Diese Möglichkeit will ich schon gerne haben. Habe bis jetzt noch kein TemplateSystem gesehen, wo dies unterstützt wird.
KarlEgon ist offline   Mit Zitat antworten
Alt 27.10.2008, 15:02   #5 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.138
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KarlEgon,

Zitat:
Smarty habe ich benutzt, will ich aber nicht mehr.
Ich will es nämlich ein bisschen modular haben.
Dann solltest du dir dringend das APF (siehe http://de.adventure-php-framework.or.../047-Templates) ansehen, denn generische Templates in beliebiger Komplexität und Struktur hat IMHO nur dieses.

Solltest du Fragen dazu haben, kannst du dich vertrauensvoll an mich wenden!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Geändert von dr.e. (27.10.2008 um 15:03 Uhr). Grund: Link zur Doku eingefügt
dr.e. ist offline   Mit Zitat antworten
Alt 28.10.2008, 09:54   #6 (permalink)
Erfahrener Benutzer
 
Registriert seit: 24.10.2008
Beiträge: 150
PHP-Kenntnisse:
Fortgeschritten
KarlEgon befindet sich auf einem aufstrebenden Ast
Standard

Mhhh das Ding kann ja schon ganz schön viel, aber ich denke das ist mir zu überladen.

Im moment sieht meine Template Klasse so aus:
PHP-Code:
<?php
class Template {

    private 
$templateDir "templates";
    private 
$mainTemplate "main.tpl";
    private 
$leftDelimiter '{$';
    private 
$rightDelimiter '}';
    private 
$leftComments '\{\*';
    private 
$rightComments '\*\}';
    private 
$vars = array ();
    private 
$arrays = array ();
    private 
$sections = array();
    private 
$multiArrays = array();
    private 
$hideAreas = array();
    private 
$template;
    private 
$templatePath;

    public function 
__construct($templateDir ""$mainTemplate "") {
        if (!empty (
$templateDir) && $templateDir != "") {
            
$this->templateDir $templateDir;
        }
        if (!empty (
$mainTemplate) && $mainTemplate != "") {
            
$this->mainTemplate $mainTemplate;
        }
    }

    public function 
setTemplateDir($templateDir) {
        
$this->templateDir $templateDir;
    }

    public function 
setMainTemplate($mainTemplate) {
        
$this->mainTemplate $mainTemplate;
    }

    public function 
setLeftDelimiter($leftDelimiter) {
        
$this->leftDelimiter $leftDelimiter;
    }

    public function 
setRightDelimiter($rightDelimiter) {
        
$this->rightDelimiter $rightDelimiter;
    }

    public function 
assign($key$value) {
        if (
is_array($value)) {
            
$this->addArray($key$value);
        } else {
            
$this->vars[$key] = $value;
        }
    }

    private function 
addArray($key$value) {
        if(
$this->isDeepMultiArray($value)) {
            
$this->addMultiArray($key,$value);
        } else {
            
$this->arrays[$key] = $value;
        }
    }

    public function 
addTemplate($file$section) {
        if(!@
is_array($this->sections[$section])) {
            
$this->sections[$section]=array();
        }
        
array_push($this->sections[$section],$file);
    }

    private function 
addMultiArray($key,$value) {
        
$this->multiArrays[$key] = $value;
    }

    public function 
hideArea($key) {
        
array_push($this->hideAreas,$key);
    }

    public function 
display() {
        
$this->templatePath $this->templateDir "/" $this->mainTemplate;
        if (!empty (
$this->templatePath)) {
            if (
$fp fopen($this->templatePath"r")) {
                
// Den Inhalt des Templates einlesen
                
$this->template fread($fpfilesize($this->templatePath));
                
fclose($fp);
            } else {
                return 
false;
            }
        }
        
$this->replaceIncludes();
        
$this->replaceSections();
        
$this->replaceIncludes();
        
$this->replaceMultiArrays();
        
//$this->replaceMultiArrays2();
        
$this->replaceValues();
        
$this->replaceArrays();
        
$this->replaceComments();
        
$this->hideAreas();
        
$this->removePHP();
        echo 
$this->template;
    }

    private function 
replaceIncludes() {
        
$pattern '/\{include\sfile=[\"\'](.*)\.(.*)[\"\']\}/isUe';
        while (
preg_match($pattern$this->template)) {
            
$this->template preg_replace($pattern"file_get_contents(\$this->templateDir.'/\\1'.'.'.'\\2')"$this->template);
        }
    }

    private function 
replaceValues() {
        foreach (
$this->vars as $key => $value) {
            
$this->template str_replace($this->leftDelimiter $key $this->rightDelimiter$value$this->template);
        }
    }

    private function 
replaceArrays() {
        foreach (
$this->arrays as $key => $value) {
            foreach (
$value as $valKey => $valValue) {
                
$pattern '/^(\{multiply\sname=[\"\'](.*)[\"\']\})'.$this->leftDelimiter.$key.'\.'.$valKey.$this->rightDelimiter.'^(\{\/multiply\})/is';
                if(
preg_match($pattern,$this->template,$subpattern)) {
                    
//debugprint($subpattern);
                
}
                
$this->template str_replace($this->leftDelimiter $key "." $valKey $this->rightDelimiter$valValue$this->template);
            }
        }
    }

    private function 
replaceMultiArrays($sub="",$pos=0) {
        foreach(
$this->multiArrays as $key => $value) {
            if(
$sub=="") {
                
$pattern '/\{multiply\sname=[\"\']'.$key.'[\"\']\}(.*)\{\/multiply}/isUe';
            } else {
                
$pattern '/\{multiply\sname=[\"\']'.$sub.'[\"\']\}(.*)\{\/multiply}/isUe';
            }
            if(
preg_match($pattern,$this->template,$subpattern,null,$pos)) {
                
//debugprint($subpattern,false,$sub);
                
$out="";
                
//ausgabe($sub." ".count($value));
                
foreach($value as $valKey => $valValue) {
                        
//ausgabe($valKey."---".$valValue);
                        
$output=$subpattern[1];
                        foreach(
$valValue as $valvalKey => $valvalValue) {
                            if(!
is_array($valvalValue)) {
                                
$output str_replace($this->leftDelimiter.$key.'.'.$valvalKey.$this->rightDelimiter,$valvalValue,$output);
                                
//$output = str_replace($this->leftDelimiter.$key.'.'.$valvalKey.$this->rightDelimiter,$subpattern[1],$output);
                            
}
                        }
                        
$out .= $output;
                }
                
//ausgabe(trim(htmlspecialchars($out)));
                //ausgabe($subpattern[0]);
                
$this->template str_replace($subpattern[0],$out,$this->template);
            }
        }
        
$pattern '/\{multiply\sname=[\"\'](.*)[\"\']\}(.*)\{\/multiply}/isUe';
        
$this->template preg_replace($pattern,"",$this->template);
    }

    private function 
replaceMultiArrays2() {
        
$pattern_begin '/\{multiply\sname\=[\"\'](.*)[\"\']\}/isU';
        
$pattern_end '/\{\/multiply\}/isU';
        
$start=0;
        
$index=1;
        
$Begins=array();
        
$error=false;
        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("type"=>"begin",
                                     
"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--;
            }
            if(
$index<=0) {
                
$error=true;
            }
            
array_push($Ends,array("type"=>"end",
                                   
"index"=>$index,
                                   
"pos"=>$subpattern[0][1]));
            
array_push($belegt,$index);
            
$index=$Begins[count($Begins)-1]['index'];
        }
        
$countEnds count($Ends);
        if(
$countEnds!=$countBegins || $error) {
            throw new 
Exception("Template Fehlerhaft");
        }
        
usort($Begins,array(&$this,"compareMultiArrayPos"));
        
//debugprint($Begins);
        //usort($Ends,array(&$this,"compareMultiArrayPos"));
        
foreach($Begins as $value) {
            if(
$value['name']!='infos') {
                
$this->replaceMultiArrays4($value['name'],$value['pos']);
            }
            
//ausgabe($value['name']."---".$value['pos']);
        
}
        
//debugprint($Begins);
        //debugprint($Ends);
        
$All array_merge($Begins,$Ends);
        
usort($All,array(&$this,"compareMultiArrayPos"));
        
//debugprint($All);
        //debugprint($this->multiArrays);
        /*for($i=0;$i<count($All)-1;$i++) {
            if($All[$i]['type']=='begin' AND $All[$i+1]['type']=='end') {
                //$this->replaceMultiArrays3($this->multiArrays[$All[$i]['name']],$All[$i]['pos'],$All[$i]['name']);
            }
            if($All[$i]['type']=='begin' AND $All[$i+1]['type']=='begin') {
                $this->replaceMultiArrays3($this->multiArrays[$All[$i]['name']],$All[$i]['pos'],$All[$i+1]['name'],true);
                $i++;
            }
        }*/
    
}

    private function 
hideAreas() {
        foreach(
$this->hideAreas as $area) {
            
$pattern '/\{area\sname=[\"\']'.$area.'[\"\']\}(.*)\{\/area}/isUe';
            while(
preg_match($pattern,$this->template)) {
                
$this->template preg_replace($pattern,"",$this->template);
            }
        }
        
$pattern '/\{area\sname=[\"\'](.*)[\"\']\}/isUe';
        
$this->template preg_replace($pattern,"",$this->template);
        
$pattern '/\{\/area}/isUe';
        
$this->template preg_replace($pattern,"",$this->template);
    }

    private function 
replaceSections() {
        foreach(
$this->sections as $key => $value) {
            
//ausgabe($key."---".$value);
            
$output="";
            foreach(
$value as $file) {
                
$output .= "{include file='".$file."'}";
            }
            
$pattern "/\{section name=\"$key\"\}/";
            
$this->template preg_replace($pattern,$output,$this->template);
        }
        
$pattern '/\{section\sname=[\"\'](.*)[\"\']\}/isUe';
        while(
preg_match($pattern,$this->template)) {
            
$this->template preg_replace($pattern,"",$this->template);
        }
    }

    private function 
replaceComments() {
        
$pattern "/".$this->leftComments."(.*)".$this->rightComments."/isUe";
        while(
preg_match($pattern,$this->template)) {
            
$this->template preg_replace($pattern,"",$this->template);
        }
    }

    private function 
removePHP() {
        
$pattern '/\<\?[ph]{0,3}(.*)[ph]{0,3}\?\>/isUe';
        while(
preg_match($pattern,$this->template)) {
            
$this->template preg_replace($pattern,"",$this->template);
        }
    }

    private function 
compareMultiArrayIndex($a,$b) {
        if(
$a['index']==$b['index']) {
            return 
0;
        }
        return (
$a['index']<$b['index']) ? : -1;
    }

    private function 
compareMultiArrayPos($a,$b) {
        if(
$a['pos']==$b['pos']) {
            return 
0;
        }
        return (
$a['pos']<$b['pos']) ? -1;
    }

    private function 
isDeepMultiArray($multiarray$level 2) {  // default is simple multiarray
    
if (is_array($multiarray)) {  // confirms array
        
if ($level == 1) {  // $level reaches 1 after specified # of recursions
            
return true;  // returns true to recursive function conditional
        
}  // end conditional
        
foreach ($multiarray as $array) {  // goes one level deeper into array
            
if ($this->isDeepMultiArray($array$level 1)) {  // check subarray
                
return true;  // best if $message = true so function returns boolean
            
}  // end recursive function
        
}  // end loop
    
} else {  // not an array at specified level
    
return false;  // is also used recursively so can't change to message
    
}
}
}
?>
Habe viel herumprobiert, deswegen sieht es manchmal vielleicht ein bisschen chaotisch aus. Ich weiß nicht wie ich es realisieren soll, dass alles ersetzt wird so wie ich es brauche.
KarlEgon ist offline   Mit Zitat antworten
Alt 28.10.2008, 14:52   #7 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.138
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KarlEgon,

Zitat:
Mhhh das Ding kann ja schon ganz schön viel, aber ich denke das ist mir zu überladen.
Sorry, aber die Anforderungen, die du stellst, sind nicht durch eine ungenerische Implementierung zu erschlagen.

Versuch doch bitte - ehe du Resignation zeigst - zu beschreiben, wie deine Applikation aussehen soll und welche Anforderungen umzusetzen sind. Ich bin mir 100%ig sicher, dass es dafür eine elegante und nicht überladene Antwort und Lösung mit dem APF gibt. Die Wette gilt!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 28.10.2008, 15:34   #8 (permalink)
Erfahrener Benutzer
 
Registriert seit: 24.10.2008
Beiträge: 150
PHP-Kenntnisse:
Fortgeschritten
KarlEgon befindet sich auf einem aufstrebenden Ast
Standard

Also
Ein Beispiel Template:
Code:
//main.tpl
<html>
<head>
<title>{$titel}</title>
</head> <body>
<div id="header">{$seitentitel}{section name="north"}</div> <div id="left">{section name="west"}</div> <div id="right">{section name="east"}</div> <div id="content"><h1>{$seitentitel}</h1>{section name="center"}</div> <div id="footer">{section name="south"}</div>
</body>
</html>
Ein weiteres Template:
Code:
//Navigation.tpl
<div id="navi">
{multiply name="navi"} <a href="{$navi.link}">{$navi.name}</a> {/multiply}
</div>
Und noch ein Template:
Code:
//Status.tpl
<div id="status">
Fertigstellungsgrad: {$fertig} %
</div>
Im PHP Code:
PHP-Code:
$tpl = new Template();
$tpl->assign("titel","Testseite");
$tpl->assign("seitentitel","Status");
$tpl->assign("fertig",20);
$navi = array();
for(
$i=0;$i<6;$i++) {
array_push($navi,array("link"=>"#","name"=>"Test".$i));
}
$tpl->assign("navi",$navi);
$tpl->addTemplate("Navigation.tpl","west");
$tpl->addTemplate("Status.tpl","center");
$tpl->display(); //Main.tpl wird standardmäßig genommen 
Naja und dann soll er mir daraus halt eine Seite bauen, also zu den verschiedenen Sections kann ich eigentlich jedes beliebige Template hinzufügen. Natürlich kann ich auch direkt im Template ein include angeben, zum Beispiel header und footer habe ich ausgelagert, aber is ja erstmal nicht so wichtig. Dieses mutliply ist eigentlich so ähnlich wie eine foreach Schleife, allerdings will ich die Möglichkeit haben, mehrere multiplys zu verschachteln.
Also wenn ich in der For-Schleife der PHP Datei noch ne For-Schleife mache und das ganze dann dem navi zum Beispiel unter dem Namen subnavi hinzufüge, dann kann ich im Template im navi-{multiply} noch ein subnavi-{mutliply} definieren.
Bei meinem "Template-System" habe ich noch die möglichkeit Areas zu verstecken. PHP Code wird rausgefiltert und natürlich überflüßige Dinge entfernt (wenn zum Beispiel irgendwo ein {section} übrigbleibt oder so)

Joar ich glaube das war es erstmal so.

Geändert von KarlEgon (28.10.2008 um 15:39 Uhr).
KarlEgon ist offline   Mit Zitat antworten
Alt 28.10.2008, 17:16   #9 (permalink)
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.138
PHP-Kenntnisse:
Fortgeschritten
dr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäredr.e. sorgt für eine eindrucksvolle Atmosphäre
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo KarlEgon,

wenn ich das richtig sehe, sollte die Anforderung also mit ein paar Templates und DocumentController, die die Ausgabelogik kapseln zu erschlagen sein. Weitere "includes" in Templates können dabei ganz einfach mit dem <core:importdesign /> erledigt werden. Zur Gestaltung von wiederverwendbaren Elementen kannst du das <html:template />-Tag nehmen. Dieses steht im APF-DOM-Model im DocumentController (=MVC-Controller) dann als eigenes Objekt zur Verfügung und kann entsprechend genutzt werden. Hier die relevanten Stellen in der Doku:

* Adventure PHP Framework - Standard TagLibs
* Adventure PHP Framework - Standard TagLibs

Falls eine Ausgabe von Objekten in einer Liste direkt stattfinden kann, ist der Iterator-Tag (siehe Adventure PHP Framework - Standard TagLibs) eine ganz nette Alternative.

Deine Templates würden dann in etwa so aussehen:

main.html:
Code:
<html>
<head>
        <title>{$titel}</title>
    </head> 
    <body>
        <div id="header">
          <core:importdesign namespace="sites::karlegon::pres::template" template="header" />
        </div> 
        <div id="left">
          <core:importdesign namespace="sites::karlegon::pres::template" template="left" />
        </div> 
        <div id="right">
          <core:importdesign namespace="sites::karlegon::pres::template" template="right" />
        </div> 
        <div id="content">
          <core:importdesign namespace="sites::karlegon::pres::template" template="content" />
        </div> 
        <div id="footer">
          <core:importdesign namespace="sites::karlegon::pres::template" template="footer" />
        </div>
    </body>
</html>
Die jeweiligen "Subtemplates" enhalten dann die entsprechenden statischen oder dynamischen Inhalte. Für die Generierung der dynamischen Inhalte können dann DocumentController (siehe Adventure PHP Framework - Controller) genutzt werden. Ein expliziteres Beispiel kann ich dir basteln, wenn du mir weiteren Input gibst. Die Verschachtelungstiefe und Kombinationsmöglichkeiten bei den einzelnen Bereichen (Templates) ist uneingeschränkt, sprich du erhälst maximale Wiederverwendbarkeit.

Noch ein Controller-Beispiel zum Schluss: den Fertigstellungsgrad füllst du im APF so aus:

Template-Datei:
Code:
<@controller namespace="sites::karlegon::pres::controller" class="status_controller" file="status_controller" @>
<div id="status">

    Fertigstellungsgrad: <html:placeholder name="ready"/> %

</div>
Controller-Datei:
PHP-Code:
class status_controller extends baseController
{
   function 
transformContent(){
      
$this->setPlaceHolder('ready',20);   
   }

Um dein Haupt-Template ausgeben zu können brauchst du noch eine Bootstrap-Datei. Diese halt folgende Gestalt:

PHP-Code:
include_once('./apps/core/pagecontroller/pagecontroller.php');
$Page = new Page('helloworld');
$Page->loadDesign('sites::karlegon','pres/templates/main');
echo 
$Page->transform(); 
And now over to you!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 29.10.2008, 00:37   #10 (permalink)
Erfahrener Benutzer
 
Registriert seit: 24.10.2008
Beiträge: 150
PHP-Kenntnisse:
Fortgeschritten
KarlEgon befindet sich auf einem aufstrebenden Ast
Standard

Sieht schonmal nicht schlecht aus, aber kann ich auch dynamisch Templates hinzufügen über dieses <core:importdesign> ? So das ich erst im Controller sage welche Templates benutzt werden sollen und für eine "Variable" sollen auch mehrere Templates eingesetzt werden können.

Gibt es irgendwo ne PDF Version der Dokumentation? Oder nur diese CHM Versionen?
KarlEgon ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

LinkBacks (?)
LinkBack to this Thread: http://www.php.de/php-fortgeschrittene/48424-erledigt-variablen-einem-template-ersetzen.html
Erstellt von For Type Datum
Adventure PHP Framework - Downloads This thread Refback 05.12.2008 21:54
Adventure PHP Framework - Literatur This thread Refback 21.11.2008 12:58
forum.adventure-php-framework.org [de] • Thema anzeigen - Einführung <core:appendnode />-Tag This thread Refback 20.11.2008 19:41

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] ob_start verwirft gesetzte Variablen?! tohms PHP Tipps 2008 3 19.10.2008 16:50
Lieber Template oder Normal für ein community? mysteryxxx PHP Tipps 2008 8 17.09.2008 23:04
Klasse statt globaler Variablen ecomeback PHP-Fortgeschrittene 6 15.07.2008 16:30
Übergeben von Variablen an in PHP eingebundenes Perl-Script shredder01 PHP Tipps 2008 3 04.04.2008 09:25
Teil einer Variablen mit einer Variablen ersetzen ? simsalabim PHP Tipps 2007 11 20.03.2007 20:36
variablen aus db ersetzen snatch-ic PHP Tipps 2006 7 21.05.2006 01:51
template in template einfuegen tonne PHP Tipps 2005-2 8 10.11.2005 22:24
In Fuktionen alle Variablen Global stellen ? atom-dragon PHP Tipps 2005-2 5 22.07.2005 04:30
Template System oder Lösung gesucht PHP Tipps 2005 14 21.05.2005 22:07
Variablen übergeben bzw. auslesen? PHP Tipps 2005 4 30.01.2005 03:56
suche ein bestimmtes template system PHP Tipps 2004-2 2 07.11.2004 19:49
[Erledigt] Template Parser PHP-Fortgeschrittene 9 06.10.2004 23:04
mit print Variablen in String ersetzen PHP Tipps 2004 3 27.09.2004 21:29
Variablen per adresse übergeben rocco PHP Tipps 2004 7 24.07.2004 12:03
Template Scripting PHP-Fortgeschrittene 2 04.06.2004 18:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
einfaches template php mit if und else, php template variablen, php template variable, foreach schateln smarty, vbulletin 4 template server variablen einfügen, php templates variablen, while preg_match template, variablen template, warning: include_once(/apf/apps/core/pagecontroller/pagecontroller.php), vbulletin template variablen, smarty variable an bestimmtes template übergeben, $this->template; ersetzen, template gibt variable zurück php, vbulletin footer variablen in template, php template recursive replace, variablen in vbulletin4 footer, warning: include_once(../../../apf/apps/core/pagecontroller/pagecontroller.php), template in variable, php, load php template to variable, variable in template php

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:04 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum