Template Klasse

M

MaxivB

Hallo,

ich habe eine Template Klasse erstellt:
PHP:
class tpl {
	var $file;
	var $output;
	var $between;
	var $r_str_arr;
	var $v_str_arr;
	var $name;
	function tpl($tpl_file = ""){
		$this->file = $tpl_file;
		$output = '';
		$handle = fopen ($this->file, 'r');
		while (!feof($handle)){
			$buffer = fgets($handle, 4096);
			$output .= $buffer;
			}
		$this->output = $output;
		fclose ($handle);
		$this->r_str_arr = array();
		$this->v_str_arr = array();
		}
	function replace($r_str, $v_str) {
		$this->output = str_ireplace('{'.$r_str.'}', $v_str, $this->output);
		}
	function block($name) {
/* Ich fürhe am anfang diese Funtion aus */
		preg_match_all("=\[".$name."\](.*)\[\/".$name."\]=siU", $this->output, $this->between);
		$this->between = $this->between[1][0];
		$this->name = $name;
		}
	function replace_block($r_str, $v_str) {
/* Dann kommt eine schleife in der index.php und in diese kommt dann beliebig oft diese Funktion reib */
		array_push($this->r_str_arr, $r_str);
		array_push($this->v_str_arr, $v_str);
		}
	function exit_block() {
/* Am ende wird dann außerhalb der schleife dies ausgeführt: */
		$r_strs = array();
// -- Alle zu ersetztenden strings kommen hier in diese foreach-schleife --
		foreach ($this->r_str_arr as $test) {
// -- Es wird der $r_strs nur $test hinzugefügt, wenn es in $r_strs nochnicht drin ist, so kann ich zählen, wie viele replaces in den schleifen eingesetzt wurden --
			if (!in_array($test, $r_strs)) {
				array_push($r_strs, $test);
				}
			}
// -- hier wird berechnet, wie oft die schleife ausgefürht wurde (die gesamtzahl der zu ersetztenden strings durch die replaces, die wir geade berechnet hatten --
		$count = count($this->r_str_arr) / count($r_strs);
		$end = "";
// -- Jetzt kommt eine einfache for-schleife --
		for ($i = 0; $i < $count; $i ++) {
			$test = array();
			$zutest = array();
			foreach ($r_strs as $str) {
// -- Hier haben wir dann jeden string, der ersetzt werden soll und dann wieder in $test hinzugefügt wird -- 
				array_push($test, $str);
				}
			$w = $i * count($r_strs);
			$t = count($this->r_str_arr);
			for ($r = $w; $r < $w + count($r_strs); $r ++) {
// -- Und hier dann jede ersetztung --
				array_push($zutest, $this->v_str_arr[$r]);
				}
			$e = -1;
			$content = $this->between;
			foreach ($test as $j) {
				$e ++;
// -- Hier wird dann ein str_replace() ausgeführt. --
				$content = str_replace("{".$j."}", $zutest[$e], $content);
				}
// -- Ab hier wird es hoffentlich verständlich ;)
			$end .= $content;
			}
		$this->output = preg_replace("=\[".$this->name."\](.*)\[\/".$this->name."\]=siU", $end, $this->output);
		}
	function display(){
		echo $this->output;
		}
	}
/* ------------------------------- */
$tpl = new tpl("./test.txt");
$tpl->block("test");
$array = array("nr1", "nr2", "nr3");
$c = 0;
foreach($array as $string) {
	$c++;
	$tpl->replace_block("hallo", $c);
	$tpl->replace_block("test", $string);
	$tpl->replace_block("halloo", "ersetztung");
	$tpl->replace_block("ein_test", "...");
	}
$tpl->exit_block();
$tpl->display();
Das funktioniert auch...
Nun meine frage: Ich habe das mit dem exit_block() sehr umständlich gemacht... Kann man das noch vereinfachen?
 
Zuletzt bearbeitet von einem Moderator:
Ein paar Kommentare im Quelltext bitte. Gibt nur wenige die sich in die komplette Klasse extra einarbeiten möchten um eine Funktion zu verbessern.
 
