Montag, 3. Juli 2006

PHP

Template Engines in PHP Teil 2

Um Code und Layout zu trennen benötigt man keine Template Engine wie Smarty. Zwei kleine Klasse in PHP und PHP selbst genügen um den Code vom Layout zutrennen...

Wie schon in einem anderen Artikel von mir beschrieben, sind Template Engines meiner Meinung nach überflüssig.

Einige werden sich wahrscheinlich trotzdem nicht davon trennen, entweder aus Bequemlichkeit, oder weil eventuell man gar nicht weiss woher ein angemessener Ersatz zu bekommen ist. Deswegen werde ich euch zeigen, wie man mit nur zwei Klassen sehr gut Code und Layout trennen kann, ohne auf die schwergewichtigen Template Engines zu setzen.

Was wir aufjedenfall benötigen ist eine Klasse, die zum Speichern der Werte verwendet wird. Warum speichern von Werten? Entweder man gibt direkt im Code per print oder echo den Wert einer Variablen aus, oder man speichert ihn und verwendet ihn erst später, in der Ansicht.

Um also das Layout und den Code zu trennen benötigen wir zwei Klassen. Einmal die Model Klasse und einmal die Page Klasse. Die Model ist dafür da, um die verschieden Werte mit ihrem Schlüssel aufzunehmen. Das Pageobjekt wird zum Anzeigen der Seite verwendet.

Model

Vom Prinzip her, ist die Model Klasse, eine einfache Klasse die verschiedene Schlüssel und ihre Werte aufnimmt. Die ganze Klasse steht in Listing 1. Vom Aufbau der Model Klasse ist wie folgt. Es gibt ein Attribut, die private Variable $model, sowie deren Setter und Getter und die Methode Model::assign(). Diese Methode nimmt einen Schlüssel $aryKey und deren Wert $modelValue entgegen und speichert diese in der Membervariablen $model. Eine kleines Bespiel kann in Listing 2 betrachtet werden. Dort wird aus einer Datenbank der Counterstand für eine Webseite geholt und in dem Model Objekt für die spätere Verwendung gespeichert.

Page / (View)

Jetzt fehlt noch die Page Klasse. Der Quellcode für die Page Klasse befindet sich in Listing 3 sehen kann. Dem Konstruktor wird der Name der Templatedatei mitgegeben. Die Methode Page::add fügt die Schlüssel und Werte eines Model hinzu und die Methode Page::display ist für das Anzeigen der Templatedatei zuständig. Das Besondere an der Page::display Methode ist, das alle Variablen sich nicht im globalen Namensraum, sondern im Namensraum der Funktion befindet – was meiner Meinung nach ziemlich Praktisch ist. Wenn nun die Methode ausgeführt wird, werden alle Variablen in das Assoziative Array $TPL „kopiert“ (referenziert, wegen dem & Operator). So kann man dann bequem im Templatefile auf die Werte zugreifen. Ein kleines Beispiel befindet sich in Listing 4, welches an das Beispiel in Listing 2 angelehnt ist.



Listing 1

Download Code!

  1.  
  2.  
  3. class Model {
  4.    
  5.     private $model = array();
  6.    
  7.        
  8.     public function __construct() {
  9.     }
  10.  
  11.  
  12.     public function setModel($model){
  13.         $this->model = $model;
  14.     }
  15.    
  16.  
  17.     public function getModel() {
  18.         return $this->model;
  19.     }
  20.  
  21.  
  22.     public function assign($aryKey, $modelValue) {
  23.         $this->model[$aryKey] = $modelValue;
  24.     }
  25.    
  26.    
  27. }
  28.  


Listing 2

Download Code!

  1.  
  2. // ... Mysql Verbindung aufbauen und Datenbank auswählen
  3. $result = mysql_query('SELECT counter FROM counter', $con);
  4. $row = mysql_fetch_assoc($result);
  5. $counter = 0;
  6. if($row = mysql_fetch_assoc($result)) {
  7.         $counter =  $row['counter'];
  8. }
  9. $model = new Model();
  10. $model->assign('counter', $counter);
  11.  
  12. // Mehrere Werte (Array)
  13. $result = mysql_query('SELECT user FROM users', $con);
  14. $row = mysql_fetch_assoc($result);
  15. $userList = array();
  16. if($result = mysql_fetch_assoc($result)) {
  17.         $userList =  $result;
  18. }
  19. $model->assign('userList', $userList);
  20.  
  21.  
  22.  


Listing 3

Download Code!

  1.  
  2.  
  3. class Page {
  4.        
  5.  
  6.     protected $file = '';
  7.    
  8.     protected $storage = array();
  9.    
  10.     public function __construct($file) {
  11.         if(!is_file($file)) throw new Exception();
  12.         $this->file = $file;
  13.     }
  14.    
  15.  
  16.     public function add(Model $m) {
  17.         foreach($m->getModel() as $key => $val) {
  18.             $this->storage[$key] = $val;
  19.         }
  20.     }
  21.    
  22.  
  23.     public function display() {
  24.         $TPL     = &$this->storage;
  25.         require_once($this->file);´
  26.     }
  27. }
  28.  


Listing 4

Download Code!

  1.  
  2.  
  3. try {
  4.         $page = new Page('mainpage.php');
  5.         $page->addModel($model);
  6.         $page->display();
  7. } catch (Exception $e) {
  8.         // Fehlerbehandlung
  9. }
  10.  
  11.  
  12.  
  13. // Die Datei mainpage.php
  14.  
  15. <!-- Einiges an HTML -->
  16. <div>Es gab insgesamt: <?php $TPL['counter'] ?> Zugriffe auf diese Webseite</div>
  17. <!-- Einiges an HTML -->
  18. <?php if(count($userList)): ?>
  19.         <h1>Liste der User</h1>
  20.         <ul>
  21.         <?php foreach ($userList as $user): ?>
  22.                 <li><?php echo $user['name']; ?></li>
  23.                 <!-- Kurzschreibweise, nicht zu empfehlen, da auf manchen Servern nicht verfügbar -->
  24.                 <!-- <li><?= $user['name']; ?></li> -->
  25.         <?php endforeach; ?>
  26.         </ul>
  27. <?php endif; ?>
  28.  
  29.  
Bewertung: keine, 0 Stimme(n) 546 Klicks
PHP
Von Mr.Foo in PHP am 03.07.06@13:58 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

4 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Marc - #1 - 27.03.2007 19:39 - (Antwort)

Hey,

Coole Idee!
Für einfache Ausgaben sicherlich besser als mit einem Templatesystem!

Nur wenn dann im "Template" mit Schlaufen zu arbeiten, griefft man wiederum auf PHP zurück...
oder??

Torsten - #2 - 21.09.2008 08:27 - (Antwort)

Das würde mich auch mal interessieren, also wie die Sache bei Schleifen aussieht. Das würde das ganze ein wenig umständlich machen ...

Torsten - #3 - 21.09.2008 08:28 - (Antwort)

Mich würde auch interessieren wie das bei Schleifen und Co funktionieren soll, ich glaub das würde die Sache ein wenig umständlich machen oder nicht?

Mr. Foo - #4 - 22.09.2008 10:46 - (Antwort)

Hallo,

das Beispiel wurde jetzt um IF-Abfragen und Schleifen erweitert.


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Template Engines in PHP Teil 2

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen