Problem mit Templateparser-Klasse

soyo

Erfahrenes Mitglied
Huhu,

Ich versuch mich schon seit einiger Zeit an meiner eigenen Templateparser-Klasse. Diese funktioniert auch ... leider nur mit einfachen Blöcken. Sobald ich es mit verschachtelten Blöcken versuche, versagt das Script. Ich hab es schon mit einer rekursiven Funktion versucht die den Datenarray ausliest und dann die Klasse aufruft, hatt leider auch nicht geholfen. Ich hoffe einer von euch kann es aber.

template.class.php:
PHP:
<?php
  class template
  {
    var $strTemplate;

 	function Load($strFilePath)
 	{
  	  $resFile = fopen($strFilePath,"r");
  	  $this->strTemplate = fread($resFile,filesize($strFilePath));
  	  fclose($resFile);
 	}

 	function Replace($strNeedle,$strReplacement)
 	{

 	  if(is_array($strReplacement)){

 	    // Blockname und entsprechenden Templatecode dafür auslesen ...

		$strBlockName = $strNeedle;
		$strBlockStart = "{".$strBlockName."}";
		$strBlockEnd =  "{/".$strBlockName."}";

 	    $strBlockTemplateCode = preg_replace('|.*'.$strBlockStart.'(.*)'.$strBlockEnd.'.*|s','${1}',$this->strTemplate);

 	    // ... und durch Platzhalter für den Block ersetzen

 	    $this->strTemplate = preg_replace('|(.*)'.$strBlockStart.'(.*)'.$strBlockEnd.'(.*)|s','${1}{' . $strBlockName . '}${3}',$this->strTemplate);

 	    // elemtanzahl auslesen

 	    $iReplacementNumber = count($strReplacement);

 	    // Platzhalten im Templatecode für den Block ersetzen

 	    $strBlockReplacedCode = array();

		for($i = 0; $i <= $iReplacementNumber-1; $i++){
		  $strBlockTempCode = $strBlockTemplateCode;
 	      foreach ($strReplacement[$i] as $key => $value) {
 	        $strBlockTempCode = str_replace("{".$key."}",$value,$strBlockTempCode);
  		  }
  		  array_push($strBlockReplacedCode,$strBlockTempCode);
  		}

  		$strBlockTempCode = "";
  		
  		// Code von einem Block zusammensetzten

  		foreach ($strBlockReplacedCode as $key => $value) {
  		  $strBlockTempCode .= chop($value);
  		}

 	    // erzeugten Platzhalter durch $strBlockTempCode ersetzen 	    

 	    $this->Replace($strBlockName,$strBlockTempCode);

 	  }
 	  else $this->strTemplate =  str_replace("{".$strNeedle."}",$strReplacement,$this->strTemplate);
 	}

 	function Represent()
 	{
  	  echo $this->strTemplate;
 	}

  }
?>

test.php mit Testdaten:
PHP:
<?php
require_once("template.class.php");


  $T = new template();

  $T->Load("templates/test.tpl");

  $tabelle = array("titel" => "Ueberschrift",
    	           "block:werte" => array(array( "wert1" => "110",
        								         "wert2" => "120",
        								       ),
        								  array( "wert1" => "210",
        								  		 "wert2" => "220",
        							           ),
        							      array( "wert1" => "310",
        								  		 "wert2" => "320",
        							           ),

        							      array( "block:values" => array("value1" => "AA",
        								        						 "value2" => "BB",
        								        						 "value3" => "CC"
        								        						 ),
        	        			     	  	    ),
        							      ),
    			   "subtitel" => "Sub Titel!"
  		     );
  foreach ($tabelle as $key => $value) {
    $T->Replace($key,$value);
  }

  $T->Represent(); 
?>

Und das Template test.tpl:
HTML:
<table align="center" border="0" cellpadding="0" cellspacing="0" class="newsText" width="300">
  <tr>
    <td bgcolor="#CCCCCC" colspan="3">{titel}</td>
  </tr>
  {block:werte}
  <tr>
    <td bgcolor="#DDDDDD">{wert1}</td>
    <td bgcolor="#DDDDDD">{wert2}</td>
    <td bgcolor="#DDDDDD">
    {block:values}
      {value1}<br>
      {value2}<br>
      {value3}
    {/block:values}
    </td>
  </tr>
  {/block:werte}
  <tr>
    <td bgcolor="#CCCCCC" colspan="3">{subtitel}</td>
  </tr>
</table>

Das Ergebniss seht ihr hier.

Momentan weiß ich zwar nicht wann ich mal verschachtelte Blöcke benötige, aber es sollte halt funktionieren.

EDIT: Achso ich brauch nicht die komplette Lösung, mit einen Ansatz wäre ich ganz zufrieden. :)
 
Zuletzt bearbeitet:
Zurück