Hallo!
Also ich weiß nicht... Ich kann mit dieser Klasse im Allgemeinen nichts Anfangen. Der Support von PHP 4 wurde mit dem Release der Version 4.4.9 offiziell eingestellt. Dieser Schritt wurde bereits letztes Jahr angekündigt und sollte mit dem Start der Olympischen Spiele in Bejing zusammenfallen. Ich kann nur empfehlen, dass schnellst möglich alle ihre alten und noch verwendbaren Klassen oder Scripte auf den Stand von PHP5 bringen (ist auch komfortabler). Hier mal eine alternative Klasse mit PHP5.

PHP:
<?php

/***
* Class Template
*
* Template class allows filling templates with life.
* Sure this class supports also the nesting of
* different templates. So you can manage superior
* designs and webpages.
*  
* @package Template
* @version 0.4
* @author Mauricio Hannika
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Mauricio Hannika, Andreas Wilhelm
**/  
class Template
{
    protected $template;
    protected $vars;

    /**
    * Constructor - Sets the filename of the template
    *
    * @access public
    * @param Str $template
    * @return Boolean
    */
    public function __construct($template)
    {
        if( !file_exists($template) || !is_readable($template) )
        {
            throw new Exception('Could not load template file.');
        }  
      
        $this->template = $template;
    }

    /**
    * __get() - Returns the queried value
    *
    * @access public
    * @param Str $key
    * @return String
    */
    public function __get($key)
    {
        return isset($this->vars[$key]) ? $this->vars[$key] : '';
    }

    /**
    * __set() - Sets the variables
    *
    * @access public
    * @param Str $key
    * @param Str $value
    * @return String
    */
    public function __set($key, $value)
    {
        if(isset($this->vars[$key]))
        {
            throw new Exception($key . ' has already been set.');
        }
      
        $this->vars[$key] = $value;
    }

    /**
    * parse() - Parses a file and returns it
    *
    * @access public
    * @param Str $path
    * @return String
    */
    public function parse($path='')
    {    
        ob_start();
        
        if( !@include_once($path) )
        {
            throw new Exception('Failed to parse file.');            
        }
        
        $parsed = ob_get_contents();
        ob_end_clean();
        
        return $parsed;
    }

    /**
    * __toString() - Renders the template
    *
    * @access public
    * @return String
    */
    public function __toString()
    {  
        return $this->parse( $this->template );
    }
}
?>
Ein Template dazu könnte so aussehen:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">

    <head>            
        <title>&middot; <?= $this->title; ?> &middot;</title>

        <meta name="Title" content="<?= $this->title; ?>" />
        <meta name="Author" content="pseudo@mail.de" />
        <meta name="Publisher" content="pseudo.tld" />
        <meta name="Copyright" content="pseudo.tld" />
        <meta name="Revisit" content="After 2 days" />
        <meta name="Keywords" content="pseudo, test, titel, homepage, website" />
        <meta name="Description" content="Besuchen Sie meine Seite! Es k&ouml;nnte sich lohnen." />
        <meta name="Abstract" content="Visit my website. It'll be great." />
        <meta name="Robots" content="INDEX,FOLLOW" />
        <meta name="Language" content="Deutsch" />
        <meta name="Distribution" content="global" />
        <meta http-equiv="content-Type" content="text/html;charset=iso-8859-1" />
        
        <link rel="stylesheet" type="text/css" href="design.css"/>    
    </head>
        
    <body>
        <div id="page">
        
            <h1 id="headline"><?= $this->title; ?></h1>        
            
            <ul id="navigation">
                <?= $this->navigation; ?>
            </ul>
            
            <div id="content">
                <?= $this->content; ?>
            </div>                    
            
            <p id="footer">
                powered by <?= $this->title; ?> © <?= $this->date; ?>                
            </p>
        </div>
    </body>
</html>
Die index.php dazu sieht dann so aus:
PHP:
<?php
    try
    {
        // load required classes
        require_once('Template.php');
                        
        $mysqli = new mysqli('DB_HOST', 'DB_USER', 'DB_PWD', 'DB_NAME');
            
        $tpl = new Template('layout.html');
            
        if( empty($_GET['site']) )
        {
            $content = $tpl->parse('home.html');
        }
            
        elseif( !isset($_GET['site']) || !file_exists($_GET['site']) || !is_readable($_GET['site']) )
        {
            $content = '<p>Die Seite konnte leider nicht gefunden werden.</p>';
        }
            
        else
        {
            $site = $_GET['site'];
            $content = $tpl->parse($site);
        }
        
        
        $sql = "SELECT
                *
            FROM
                navigation
            ORDER BY
                name";
        
        // send sql-query
        if ( $result = $mysqli->query($sql) )
        {        
            // save result into an array
            $navigation = '';
            while( $row = $result->fetch_assoc() )
            {
                $navigation .= '<li><a href="index.php?site='.$row['id'].'">'.$row['name'].'</a></li>';
            }
        }
        
        else
        {
            $navigation = '<b>Die Navigation konnte leider nicht geladen werden.</b>';
        }
        
        $tpl->title = $navigation;
        $tpl->navigation = $navigation;
        $tpl->content = $content;
        $tpl->date = date('Y');
            
        echo $tpl;
    }
        
    catch(Exception $e)
    {
        echo '<p>'.$e->getMessage().'</p>';
    }
?>
Denke das ist doch sehr übersichtlich und absolut einfach. Um das ganze noch abszurunden, kann man noch die hässliche URL via mod-rewrite verstecken. Das ganze könnte am Ende dann wie in diesem Beispiel aussehen.
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
@Catull

Du setzt ja wiederum php ein in deinen Template files. Wenn man schon so genau ist und auf php 5 pocht dann sollte man auch wie vorgesehen keinen php code in den Templateflies verwenden. Platzhalter reichen da völlig aus.

Was mir bei euch beiden in den Klassen fehlt sind ganz einfache Grundfunktionen die immer benötigt werden. Soweit ich gesehen hab können eure Klassen zwar Platzhalter ersetzen ausnahme Catull klasse die Arbeitet mit php befehlen.

Aber was ist mit Schleifen die werden immer wieder mal gebraucht und ihr habt keine Möglichkeit das in dem Template files umzusetzen ohne wieder php code zu verwenden!

Ich zeig auch mal meine Templateklasse sie ist zwar auch net besonders und könnte noch weiter Optimiert werden aber sie besitzt zumindestens die Grundlegenden sachen wie eben Schleifen und ersetzen von Platzhaltern sowie das bearbeiten von Verschachtelten Schleifen. Desweitern unterstütz sie das Einbinden von weiteren Templates files was ich bei euch auch nicht endecken konnte.Sowie das einbinden von Kommentaren in den Template files

