Template System

  • Themenstarter Themenstarter Bgag
  • Beginndatum Beginndatum
Ich wollte es nun leider aber mit einer Template Engine lösen, und habe mir dazu ja auch eine kleine eigene Template Klasse gebastelt.

Trotz error_reporting(E_ALL); erhalte ich keine Fehlermeldungen. Meine Links sehen allerdings so:
Code:
http://www.puk.de/sorsmc/test/%3Cserver%3E?content=cont_news.php
statt so:
Code:
http://www.puk.de/sorsmc/test/index?content=cont_news.php
aus.

Und keiner der Platzhalter wird ersetzt. Wo liegen meine Fehler?
MfG, Andy
 
Also so wie ich das sehe machst du das ganze Online, gehe ich richtig der Annahme?
Wenn das so ist, dann musste die Links nicht mit dem genauen URL und der Linknamen bezeichnen, du solltest nur darauf achten das du deinen vollständigen ROOTPFAD in der php.ini drin stehen hast was echt hart zu knacken ist, weil du ja wahrscheinlich keinen Zugriff darauf hast. ;)

Also solltest du dies in deiner Klasse definieren, also nicht define() sondern eintragen, etwa so:

/usr/export/www/hosting/espoleon/com/templates/subSilver/

Also das ist bloß ein Beispiel aber da sollten dann deine PFADE drin stehen.

p.s. das fällt mir erstmal dazu ein
 
So die Anmerkung von Cumbo hat mir schon etwas geholfen. Musste die funktion setvalue() wie folgt anpassen, damit fasst alle Platzhalter ersetzt werden.
PHP:
<?php
	/* Den einzelnen Platzhaltern ihre Inhalte zuweisen */ 
	public function setvalue( $name , $inhalt ) {
	global $insert;
	$insert .= "{" . $name . "}" . $inhalt . "{/" . $name . "}";
	}
?>
Das Problem, dass der Platzhalter für den Content niccht ersetzt und das ersetzte angezeigt wird bleibt.
MfG, Andy
 
Irgendwie verstehe ich das nicht.
In dem Beispiel Code von gaaanz oben sieht dein Platzhalter wie folgt aus {lastchange}.
Deine setValue Methode baut die Platzhalter wie folgt auf (am Beispiel von "change" aus deinem Codesnippet): {change} CONTENT {/change}.

Das eigentliche ersetzen erfolgt dann in insert() mit dem preg_match_all. Dort nimmst du alles wieder auseinander, die matches werden dann in loops gegen den Content getauscht. Alles läuft über den $insert, was ein String ist. Hmm, ich finde das alles sehr kompliziert und mit dem preg_match_all, der folgenden foreach Schleife nicht gerade performant.

Weitere Probleme habe ich auch mit der loadContent() Methode. Diese hat als Rückgabewert den Inhalt des Templates (oder was da included wird).
Diese Methode der klasse rufst du wie folgt auf: $t->loadcontent($_GET['content']);

Wohin wird denn da der return $newcont zurückgegeben?


Wäre es nicht wie folgt einfacher:

Dein Template enthält die Platzhalter in der Form {lastchange}, so wie du es bis jetzt auch hast.

Deine SetValue() Methode würde ich umschreiben zu:

PHP:
public function setvalue($tag, $value)
{
   // vorher in der klasse noch ein private $platzhalter;
   $complete_tag = '{'.$tag.'}';
   $this->platzhalter[$complete_tag] = $value;
}
Nun wird das Template geladen sagen wir mal in klassenvariable $this->template (als Beispiel, bei dir in der insert() mit file_get_contents)
Jetzt werden einfach die Tags ersetzt durch die Values
Beispiel:
PHP:
function parsetemplate()
{
  echo str_replace(array_keys($this->platzhalter), array_values($this->platzhalter), $this->template);
}
Das ganze weicht natürlich stark von deinem Ablauf ab und ist nur eine grobe Idee und ich weiss nicht, ob dies überhaupt eine gute Umsetzung hinsichtlich Geschwindigkeit ist (dieses str_replace konstrukt mit array_keys und _values).
Ansonsten einfach mein Post ignorieren ;)
 
Ich hab mir jetzt den Code nicht genau angeschaut aber wieso def. du die Platzhalter so kompliziert?

Ich hab das bei mir so gemacht <irgenwelcher html code>[{platzhalter1}]htmlcode...
Die html Datei wird schritt für schritt abgearbeitet.
Jede Zeile überprüfen ob ein Platzhalter vorhanden ist.
Ist kein Platzhalter vorhanden --> Zeile also den reinen eingelesenen html Code ausgeben.
Ansonsten htmlcode + neuen Code z.B.: aus DB + html code ausgeben

Du kannst so auch dyn. code ausführen.

Ein paar Nachteil bei diesem System sind:
Header funktioniert nur bedingt wenn ob_start() vorhanden ist
eingebaute dyn. Seiten können nicht mehr flexibel eingesetzt werden.
 
Hallo!
Danke für eure Hilfe! Der geänderte Code sieht dann so aus:
PHP:
<?php 

    /* Deklarieren von Inhalten, die auf PHP basieren und immer für bestimmte Platzhalter eingesetzt werden müssen */  
    $lastchange = filemtime(basename($_SERVER['PHP_SELF'])); 
    $last_change = date("d.m.Y H:i", $lastchange); 
    $copyright = date("Y"); 
    $url = $_SERVER['PHP_SELF']; 



