[PHP] Template Parser?

awi95

Member
Hallo,

ich arbeite gerade an einer neuen Homepage für meinen Clan.
Somit habe ich mir überlegt, einen Template Parser zu bauen, der variablen in boxen/sprachvariable oder if ersetzt.

Format ist: {_boxname}, {#sprachevar}, {?variable}

Nun scheitert dies aber daran, dass der parser es irgendwie falsch verarbeitet.
Der ersetzte text soll nämlich an php funktionen weiteregegeben werden, die das dann verarbeiten.
Bei Box wird z.b.: überprüft, ob die datei vorhanden ist und dann wir die php datei eingebunden.

Das Problem ist aber, dass er die Ersetzung zu früh macht, d.h. er ersetzt das ganze noch vor dem öffnenden <html> tag.

Hier mein template parser:
Code:
<?php
include_once ("class.loadBox.php");
include_once ("class.loadLang.php");

class html {
	public function loadBox($boxname) {
		$path = "includes/boxes/box.".$boxname.".php";
		
		if (file_exists($path)) {
			include $path;
		}else{
			echo "Couldn't find box named '$boxname' !";
		}
	}
	public function loadLang($langVar) {
		$cur_lang = $_COOKIE['language'];
		
		if (!isset($cur_lang)) {
			$lang = "de";
		}else{
			$lang = $cur_lang;
		}
		
		$file = "language/lang.".$lang.".php";
		
		if (!file_exists($file)) {
			echo "Fatal Error: Language File doesn't exists!";
		}else{
			include $file;
			echo $language[$langVar];
		}
	}
	public function buildPage() {
		include_once ("config.php");
		
		$smysql = mysqli_connect($db['HOST'], $db['USER'], $db['PASS'], $db['DATABASE']);
		$sql = "SELECT value FROM `".$db['DATABASE']."`.`config` WHERE name='default.template.path'";
		
		$result = mysqli_query($smysql, $sql) OR die(mysqli_error());

		$default_template = mysqli_fetch_array($result);
		$default_template = $default_template['value'];
		
		#$loadBox = new loadBox();
		#$loadLang = new LoadLang()
		
		$file = file_get_contents("templates/".$default_template."/index.html");
		$replace = preg_replace("/{_(.*)}/e", "html::loadBox('$1')", $file);
		$replace = preg_replace("/{#(.*)}/e", "html::loadLang('$1')", $replace);
	
		echo $replace;
	}
}

?>

Beispiel-index.html:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{PAGE_TITLE}</title>
</head>
 
<body>

<div id="wrapper">
	<div id="header">
    	<div id="topBar">
        &nbsp;
        </div>
        <div id="logo">
        &nbsp;
        </div>
        <div id="boxBar">
        	<div id="lastWars">
            {_lastwars}
            </div>
            <div id="nextWars">
            {_nextwars}
            </div>
            <div id="lastForum">
            {_lastforum}
            </div>
        </div>
    </div>
</div>

</body>
</html>

Quellcode ausgabe am client:
Code:
  <table width="100%" border="0"><tr><td width='20%'>vs. team3</td><td width='10%'>cs_office</td><td width='40%'>01-01-2011</td><td width='30%'>5on5</td></tr></table><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>{PAGE_TITLE}</title> 
</head> 
 
<body> 
 
 
<div id="wrapper"> 
	<div id="header"> 
    	<div id="topBar"> 
        &nbsp;
        </div> 
        <div id="logo"> 
        &nbsp;
        </div> 
        <div id="boxBar"> 
        	<div id="lastWars"> 
            </div> 
            <div id="nextWars"> 
            </div> 
            <div id="lastForum"> 
            </div> 
        </div> 
    </div> 
</div> 
 
</body> 
</html>

Würde mich über hilfe freuen!

MfG
 
Hi,

warum nimmst du nicht einfach eine fertige Templating Engine wie beispielsweise FLUID? Die kann auch Schleifen, IF-Abfragen und der gleichen und ist darüber noch erweiterbar!

Gruß
 
Erstmals danke für eure Antworten.
Ich will jedoch keine externe Bibliotheken einsetzen, da ich bei denen mich erst einarbeiten muss.

Gibt's eine Möglichkeit mein script fehlerfrei zu machen?

MfG
 
Auf den ersten Blick faellt auf dass deine Funktionen allesamt mit 'echo' ihr Ergebnis an den Client ausgeben statt es mittels 'return' an die aufrufende Funktion zu leiten.
Waer es aber wirklich komplizierter beispielsweise {#sprachevar} im Template durch <?php html::loadLang('sprachevar'); ?> zu erstzen? Das wuerde deine Performance (wenngleich bei kleinen Webseiten nicht merkbar) sehr verbessern und gleichzeitig den Code kaum oder gar nicht verkomplizieren.
Dann muss naemlich ein anderer Coder gar keine neuen Variablenformen kennen, nur Grundbegriffe in PHP ;)
 
Back
Top