Template Klasse
PHP:
<?php 
/**
* Template Klasse
* @version 2.1 
* @author Splasch
* Filename: Template.php
* Verschachtelte Templates files
* Schleifen Loop Funktion
**/ 
class Template
{
   protected $template;  /* Template Inhalt */ 
   protected $templateDir;	// Der Ordner in dem sich die Template-Dateien befinden.
   protected $loop;        # Array Schleifen füll Werte
   public 	 $liste;	   #Lade Reihenfolge der Template Datein
   
/**
* Klassen aufruf - Lade Template file von $path
* @param Str $path
*/
public function __construct($path = '')
{
 if (file_exists($path) == false)
  {
   throw new Exception ('Template File nicht gefunden path: `' . $path . '`');
  }
 if ($tpl = file_get_contents($path))
  {
    $this->templateDir=dirname($path).DIRECTORY_SEPARATOR; #Kombilität zu Linux"\\"
    $this->replace($tpl); 
  }
}

/**
* replace() - Ersetzt platzhalter für includierte Files 
* @param Str $str enthält der Template
* @return String
*/
protected function replace($str)
{// Includes ersetzen ( {include="..."} )
 $liste=null;
 while(preg_match_all("/".'{'."include=\"(.*)\"".'}'."/isUe", $str,$file,PREG_PATTERN_ORDER))
 {
  foreach ($file[1] as $datei)
  { 
   try
   {
  	$file=$this->templateDir.$datei.".tpl";
  	$liste.=$file.", "; #echo $file;
  	$this->liste=$liste; # Für fehler suche Ausgabehilfe
  	if(file_exists($file) == false)
  	{ 
  	 throw new Exception();
   	}
   }
   catch(Exception $e)
   {
  	die("Template File nicht gefunden path:<b>\"".$file."\"</b><br>"
  	.$e->getFile().$e->getLine().$e->getTraceAsString()
  	."<br><b>Ladereihenfolge der Templatefiles: </b>".$liste);
   }
  } // ende foreach
  $str = preg_replace("/".'{'."include=\"(.*)\"".'}'."/isUe", "file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2'.'tpl')", $str);
 } // ende while
 
 $this->template=$str;
}
/**
 * con - Inhalt Umlaute Sonderzeichen Html Konform umwandeln
 * @param Str $in
 */
public function con($in)
{
 $suche=array("ä","Ä","ö","Ö","ü","Ü","ß","€");
 $ersatz=array("&auml;","&Auml;","&ouml;","&Ouml;","&uuml;","&Uuml;","&szlig;","&euro");	
 $in=str_replace ($suche,$ersatz, $in);	
 return $in;
}
/**
 * set_loop - Inhalt Platzhalter für Schleifen 
 * @param Str $name
 * @param Array $inhalt 
 */
public function setLoop($name,$inhalt)
{
 $this->loop[$name]=$inhalt;
}
/**
 * replace_loop - Loop Schleifen ausführen und Inhalt Ersetzen
 * @param Str $name - Name der Schleife die Ersetzt wird
 * @param Str $in - Inhalt der Html Elemente Innerhalb der Schleife
 */
protected function replace_loop($name,$in)
{ #Umlaute Html komform ersetzen
 $in=$this->con($in);
 if (isset($this->loop[$name]) && is_array($this->loop[$name]))
  { $neu=""; $str=0;     
   foreach ($this->loop[$name] as $key=>$inhalt)
   {  $str++;
    foreach($inhalt as $replace)
    { 
     if ($str==1){$neu.= preg_replace("/{.$key}/us", $replace, $in);}
      Else{$neu= preg_replace("/{.$key}/Usi", $replace, $neu,1);}
    }
   }
   $this->template = preg_replace("/{loop={$name}}.*{loop=$name end}/Uis", "$neu", $this->template);     
  } #ende if isset    
}

/**
* __set() - Ersetze den Platzhalter mit dem Inhalt der Variable $replacement
* @param Str $placeholder
* @param Str $replacement
*/
public function __set($placeholder, $replacement)
{
 preg_match("/{loop=(.*)}(.*){loop=\\1 end}/Usie", $this->template, $str);  
 if (!empty($str[1])) // Wenn Schleife dann Teile tauschen
 {  
  $this->replace_loop($str[1],$str[2]); #loop Name und Loop Inhalt übergeben
 } #ende empty
 
 $this->template = str_replace('{$'.$placeholder.'}', $replacement, $this->template);
 # Wenn Include im Template ist neu Parsen
 if (preg_match("/".'{'."include=\"(.*)\"".'}'."/isUe", $this->template))
 {
  $this->replace($this->template); 
 } //ende preg_match
} //ende Set

/**
* getTpl() - Gibt den Template Inhalt zurück
* @return String
*/
public function getTpl()
{
 // Kommentare löschen
 $str = preg_replace("/".'\{\*(.*)\*\}'."/isUe", "", $this->template);	
 return $str;
}

} // Klasse ende
?>

