Template Engine Problem

B

Bgag

Abend!

Ich habe eine kleine Template Engine geschrieben und habe nun aber ein Problem. Ich möchte in mein Template eine Subnavigation einfügen, die je nach Pageid, die per URL übergeben wird, eingefügt wird. Die Template Engine ersetzt den Platzhalter { include file="subnav.php"} mit Hilfe dieses Methoden Teils:
PHP:
			// replace includes ( {include file="theinclude.php"} )
			while(preg_match("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", $this->template)) {
				$this->template = preg_replace("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", "file_get_contents('\\1'.'.'.'\\2')", $this->template);
			}
Problem: subnav.php enthält PHP. Da die Methode das Einbinden der Seite mit file_get_contents() macht, wird das ganze nicht richtig angezeigt, da der enthaltene PHP-Code vorher nicht geparst wird. Mit include() geht das ganze leider nicht, da dann alles an falscher Stelle steht. Also möchte ich eine Methode in meine Template Engine einbauen, die die Seiten vor dem Einbinden parst.
In meiner alten Template Engine sah das ganze so aus:
PHP:
    /* Daten laden, die PHP enthalten und somit erst gepuffert werden müssen */ 
    public function load($stuff) { 
    ob_start(); 
    include $stuff; 
    $newstuff = ob_get_contents(); 
    ob_end_clean(); 
    return $newstuff; 
    }
Sehr primitiv, wurde mir gesagt und daher suche ich nun eine neue Möglichkeit das umzusetzen. Gibt es da noch etwas anderes auch ohne eval().Denn es ginge ja auch so:
PHP:
			while(preg_match("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", $this->template)) {
				$this->template = preg_replace("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", "file_get_contents(eval('\\1'.'.'.'\\2'))", $this->template);
Doch ich habe gelernt eval is evil! Erhalte bei dieser Möglichkeit nämlich auch gleich mehrere Fehler:
Code:
Parse error: syntax error, unexpected $end in /home/redway/www/CMS/includes/TemplateEngine.php(65) : regexp code(1) : eval()'d code on line 1

Parse error: syntax error, unexpected $end in /home/redway/www/CMS/includes/TemplateEngine.php(65) : regexp code(1) : eval()'d code on line 1
Wäre euch sehr dankbar für eure Hilfe.

MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
Probier mal Folgendes:
PHP:
$this->template = preg_replace("/".$this->leftDelimiterF."include file=\"([^\"]+)\"".$this->rightDelimiterF."/isUe", "eval(file_get_contents('\\1'))", $this->template);
 
Abend!

Danke erstmal für deine Antwort. jedoch erhalte ich dann folgenden Fehler:
Code:
Warning: file_get_contents(cms_navi/subnav) [function.file-get-contents]: failed to open stream: No such file or directory in /home/redway/www/CMS/includes/TemplateEngine.php(65) : regexp code on line 1

Warning: file_get_contents(cms_navi/primnav) [function.file-get-contents]: failed to open stream: No such file or directory in /home/redway/www/CMS/includes/TemplateEngine.php(65) : regexp code on line 1
In geänderter Form:
PHP:
eval(file_get_contents('\\1'.'.'.'\\2'))
erhalte ich den alten Fehler.

MfG, Andy
 
Was genau ist an deiner Methode mit dem Puffern der Datei primitiv?
Das funktioniert meiner Erfahrung nach sehr zuverlässig und ist nicht so bedenklich wie eval...

Gibt es überhaupt andere Möglichkeiten eine Template-Engine aufzubauen?

Gruss
 
Morgen!

Also mir ist zumindest keine bekannt, wo man mit relativem Pfad arbeiten könnte. Denn bei readfile und fopen muss man den absoluten pfad angeben. Also versuch ich es wieder mit der Pufferung.
PHP:
		/* PARSE INCLUDE */ 
		public function parseInclude($stuff) { 
		
		ob_start(); 
		include $stuff; 
		$newstuff = ob_get_contents(); 
		ob_end_clean(); 
		return $newstuff; 
		}
Doch irgendwie bekomm ich das hier nicht richtig eingebaut:
PHP:
			// replace includes ( {include file="theinclude.php"} )
			while(preg_match("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", $this->template)) {
				$this->template = preg_replace("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", "file_get_contents('\\1'.'.'.'\\2')", $this->template);
			}
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
Ist es nicht so? Ich dachte mich daran zu erinnern, das irgendwo gelesen zu haben. Egal mit Pufferung ging es ja eigentlich immer. Hapert grade nur mit dem einbinden der neuen Methode. Kannst du mir eventuell mit diesem Problemhelfen. Ich habe es im letzten Post recht genau geschildert.

MfG, Andy
 
Abend!
Hab es nun beim alten belassen, was die obige Funktion angeht und habe die Funktion zur ausgabe verändert. Das ganze sieht nun so aus:
PHP:
<?php
		/* RETURN WHOLE AND PARSED TEMPLATE*/
		public function out() {
		
			eval(' ?>' . $this->template . '<?php ');
			return true; 
		}
?>
MfG, Andy
 

Neue Beiträge

Zurück