Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Tutorial - Teil 3 - Die Template Engine

Diskussion: Tutorial - Teil 3 - Die Template Engine im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Guten Morgen, in diesem Tutorial zeig ich euch, wie man sich selber eine sehr einfache Template Engine basteln kann. ...

Antwort
Alt 18.03.08, 09:26   #1 (permalink)
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard Tutorial - Teil 3 - Die Template Engine

Anzeige

Guten Morgen,

in diesem Tutorial zeig ich euch, wie man sich selber eine sehr einfache Template Engine basteln kann. Aber warum eine eigene Template Engine implementieren, wenn es doch genügend davon gibt!?
Tja, eine eigene Engine hat viele Vorteile, sie kann schnell, flexibel, leicht erweiterbar, usw. sein. Nehmen wir z.B. Smarty, bei Smarty muss man mit Tags arbeiten, welche danach ersetzt werden, sprich das Template muss geparset werden was bei großen Templates einfach Zeit kostet. Klar gibt es Caching, damit das ganze schneller wird, aber wieso sollte man alles so umständlich mit Tags machen, wenn doch PHP selbst als Template Sprache entwickelt wurde.

Deshalb zeig ich euch wie man schnell eine einfache Template Engine, die ihren Zweck erfüllt, implementiert.

Die Klasse nennen wir Template:

PHP-Code:
<?php

class Template {
Als nächstes brauchen wir ein Array, indem wir die ganzen Daten speichern.

PHP-Code:

    
private $vars = array(); 
Dann brauchen wir noch eine Variable, in der wir die Instanz vom FrontController speichern.

PHP-Code:

    
private $controller null
So, nun kommen wir zu den einzelnen Methoden der Klasse.

PHP-Code:

    
public function __construct() {
        
$this->controller FrontController::getInstance();
    }

    public function 
assign($name$value) {
        
$this->vars[$name] = $value;
    } 
Im Konstruktor holen wir uns einfach die Instanz des FrontControllers. Mit der assign()-Methode werden die Daten ans Template geschickt, sie dient zum Registrieren von Variablen, auf die wir später im Template zugreifen.

Jetzt kommen wir zur wichtigsten Methode dieser Klasse, nämlich der display()-Methode. Dieser Methode, wird der Name des Templates übergeben welches angezeigt werden soll.

PHP-Code:

    
public function display($template) {
                
//Der Name des Templates ist so aufgebaut, moduleName.TemplateName
                //Der FrontController splittet uns das ganze auf
        
$action FrontController::getActionName($template);
        
$module FrontController::getModuleName($template);

        
$strTemplate './modules/' $module '/templates/' $action.'.tpl.php';
                
                
// Hier wird geschaut, ob es das Template überhaupt gibt.
                // Falls es das Template nicht gibt, wird eine Fehlermeldung generiert.
        
if ((! file_exists($strTemplate)) || ! is_readable($strTemplate)) {
            
$tmpError "<div style=\"text-align: center; background-color: #E0E0E0; display: block; color: #000000; width: 100%; height: 400px;\" >\n";
            
$tmpError.= "\t<div style=\"padding-top: 180px; font-size: 14px; font-weight: bold;\">\n";
            
$tmpError.= "\tDas Template " $action ".tpl.php konnte nicht angezeigt werden!\n";
            
$tmpError.= "\t</div>\n";
            
$tmpError.= "</div>\n";
        }
        
                
// Fall kein Fehler aufgetreten ist, wird das Template angezeigt. Ansonsten
                // wird die Fehlermeldung ausgegeben.    
        
if (is_null($tmpError)) {
            include(
$strTemplate);
        } else {
            echo 
$tmpError;
        }        
        return;        
    } 
Das wars dann auch schon mit der display-Methode. Man könnte natürlich jetzt noch hergehen, und die Fehlermeldung als eigenständiges Template erstellen.

Kommen wir zu den letzten beiden Methoden der Klasse.

PHP-Code:
        // Mit dieser Methode, kann man andere Actions aus dem Template heraus
        // includieren. Man könnte so z.B. den Header und Footer in eingenes Template
        // auslagern.
    
public function includeAction($completeName) {
        
$this->controller->includeAction($completeName);
    }
    
        
// Mit dieser Methode holen wir uns die vorher registrierten Variablen.
        // Wird eine Variable nicht gefunden, so wird Null zurück gegeben.
    
public function get($name) {
        if (! isset(
$this->vars[$name])) {
            return 
null;
        }
        
        return 
$this->vars[$name];
    }
}
?> 
Ok, jetzt zeig ich euch wie man diese Template Engine einsetzt.

Main.tpl.php
PHP-Code:
<?php
$this
->includeAction('main.IncMainHeader');
?>

<h1>Dies ist unser erstes Template!</h1>

<p>
Hier wird dann ein Text angezeigt!
<br />
<?php
//Hier holen wir uns eine Variable, die wir in der Action registriert haben.
echo $this->get('text'); 

?>
</p>


<?php
$this
->includeAction('main.IncMainFooter');
?>
In diesem Template wird zuerst der Header (stellt eine eigene Action dar) includiert, danach kommen die normalen ausgaben, und zuletzt wird der Footer (stellt auch eine eigene Action dar) includiert.

So weit so gut, jetzt brauchen wir aber noch die Action zum Template.

PHP-Code:
<?php

class Main extends Action {

    public function 
__toString() {
        return 
'Die Main Action';
    }

    public function 
run() {
                
// Hier instanzieren wir die Template Engine
        
$tpl = new Template();
        
// Der Text den wir ausgeben wollen.
        
$text 'Dies ist ein Text der dem Template übergeben wurde!';
        
// Jetzt registrieren wir die Variable im Template
        
$tpl->assign('text'$text);
        
// Und zu guter letzt zeigen wir das Template an.
        
$tpl->display('main.Main');
    }
}
?>
Und das wars dann auch schon, wie Ihr seht ist es nicht sonderlich schwer eine einfache aber denoch effektive Template Engine zu implementieren. Man kann natürlich jetzt noch diverse veränderungen sprich verbesserungen vornehmen, so könnte man z.B. mit den Methoden __set() und __get() arbeiten, welche einem das Leben nochmal erleichtern.

Im Anhang findet Ihr alle benötigten Dateien.
Angehängte Dateien
Dateityp: zip Small_Framework.zip (6,5 KB, 92x aufgerufen)
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 18.03.08, 09:54   #2 (permalink)
 
Registriert seit: 18.03.05
Tasmas Leistung: Facit NTK
Likes: 0
Standard

schön erklärt!

ist mir beim Überfliegen noch augefallen:
PHP-Code:
$tmpError "<div style=\"text-align: center; background-color: #E0E0E0; display: block; color: #000000; width: 100%; height: 400px;\" >\n";
            
$tmpError.= "\t<div style=\"padding-top: 180px; font-size: 14px; font-weight: bold;\">\n";
            
$tmpError.= "\tDas Template " $action ".tpl.php konnte nicht angezeigt werden!\n";
            
$tmpError.= "\t</div>\n";
            
$tmpError.= "</div>\n"
warum das so umständlich? wenns doch mit $tmpError = 'hier template error text'; viel einfacher geht?
Tasmas ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 18.03.08, 10:08   #3 (permalink)
 
Benutzerbild von bad_alloc
 
Registriert seit: 27.12.07
bad_alloc Leistung: 8086
Likes: 39
Standard

sry wenn ich mich so zu wort melden muss aber das gehört doch EIGENTLICH >hier< rein

PS: glaube du hast soeben die tut sektion gerettet >>>KLICK<<<
__________________
You shoot yourself in somebody else's foot.|Dann gabs da noch den Mathematiker der P?=NP in O(1) erklärte.
|[A]| = p(·,|[A]|)+1
bad_alloc ist gerade online   Mit Zitat antworten
Alt 18.03.08, 10:36   #4 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
warum das so umständlich? wenns doch mit $tmpError = 'hier template error text'; viel einfacher geht?
Damit die Fehlermeldung schön verpackt wird. In meinem Framework hab ich das ganze in ein eigenes Template ausgelagert.

@Wolfy
Stimmt, das hätte eigentlich dort rein gehört. Für die nächsten Tutorials merk ich es mir.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 20.03.08, 14:40   #5 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

in den tpl.php files würde ich aber die shortags nutzen:

PHP-Code:
<?= $this->var  ?>
was equivalent zu

PHP-Code:
<?php echo $this->var;  ?>
ist

und wie machst du das mit dynamischen tabellen content?
da ist es ja nichtmehr möglich, nach dem MVC Prinzip zu arbeiten?
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
Alt 20.03.08, 15:37   #6 (permalink)
 
Registriert seit: 25.07.06
valenterry Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von easteregg
in den tpl.php files würde ich aber die shortags nutzen:

PHP-Code:
<?= $this->var  ?>
was equivalent zu

PHP-Code:
<?php echo $this->var;  ?>
ist
Das ist problematisch, wenn gleichzeitig XML eingesetzt wird. Daher sollte man damit (genause wie mit "<?" statt "<?php") gar nicht erst anfangen.
valenterry ist offline   Mit Zitat antworten
Alt 20.03.08, 15:42   #7 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

wieso, wenn man das xml und php schön getrennt hält, sollte das doch eigentlich kein problem sein?
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
Alt 21.03.08, 18:42   #8 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
und wie machst du das mit dynamischen tabellen content?
da ist es ja nichtmehr möglich, nach dem MVC Prinzip zu arbeiten?
Doch das geht, dafür hab ich dann nämlich HTMLTableOutput Layouter. Die werden dann einfach mit einem Dataset gefüttert.

Falls Interesse besteht, dann kann ich ja mal ein Tutorial drüber schreiben.

Zitat:
<?= $this->var ?>
Ich benutze aus zwei Gründen diese Schreibweise nicht:

1) Ich bin die andere Art gewohnt.
2) Performance Gründe (hierüber lässt sich aber streiten, und es wurde schon oft drüber diskutiert)
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 21.03.08, 18:46   #9 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

auf jeden fall besteht daran interesse, weil das ist grad noch so ein problem, wo ich die trennung nicht aufrecht erhalten kann!
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
Alt 02.04.08, 18:56   #10 (permalink)
 
Registriert seit: 01.04.08
.wired Leistung: Facit NTK
Likes: 0
Standard

Hmm, sehr geil wieder Aber folgende Frage: Soweit ich sehe, wird der Inhalt selber jetzt mit Klassen übergeben, richtig? Ist das nicht etwas umständlich? Ich meine, ich würde es gerne ohne Klassen auskommen für den Inhalt...

MfG .wired
.wired ist offline   Mit Zitat antworten
Alt 02.04.08, 20:21   #11 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
Soweit ich sehe, wird der Inhalt selber jetzt mit Klassen übergeben, richtig?
Ja, das siehst Du richtig.

Zitat:
Ist das nicht etwas umständlich?
Warum umständlich? Das ganze wird in Verbindung mit einem FrontController viel einfacher, und vorallem erhalte ich mir so das MVC (Model - View - Controller) Prinzip.

Zitat:
Ich meine, ich würde es gerne ohne Klassen auskommen für den Inhalt...
Warum willst Du ohne Klassen auskommen?
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 06.04.08, 15:21   #12 (permalink)
 
Registriert seit: 01.04.08
.wired Leistung: Facit NTK
Likes: 0
Standard

Hmm ich finde es halt einfacher wenn ich Platzhalter einbaue wie z.B.

Code:
<body>
<div id="root">
  <div id="text">{Platzhalter}</div>
</div>

</body>
Oder Ähnliches. Sonst müsste ich, sollte ich beispielweise vorhaben ein CMS zu bauen - was ich auch tatsächlich vorhabe - für jede neue Seite Klassen schreiben.
Bei meiner Lösung würde ich einfach eine Datei machen mit

Code:
$text = <<< DOC
Bla bla bla dies ist mein Platzhaltertext
DOC;

echo $text;

// oder mit Querys aus einer Datenbank oder sonstwie... und dann ersetzen lassen
Das Problem bei mir ist einfach, dass ich da ganz ehrlichgesagt noch nicht ganz durchblicke durch dein System, weswegen ich wahrscheinlich die (mir zumindest) einfachere Lösung bevorzuge. Ich will aber nicht mit dir darum streiten, dass deine Lösung vielleicht wirklich besser ist nach dem mvc-Prinzip... Nur ist es mir halt noch etwas zu kompliziert solange ich es nicht verstehe

MfG .wired
.wired ist offline   Mit Zitat antworten
Alt 07.04.08, 08:54   #13 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
Oder Ähnliches. Sonst müsste ich, sollte ich beispielweise vorhaben ein CMS zu bauen - was ich auch tatsächlich vorhabe Augenzwinkern - für jede neue Seite Klassen schreiben.
Das musst Du nicht machen, Du kannst auch eine CMS Klasse erstellen die einfach den jeweiligen Content aus der DB holt, und ans Template übergibt.

Zitat:
Das Problem bei mir ist einfach, dass ich da ganz ehrlichgesagt noch nicht ganz durchblicke durch dein System, weswegen ich wahrscheinlich die (mir zumindest) einfachere Lösung bevorzuge. Ich will aber nicht mit dir darum streiten, dass deine Lösung vielleicht wirklich besser ist nach dem mvc-Prinzip... Nur ist es mir halt noch etwas zu kompliziert solange ich es nicht verstehe
Aber ich will streiten . Nö, jeder sollte seine Sachen so umsetzen, wie er es denkt und für Ihn am einfachsten ist.
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Alt 07.04.08, 16:12   #14 (permalink)
Member of Honour
 
Benutzerbild von easteregg
 
Registriert seit: 14.09.07
easteregg Leistung: Pentium Ieasteregg Leistung: Pentium I
easteregg eine Nachricht über ICQ schicken
Likes: 62
Standard

wo wir grad dabei sind, ich hab auch schonmal überlegt, ob ich die kompletten texte in verschiedenen sprachen alle aus der datenbank abfrage, aber ich hab irgendwie angst, dass das zu viel load wird?
was meinst du dazu?
__________________
» Flattr mich! - Wenn dir mein Beitrag geholfen hat! «
<| 2 AMD Opterons 2384@ 8x3,2ghz | Tyan S2915 | 10GB | 2x 8800GT | 8400GS | Dell 3008WFP + 2x2007FP |>
easteregg ist gerade online   Mit Zitat antworten
Alt 07.04.08, 16:41   #15 (permalink)
Themenstarter
 
Benutzerbild von BasicAvid
 
Registriert seit: 17.03.04
BasicAvid Leistung: Facit NTK
Likes: 2
Standard

Zitat:
Original von easteregg
wo wir grad dabei sind, ich hab auch schonmal überlegt, ob ich die kompletten texte in verschiedenen sprachen alle aus der datenbank abfrage, aber ich hab irgendwie angst, dass das zu viel load wird?
was meinst du dazu?
Das musst Du mir mal genauer erklären, willst Du einfach eine Mehrsprachige Seite oder nur einzelne Texte in einer andere Sprache?
__________________
Mfg Basic Avid
- Use it or be used! -
BasicAvid ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Tutorial - Teil 3 - Die Template Engine
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Tutorial: Teil 4 - Wir implementieren einen Layouter BasicAvid (Web-) Design und webbasierte Sprachen 5 27.09.09 19:54
Verständlicher template engine header für C++ Friedrich Code Kitchen 0 08.10.08 00:59
Template öffnen User!?! (Web-) Design und webbasierte Sprachen 0 13.12.05 19:33
Template Arslannnn (Web-) Design und webbasierte Sprachen 2 23.03.05 21:16


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 58 59 60 61