Anwendungs Beispiel hier ein Auzug aus meinen Warenkorb Template file
PHP:
{* file Warenkorb.php *}
{* Wird Angezeig wenn was im Warenkorb ist *}
<table cellpadding="0" cellspacing="0"  align="center" border="0" >
<tr>
<td><b>Warenkorb<br><br></b></td>
</tr>
</table>
<table cellpadding="2" cellspacing="0" align="center"  border="0">
 <tr>
  <td>
   <table cellpadding="2" cellspacing="0"  align="center" bgcolor="#E3F2CC" class="Warenkorb">
	<tr>
	 <td><b>Menge</b></td>
	 <td> 
	 <table width=100% class="Warenkorb_innen">
	  <tr>
	   <td><b>Produkt Bezeichnung </b></td>
	   <td><div align="right"><b> Artikelnummer</b></div></td>
	  </tr>	
	 </table>
	 </td>
	 <td><b>Preis </b></td>
	</tr><tr>
	
     {loop=produkte}
	 <td>
      <form action="index.php?pos={$pos}&amp;xPos=1&amp;Best={$Best}&amp;E=2&amp;" method="post" target=_self>
      <table cellpadding="0" cellspacing="0" border="0" width=100% class="Warenkorb_innen">
	   <tr> 
	    <td nowrap>
	     <INPUT type="text" name="NeuAnzahl" size="3" value="{$Menge}"><b> {$Mengenart}&nbsp;</b><br>
	 	 <a href="index.php?pos={$pos}&amp;xPos=1&amp;Best={$Best}&amp;L=1&amp;" >L&ouml;schen</a>
	 	</td>
	 	<td align="right" valign="top">	
	 	 <input class="input" type=submit name="sub" value="&Auml;ndern" style="width:65px"><br>
	    </td>
	   </tr>
	  </table>
      </form>
	 </td>
	 <td>
	  <table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
	   <tr>
	    <td>{$Prodname}{$std}
        </td>
		<td>
		 <div align="right"><font class="blau">&nbsp;&nbsp;&nbsp;{$Artikelnr}</font></div>
		</td>
	   </tr>			
	  </table>
	 </td>
	 <td>
 	<table cellpadding=0 cellspacing=0 width="100%" class="Warenkorb_innen">
 	 <tr>
 	  <td align="left">&euro;</td>
 	  <td align="right">
 	   {$Zw}<br>
	  </td>
	 </tr>
 	</table>
 	</td>	
   </tr>
   <tr>
   {loop=produkte end}
    <td colspan="2" rowspan="4">
     <table cellpadding=3 cellspacing=0 width=100% class="Warenkorb_innen" >
   	  <tr>	
	   <td><div align="right"><b>Gesamtbetrag</b></div></td>
	  </tr><tr>
	   <td><div align="right">MwSt. 20%</div></td>
	  </tr><tr>
	   <td><div align="right">Versandkosten</div></td>
	  </tr><tr>
	   <td><div align="right"><b>Endbetrag</b></div></td>
	  </tr>
     </table>
    </td>
    <td>
	 <table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
	  <tr>
	   <td align="left">&euro;&nbsp;</td>
	   <td>
        <div align="right">{$Summe}</div>
       </td>
	  </tr>
	 </table>	
   </tr>
   <tr>
    <td>
	 <table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
	  <tr>
	   <td align="left">&euro;&nbsp;</td>
	   <td>
		<div align="right">{$Mwst}</div>
	   </td>
	  </tr>
	 </table>
   </tr>
   <tr>
    <td>
	 <table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
	  <tr>
	   <td align="left">&euro;&nbsp;</td>
	   <td>
		<div align="right">{$Versand}</div>
	   </td>
	  </tr>
	 </table>
   </tr>
   <tr>
    <td>
	 <table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
	  <tr>
	   <td align="left">&euro;&nbsp;</td>
	   <td>
        <div align="right">{$Endsumme}</div>
       </td>   
	  </tr>
	 </table>
   </tr>
  </table>
  </td>
 </tr>
 <tr>
  <td>
   <form action="index.php?pos={$pos}&amp;xPos=1&amp;Best={$Best}&amp;" method="post" target=_self>
   <table cellpadding=0 cellspacing=0  border="0">
    <tr>
	 <td><br>
 	  <b>Lieferland </b>&nbsp;
	  <select name="land" id="land" onchange="this.form.submit();" style="font-size:13px;font-weight:bold;width:115px">
	   <option {$selected1} value="Deutschland">Deutschland</option>
	   <option {$selected2} value="Österreich">Österreich</option>
	  </select>
	  <input class="input" type=hidden name="Zart" value="{$Zart}">
	 </td> 
	 <td align="left"><br>
	  <b>&nbsp;&nbsp;Zahlung per</b>&nbsp;
	  <select name="Zart"  onchange="this.form.submit();" style="font-size:13px;font-weight:bold;">
	   <option {$lieferschein} value="Lieferschein">Lieferschein</option>
	   <option {$vorauskassa} value="Vorauskassa">Vorauskassa</option>
	   <option {$nachname} value="Nachnahme">Nachnahme</option>
	  </select>				
	 </td>
	</tr>
   </table>	
   </form>	
  </td>		
 </tr>			