/* Die Klasse Template*/ 
class template { 

    private $t;
    private $platzhalter;  
         
    /* Template anlegen */ 
    public function __construct($template) { 
    $this->t = $template; 
    } 
     
    /* Den Content laden */ 
    public function loadcontent($content) { 
    ob_start(); 
    include $content; 
    $newcont = ob_get_contents(); 
    ob_end_clean(); 
    return $newcont; 
    } 
     
    /* Den einzelnen Platzhaltern ihre Inhalte zuweisen */  
    public function setvalue($tag, $value)   {
   $complete_tag = '{'.$tag.'}';
   $this->platzhalter[$complete_tag] = $value;
   } 
     
    /* Platzhalter im Template finden, ersetzen und letztendlich das ganze ausgeben*/ 
   function parsetemplate()   {
   echo str_replace(array_keys($this->platzhalter), array_values($this->platzhalter), $this->template);
   } 

} 


$t = new Template("template.tpl"); 
$t->loadcontent($_GET['content']); 
$t->setvalue( "change" , $last_change ); 
$t->setvalue( "server" , $url ); 
$t->setvalue( "copy" , $copyright ); 
$t->setvalue( "content" , $newcont ); 
$t->parsetemplate(); 

?>

Nun muss noch $newcont richtig über geben werden. Das wird ja in loadcontent() included und dann mit ob_start() gepuffert und der zurückgegebene Html-Code mit ob_get_contents() in $newcont gespeichert. Diese soll nun wie alle anderen Platzhalter mit setvalue() gesetzt werden. Doch wie übergebe ich $newcont nun korrekt an setvalue()?
Danke nochmal für die bisherige Hife. bin schon weiter gekommen als in vielen anderen Foren. Danke also! Respekt!
MfG, Andy
 
PHP:
$t = new Template("template.tpl"); 
$t->setvalue( "change" , $last_change ); 
$t->setvalue( "server" , $url ); 
$t->setvalue( "copy" , $copyright );
$t->setvalue( "content" ,  $t->loadcontent($_GET['content']));  // <--
$t->parsetemplate(); 
?>

Müsste theorethisch so funktionieren. Der Rückgabewert von loadcontent() wird damit direkt als "value" für die setvalue() methode genutzt.
 
Danke für deine Antwort, aber es funktioniert immer noch nicht. er zeigt rein garnichts an. Er generiert gar keinen Code. Es gibt allerdings auch keine Fehlermeldung! Zur übersicht stelle ich nochmal den Kompletten code rein.
PHP:
<?php 

    /* Deklarieren von Inhalten, die auf PHP basieren und immer für bestimmte Platzhalter eingesetzt werden müssen */  
    $lastchange = filemtime(basename($_SERVER['PHP_SELF'])); 
    $last_change = date("d.m.Y H:i", $lastchange); 
    $copyright = date("Y"); 
    $url = $_SERVER['PHP_SELF']; 



/* Die Klasse Template*/ 
class template { 

    private $t;
    private $platzhalter;  
         
    /* Template anlegen */ 
    public function __construct($template) { 
    $this->t = $template; 
    } 
     
    /* Den Content laden */ 
    public function loadcontent($content) { 
    ob_start(); 
    include $content; 
    $newcont = ob_get_contents(); 
    ob_end_clean(); 
    return $newcont; 
    } 
     
    /* Den einzelnen Platzhaltern ihre Inhalte zuweisen */  
    public function setvalue($tag, $value)   {
   $complete_tag = '{'.$tag.'}';
   $this->platzhalter[$complete_tag] = $value;
   } 
     
    /* Platzhalter im Template finden, ersetzen und letztendlich das ganze ausgeben*/ 
   function parsetemplate()   {
   echo str_replace(array_keys($this->platzhalter), array_values($this->platzhalter), $this->template);
   } 

} 


$t = new Template("template.tpl"); 
$t->setvalue( "change" , $last_change ); 
$t->setvalue( "server" , $url ); 
$t->setvalue( "copy" , $copyright );
$t->setvalue( "content" ,  $t->loadcontent($_GET['content']));
$t->parsetemplate(); 

?>
MfG, Andy
 
Spontan fällt mir nur auf, das Du $this->template als Grundlage nimmst, aber die Variable nirgends mit Inhalt gefüllt wird. Ich hab doch geschrieben, das das bei mir nur ein Beispiel ist. Bei dir heisst das glaube ich $this->t

PHP:
/* Platzhalter im Template finden, ersetzen und letztendlich das ganze ausgeben*/ 
   function parsetemplate()   {
   echo str_replace(array_keys($this->platzhalter), array_values($this->platzhalter), $this->t); // <--
   }
 
Zudem hatte ich nirgendwo das Template geladen, sodass in $this->t nur template.tpl stand. so musste public function __construct() folgender maßen erweitert werden:
PHP:
    /* Template anlegen */ 
    public function __construct($template) {
    $realtemplate = file_get_contents($template); 
    $this->t = $realtemplate; 
    }

Nun erhalte ich allerdings immernoch eine Fehlermeldung, muss jetzt ne Zeit lang arbeiten werde es mir dann alerdings mal ansehen. Vielleicht hat aber auch einer von euch eine Idee. Hier die Fehlermeldung:
Code:
Warning: template::include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /home/sorsmc/www/test/index.php on line 26
MfG, Andy
 
Zurück