[PHP] Templates - die Template-Klasse "vlibTemplate"

ClausVB
Jeder PHP-Programmierer kennt Skripte, die sowohl PHP- als auch HTML-Code enthalten. Oft besteht das Skript dann aus mehreren echo "<table width='80%'>\n\t<tr bgcolor='$farbe'>"; oder einer Mischung aus solchen ECHO-HTML-Anweisungen und HTML-Blöcken. Das Ergebnis ist mitunter schwer lesbar/verständlich. Templates machen eine Trennung zwischen PHP-Programmierung und WebDesign möglich.

Hier alle wichtigen Links auf einen Blick:

Die Einführung & Forum
http://lamp.clausvb.de/
deutsches Forum

WYSIWYG - Frontpage - Dreamweaver
http://lamp.clausvb.de/vtpl_wysiwyg.htm

Praktisches Beispiel: Das Heron-Verfahren zum Wurzelziehen
Wurzel ziehen

Downloads
http://vlib.activefish.com/download/
Beispiele
ThiefMaster
Ich halt von dieser Art Templateklasse eigentlich nichts - da ist mir das gute, alte EVAL lieber:

Hier mal meine Templateklasse:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
<?php
class tpl
{
 var $templates   = array();
 var $defaultfolder '';
 
 /* constuctor */
 function tpl()
 {
  $this->defaultfolder 'templates';
 }
 
 /* get template */
 function get_content($templatename)
 {
  if(!isset($this->templates[$templatename]))
  {
   if(file_exists($this->defaultfolder.'/'.$templatename.'.tpl'))
   {
    $this->templates[$templatename]=str_replace(""","\"",implode('',file($this->defaultfolder.'/'.$templatename.'.tpl')));
   }
   else
   {
    die('Template --&gt;'.$templatename.'&lt;--existiert nicht');
   }
  }
  return $this->templates[$templatename];
 }
 
 function get($variable,$templatename,$op='=')
 {
  return '$'.$variable.' '.$op.' " '.$this->get_content($templatename).'";';
 }

 /* print template */
 function output($template)
 {
  headers::send();
  echo $template;
 }
 
 function out($templatename)
 {
  return '$tpl->output("'.$this->get_content($templatename).'");';
 }
}
?>


php:
1:
2:
3:
<?php eval($tpl->get("header","header"));
eval($tpl->get("footer","footer","=",true));
eval($tpl->out("index")); ?>

Das ist dann flexibler und schneller, weil lästige Regexe wegfallen
ClausVB
Zitat:
Original von ThiefMaster
Ich halt von dieser Art Templateklasse eigentlich nichts - da ist mir das gute, alte EVAL lieber:

Das ist dann flexibler und schneller, weil lästige Regexe wegfallen


Die schnellsten Varianten von vlibTemplate brauchen 80 ms um eine Webseite zu generieren. Wie es mit großen Portalen aussieht, weiß ich nicht. Aber dafür gibt es ja die CACHE-Funktion.

Der Hersteller (Kelvin Jones) sagt: "It compiles a template into native PHP code using 1 (one) pcre call, thus the parsing is extremely fast."

Für mich überwiegen hier ganz klar die Vorteile, wie LOOPS, IF-ELSE, DEBUG und viele Features mehr.

Andererseits gibt es viele PHP-Gurus, die ihre eigenen Klassen benutzen.

Ich gebe allerdings gerne zu, dass ich nie in der Lage wäre, eine so komplexe, intuitive und effektive Templatebenutzung zu schreiben, wie Kelvin oder andere Leute.

Gruß
Claus
alphacraft
Zitat:
Original von ThiefMaster
Ich halt von dieser Art Templateklasse eigentlich nichts - da ist mir das gute, alte EVAL lieber:

Hier mal meine Templateklasse:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
<?php
class tpl
{
 var $templates   = array();
 var $defaultfolder '';
 
 /* constuctor */
 function tpl()
 {
  $this->defaultfolder 'templates';
 }
 
 /* get template */
 function get_content($templatename,$parse_if_local=false)
 {
  if(!isset($this->templates[$templatename]))
  {
   if(file_exists($this->defaultfolder.'/'.$templatename.'.tpl'))
   {
    $this->templates[$templatename]=str_replace(""","\"",implode('',file($this->defaultfolder.'/'.$templatename.'.tpl')));
   }
   else
   {
    die('Template --&gt;'.$templatename.'&lt;--existiert nicht');
   }
  }
  if($parse_if_local==true && ($_SERVER[REMOTE_ADDR]=='127.0.0.1' || $_SERVER[SERVER_NAME]=="planetcoding.homeip.net" || $_SERVER[SERVER_NAME]=="boards.homeip.net"))
  {
   $this->templates[$templatename]=eregi_replace("<IfNotLocal>(.*)</IfNotLocal>","",$this->templates[$templatename]);
   $this->templates[$templatename]=eregi_replace("<IfLocal>(.*)</IfLocal>","\1",$this->templates[$templatename]);
  }
  elseif($parse_if_local==true && ($_SERVER[REMOTE_ADDR]!='127.0.0.1' && $_SERVER[SERVER_NAME]!="planetcoding.homeip.net" && $_SERVER[SERVER_NAME]!="boards.homeip.net"))
  {
   $this->templates[$templatename]=eregi_replace("<IfLocal>(.*)</IfLocal>","",$this->templates[$templatename]);
   $this->templates[$templatename]=eregi_replace("<IfNotLocal>(.*)</IfNotLocal>","\1",$this->templates[$templatename]);
  }
  return $this->templates[$templatename];
 }
 
 function get($variable,$templatename,$op='=',$parse_if_local=false)
 {
  return '$'.$variable.' '.$op.' " '.$this->get_content($templatename,$parse_if_local).'";';
 }

 /* print template */
 function output($template)
 {
  headers::send();
  echo $template;
 }
 
 function out($templatename)
 {
  return '$tpl->output("'.$this->get_content($templatename).'");';
 }
}
?>


php:
1:
2:
3:
<?php eval($tpl->get("header","header"));
eval($tpl->get("footer","footer","=",true));
eval($tpl->out("index")); ?>

Das ist dann flexibler und schneller, weil lästige Regexe wegfallen

WOW, nicht schlecht...
Darf ich mir die klauen *g*
Kannsu mir auch eine gute mySQL-Klasse coden? Meine funxt nicht unglücklich