</table>		
<table cellpadding="2" cellspacing="0" align="center"  border="0">
 <tr>
  <td align="center">
   <br><a href="index.php?pos={$pos}&amp;xPos=14&amp;">Bestellen</a>
  </td>
 </tr>
</table> 
{include="Weiteres_Templatefile"}

Und die Verwendung der Klasse gestalltet sich sehr einfach
PHP:
<?
define ('DIRSEP', DIRECTORY_SEPARATOR);// Für Linux Kompatibele Slash 
define ('path',dirname(__FILE__).DIRSEP);

$basisTpl=path."templates"; #Basis Template Verzeichniss vorgeben

// Eine neue Instanz der Template Klasse erzeugen
$tpl = new Template($basisTpl.DIRSEP.'index.tpl');

# Beispiel für Schleifen
# Einfach in der Scheife ein Array erzeugen  das Array könnte dann so ausschauen 
$korb['Best'][]="Ausgabe1";	
$korb['Menge'][]="Ausgabe2";	
$korb['Mengenart'][]="Ausgabe3";	
// unsw.

//Array das aus der Schleife erzeugt wurde dem Template übergeben
$tpl->setLoop("produkte",$korb);

//Einfaches ersetzen von Platzhaltern
$tpl->Summe=15;
$tpl->Versand=8;
//unsw.

#Weiter Template files Dynamisch einfügen (einfach Platzhalter durch neues Template file ersetzen)
$tpl->Endsumme='{include="Filename"}';  #Hier wird die Template datei Filename.tpl reingeladen

//Augeben der Template 
echo $tpl->getTpl();

Das waren oben nur Anwendungs Beispiele um zu Demonstrieren wie man die Klasse Verwendet.
Die eingefügten Werte ergeben natürlich keinen sin im Zusammenhang des Warenkorb Templatefiles.
Sie dienen ledig um zu Zeigen wie man die Klasse einsetzen kann und auch wie man Dynamisch weitere Files nachladen kann. Wenn vorher die noch nicht fest stehen.

Ansonsten könnt ihr gleich ins Templatefile den Platzhalter für Nachladen reinschreiben.

Mfg Splasch
 
Zuletzt bearbeitet:
@Splash:
Ich nutze nur Templates um das Layout wiederverwenden zu können und wirklichen Programmcode vom Template zu trennen. Dir ist hoffentlich klar, dass PHP eine Template-Spreache ist. Es ist praktisch dafür optimal. Und wenn du es so sehen willst ist mein <?= $this->entry; ?> auch nichts anderes als ein Platzhalter. Zudem funktioniert meine Templateklasse um einiges Schneller als deine, da preg_replace() eine ziemlich lahme Funktion ist. Ein absoluter Performance fresser. Deine ganze Klasse ist viel zu vollgestopft. Die Hälfte der Methoden ist überflüssig. Was sollen solche Dinge wie Pseudo-Funktionen wie include? Da kann man in der index-Datei auch die komplette Datei laden und über einen Platzhalter zuweisen. Du willst schleifen in deinem Template? Wieso? Reicht es nicht meinetwegen Daten aus einer Datenbank in einer Schleife zu verarbeiten, die fertig verarbeiteten Daten einem Platzhalter zuzuordnen und fertig? Wozu der ganze Pseudo-Code? Selbes gilt auch für das verschachteln von Templates. Mit parse() das Template aufrufen, dies einem Platzhalter zuordnen und fertig. Und wenn du unbedingt Schleifen und so ein kram in deinen Templates haben musst, bietet dir PHP dafür eine extra Syntax.
PHP:
        <table class="list" style="width: 95%;">
            <caption>Links</caption>
            <tr>
                <? while( $field = key($row) ): ?> 
                    <th><a href="tabs.php?sort=<?= $field; ?>&dir=<?= $dir; ?>"><?= $field; ?></a></th>
                    <? next($row); ?>
                <? endwhile; ?>
            </tr>
            <tr>
                <td><?= implode("</td><td>", $row); ?></td>
            </tr>
            <? while( $row = $result->fetch_assoc() ): ?>
            <tr>
                <td><?= implode("</td><td>", $row); ?></td>
            </tr>
            <? endwhile; ?>
        </table>
