Template Problem / Code im Template interpretieren

SonMiko

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein blödes Problem in meiner Template Engine.
Es gibt Templates die PHP Code enthalten.

Nun gehe ich üblich so vor, dass ich ein Template mit einer Funktion erzeuge und einer Variablen zu weise die ich später ausgebe.
Die Funktion lädt dabei mit file_get_contents() die Template-Datei, im nächsten Schritt ersetze ich Placeholder innerhalb des Templates durch Werte aus einem Array (str_replace($ArrayZuSuchendePlaceholder, $arrayMitWerten)...).

Mein Dickes Problem ist nun, wie oben beschrieben, dass ich PHP-Code innerhalb des Templates gerne ausführen möchte.
Mit eval komme ich aber nicht weit, weil ja nicht NUR PHP-Code drin ist :-/ sondern eben auch normaler HTML Code.

Was kann ich da tun?
Gibts eine Funktion die PHP Code vom Template trennen könnte?

Ich würde mich sehr über konstruktive Vorschläge oder Denkanstöße freuen.

Viele Grüße,

Mike
 
PHP Code im Template zu haben spricht gegen den Sinn eines Templates. Da solltest du eher deine Struktur einmal überdenken.
Was natürlich bleibt ist eventuelle Ausgaben des Codes in einer Funktion auszulagern und ebenfalls wie normale Platzhalter zu ersetzen.
 
Schau dir mal fertige implementierungen an. Die arbeiten nicht mit filegetcontents sondern mit den uotput Buffet Funktionen (ob_*)....
 
Hallo zusammen,

mh okay aber das löst das Problem jetzt gerade nicht.
Ich hätte einen brauchbaren Ansatz, kann ihn aber aufgrund mangelnder Regex Kenntnisse nicht umsetzen:
Könnte ich, nachdem das Template geladen wurde, mit einem regulären Ausdruck nach "<?php" suchen und alles was sich innerhalb des Tags befindet, an eine Variable übergeben bis zum ersten vorkommnis "?>"?
Die Variable müsste dann mit eval() bearbeitet werden und an der Stelle des Vorkommnisses eingesetzt werden.

Hat jemand eine Idee wie ichs realisieren könnte?
 
Auch wenn es wie gesagt NICHT dem Sinn eines Templates entspricht, sei dir hiermit geholfen:
PHP:
$str = "<div>Here's some HTML with <?php echo 'PHP INSIDE'; ?></div><div><?php mysql_query('SELECT more FROM theTable'); ?></div>";
$pattern = "/<\?php(.*)\?>/gi";
preg_match_all($pattern, $str, $matches);
// Entweder
foreach( $matches[1] as $match ){
  eval($match);
}
// Oder
$php = '';
foreach( $matches[1] as $match ){
  $php .= $match;
}
eval($php);
 
Das ist doch SCH***!

Hier mal eine eifnache template Klasse, hab sie iwann mal ausm Netz gezogen:

PHP:
<?php

class Templater
{
    private $template;

    public function __construct($template = null)
    {
        if (isset($template))
        {
            $this->load($template);
        }
    }
	
	public function load($template)
	{
		/*
		 * This function loads the template file
		 */
		if (!is_file($template))
		{
			throw new Exception("File not found: $template");
		} elseif (!is_readable($template))
		{
			throw new Exception("Could not access file: $template");
		} else
		{
			$this->template = $template;
		}
	}
	
	public function set($var, $content)
	{
		$this->$var = $content;
	}
	
	public function publish($output = true)
	{
		/*
		 * Prints out the theme to the page
		 * However, before we do that, we need to remove every var witin {} that are not set
		 * @params
		 *  $output - whether to output the template to the screen or to just return the template
		 */
		ob_start();
		require $this->template;
		$content = ob_get_clean();
		print $content;
	}
	
	public function parse()
	{
		/*
		 * Function that just returns the template file so it can be reused
		 */
		ob_start();
		require $this->template;
		$content = ob_get_clean();
		return $content;
	}

}
 

Neue Beiträge

Zurück