Diese Art der Templateverarbeitung nennt man auch das Template-View Pattern, also ein reguläres Pattern gegen das nichts spricht.
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
Schau das ganze sind Ansichtsachen eines jedens. Die Grenzen dabei sind sehr eng beieinander.

Wenn du nun wieder php mit Hmtl mischt verlierst sich diese Trennung wieder. Bei den einfachen Beispielen mag es noch wenig ausehen aber im Laufe der Entwiklung wirste darauf kommen das allein mit $this nicht getan ist und du wirst weiteren php code einbinden.

Im endefekt steuerst du damit genau auf das hin was du vermeiden wolltes und zwar das mischen von php und html.

Jetzt einfach mal Darzustellen ,wenn man nur 1% php einsetz in Templatefiles sei es noch ok sei mal dahin gestellt.
Wenn man keine 100% Trennung macht wird die Performenc immer besser sein. Aber genauso gut könntes du das Trennen dann auch gleich weg lassen.

Denn schnell wird in großen Projekten aus dem 1% dann 3% ,5% unsw.

Man sollte schon bei eindeutigen Sachen bleiben oder eben dafür dann eine neue Defination auslegen.

Alles eine frage wie man es ausleg:
Ist ein Moterrad mit 3 Rädern auch noch ein Moterrad oder doch schon eher ein Auto.
(Und genau da hat man dann dafür wieder einen neuen Namen Definiert)

Deins entspricht nun mal nicht dem singemässen Vorgaben einer Template. Man könnte dafür eben auch einen neuen Namen definieren zbs. Subtemplate

Siehe nur dein Beispiel von eben nun sind schon aus 1% php code 3% und mehr geworden!
table class="list" style="width: 95%;">
<caption>Links</caption>
<tr>
<? while( $field = key($row) ): ?>
<th><a href="tabs.php?sort=<?= $field; ?>&dir=<?= $dir; ?>"><?= $field; ?></a></th>
<? next($row); ?>
<? endwhile; ?>
</tr>
<tr>
<td><?= implode("</td><td>", $row); ?></td>
</tr>
<? while( $row = $result->fetch_assoc() ): ?>
<tr>
<td><?= implode("</td><td>", $row); ?></td>
</tr>
<? endwhile; ?>
</table>

Mfg Splasch
 
Zuletzt bearbeitet:
Mein Beispiel war auch nur ein Beispiel. Ich greife auf solche Sytax nur in testumgebungen zurück, um Algorithmen zu testen. Alles PHP lastige lasse ich vor dem einbinden in das Template parsen. Dadurch reichen mir Platzhalter vollkommen. Und für mich ist die Performance sehr wichtig und dass ich die Templates "lesen" kann. Dies ist aber nur solange gegeben, wie ich keinerlei Programmlogik egal ob pseudo oder nicht verwende. Und dies ist auch der Punkt den ich am wenigsten verstehe. Wieso ersetzt man, wenn man für mich unverständlicher weise Programmlogik in einem Template verwendet, diese auch noch durch pseudo Code, der ds ganze nicht lesbarer macht und auch noch die Performance zerstört. Positives kann ich daran nicht finden.
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
@MaxivB: Ich stell mich hinter ZodiacXP an: Kannst du ein paar Kommentare oder Erklärungen zu dieser exit_*() Methode schreiben? Da wird soviele gelooped und mit arrays gearbeitet, da muss man sich ja richtig einarbeiten. Ein paar Hilfen wären gut.

Zu der allgemeinen Thema Templateklasse:
Puh, da haben wir es ja zum Glück vor dem neuen Jahr nochmal geschafft eine TemplateKlassen Disskussion zu starten ;)

Ich sehe PHP auch als Templatesprache an und verzichte daher in einer Templatesprache eine Templatesprache zu programmieren.
Dabei glaube ich auch nicht, das bei der Einführung von PHP5 die Entwickler im Sinn hatten, das man keinen PHP Code in Templatefiles nutzen darf/soll. Allerdings muss ich splasch recht geben, was das Beispiel von Catull angeht. Die MySQL Ressource sollte nicht im Template iteriert werden, vor allem nicht wenn man ein MVC Pattern nutzt, dann gehört es ins "M", mindestens in den "C" aber nicht in "V".
Die Argumentation der "Definition eines Templates" finde ich nach meiner Ansicht hier nicht passend, denn die Frage ist, auf welcher Basis man die Definitionen aufstellt.
Ich sehe es zwar auch so, das ein Template nur "Platzhalter" und keine erweiterten Ressourcen beinhalten soll, aber die Basis der Definition von Templates ist hier PHP und diese "HTML embeded scripting language" bietet mir für dieses Thema alles was man brauch, sodass ich keine weitere neu erfundene "Scripting Language" benötige. Es ist vielleicht eine Frage des Glaubens ob man catulls Methode "Subtemplate" nennt oder splaschs Weg "Subscriptingtemplate". Das Argument das ich zuviel PHP Code im Template nutze kann man auch andersrum nutzen. Wer hindert mich, das HTML schon im PHP Code vorbereite und dann nur noch den Platzhalter im Template mit dem HTML Code ersetze.

Die Performance wird bei Catulls Beispiel ziemlich identisch sein, als würde man den HTML Teil direkt im PHP Code vermischen., wohingegen bei der wirklich strikten Trennung die Performance leidet.
Ein realitätsnahes Beispiel ist glaube ich die Darstellung einer Tabelle mit Zahlenwerten oder man kann auch die Zeichenkodierung nehmen.
Lese ich aus einer Datenbank Floats aus, so sind diese in der amerikanischen Notierung (Punkt als Dezimaltrennzeichen) gehalten. Bei der 100% Trennung muss ich nun im "PHP Code" das Array einmal iterieren, damit ich die Darstellung auf die ISO Norm bringe mit einem Komma als Dezimaltrennzeichen. Oder ich will Geldbeträge für Schweizer Besucher darstellen. Hier wird der Punkt als Trennzeichen verwendet, wohingegen bei Nicht-Geldbeträgen wieder das Komma zum einsatz kommt.
Dieses veränderte Array übergibt man dann an die TPL Scripting Language, iteriere das Array erneut und schreibt die Werte dann entsprechend in das Template.
Bei der Nutzung von PHP als Templatesprache kann ich die Daten aus der Datenbank als Array oder als PDO Result Object direkt an die TPL Klasse übergeben und bei der Iteration des Arrays oder Objektes die Veränderung durchführen. Das setzt natürlich vorraus das die TPL Klasse oder View Object über Plugins oder als direkte Implementierung dies kann.
Die Argumentation, das dies die Datenbank direkt machen kann ist korrekt, aber was ist, wenn ich die Daten aus einer Datei kriege oder über einen SOAP Request oder ein anderes externes System?

Nach soviel Text für die Nutzung von PHP als Templateengine muss ich aber festhalten, das PHP die Möglichkeit bietet beides umzusetzen und es keine strikten Vorgaben gibt und der persönliche Geschmack entscheidet.

Um zum Abschluss:
@Catull: die ShortTags werden ab PHP6 deprecated eingestuft
@splasch: Ein Fahrzeug das 3 Räder hat ist in Deutschland natürlich klar definiert. Sollte das Fahrzeug zwei Vorderräder mit einem gewissen Spurabstand haben und die Bremswirkung auf alle 3 Räder wirken, dann handelt es sich um ein Mehrspurfahrzeug und ein Autoführerschein ist notwendig. So in der Art habe ich es in Erinnerung. Wurde vom ADAC geklärt als der Rollerhersteller Piaggio letztens ein neues 3 rädriges Modell vorgstellt hat ;)
 
Zurück