Webdesign in Siegen

Templateengine

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

Re: Templateengine

Beitragvon mAu am 14.04.2008, 11:57

Also gehen wir von dem Beispiel mit den Boxen in der Sidebar aus und eine Tabelle, wo alle vorhandenen User gelistet werden. Ich würde mein Template in etwa so aufbauen:
Code: Alles auswählen
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <title>Templatebeispiel</title>
   </head>
   <body>
      <div id="sidebar">
         <?php if($this->calBar): ?>
         <ul>
            <li>Kalenderbar</li>
         </ul>
         <?php endif; if($this->linkBar): ?>
         <ul>
            <li>Linkbar</li>
         </ul>
         <?php endif; ?>         
      </div>
      <table id="userliste">
      <tr>
         <td>Name</td>
         <td>E-Mail</td>
         <td>Web</td>
         <td>Telefon</td>
      </tr>
      <?php foreach($this->users as $user): ?>
      <tr>
         <td><?php echo $user['name'] == 'admin' ? "<b>{$user['name']}</b>" : $user['name']; ?></td>
         <td><?php echo $user['email']; ?></td>
         <td><?php echo $user['web']; ?></td>
         <td><?php echo $user['phone']; ?></td>
      </tr>
      <?php endforeach; ?>
      </table>
   </body>
</html>


Durch die in PHP5 hinzugekommene magische Funktion __get() werden bei den zwei if-Konstrukten oben auch keine Warnings angezeigt, da man dann bei nicht existenter Variable false zurück geben kann.
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008, 10:17

Re: Templateengine

Beitragvon Avedo am 14.04.2008, 12:21

Das heißt aber, dass du alles schon im Template stehen haben musst. Das zusammenfügen von Templates würde mehrere Zusatzdateien erfordern. Das hinzufügen einer neuen Box erfordert jedes mal das rumpfuschen im Template. Mit einer Template Engine definierst du nur einmal das Haupttemplate und die Untertemplates. Beispiel:

template.tpl
Code: Alles auswählen
<!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; Deine-Website.tld &middot;</title>

      <meta name="Title" content="Name der Website" />
      <meta name="Author" content="name@mail.tld" />
      <meta name="Publisher" content="Deine-Website.tld" />
      <meta name="Copyright" content="Deine-Website.tld" />
      <meta name="Revisit" content="After 2 days" />
      <meta name="Keywords" content="hier, stehen, nun, Stcihwörter" />
      <meta name="Description" content="Hier steht was zu deiner Seite." />
      <meta name="Abstract" content="Here you can tell us something about your website." />
      <meta name="Robots" content="INDEX,FOLLOW" />
      <meta name="Language" content="Deutsch" />
      <meta name="Distribution" content="DE, AT, CH, EU" />
      <meta http-equiv="content-Type" content="text/html;charset=iso-8859-1" />
     
      <link rel="shortcut icon" type="image/ico" href="favicon.ico" />
      <link rel="stylesheet" type="text/css" href="design.css"/>
   </head>
     
   <body>
      <div id="page">
            {* just a small comment *}
         <div id="masthead">{$masthead}</div>
                 
         <ul id="navigation">           
            {include="navi.php"}
         </ul>
         
         <div id="content">
            <h1 class="headline">{$headline}</h1>
            {$content}
         </div>

            {$sidebar}
         
         <p id="footer">Copyright &copy;  {$copy}  {$url} - Alle Rechte Vorbehalten.</p>
      </div>
   </body>
</html>


box.tpl
Code: Alles auswählen
   <div class="sidebar">
      <h1 class="barhead">{$barhead}</h1>
      <div class="barcontent">
          {$barcontent}
      </div>
      <p class="barfooter"> {$barfooter}</p>
   </div>


Wenn man das ganze nun in einer Index.php zusammenfügt, ist das meiner Meinung nach viel Übersichtlicher, spart Code und Arbeit. Denn man muss nicht jedes mal in den Templates rumbasteln oder dort irgendwelchen Code unterbringen, sondern man arbeitet nur noch in der index.php. Das Hinzufügen von neuen Bereichen wird so auch deutlich einfacher. Interessant wird das aber vorallem dann, wenn man viel aktiv machen möchte oder ein Verwaltungs System aufbaut.
MfG, Andy

//EDIT: Habe hier gerade noch ein schönes Beispiel und eine Erklärung gefunden, wie es auch ohne Template-Engine geht. Finde ich sehr ansprechend und schlüssig, auch wenn es mir noch nicht so recht zusagen möchte, dass man das ganze so vermixt.
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templateengine

Beitragvon mAu am 14.04.2008, 13:02

Code: Alles auswählen
/* index.tpl.php */
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <title>Templatebeispiel</title>
   </head>
   <body>
      <div id="sidebar">
         <?php echo $this->sideBar; ?>   
      </div>
   </body>
</html>

/* sidebar.tpl.php*/
<?php if($this->calBar): ?>
<ul>
    <li>Kalender</li>
</ul>
<?php endif; ?>

/* index.php */
$index = new Tempalte('index.tpl.php');

$sideBar = new Template('sidebar.tpl.php');
$sideBar->assign('calBar', true);

$index->assign('sideBar', $sideBar->render());

echo $index->render();


:roll:

Nachtrag
@Andreas: Ich glaube, wir müssen uns nochmal überlegen, wie wir das dann bei unserem CMS lösen wollen :mrgreen:
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008, 10:17

Re: Templateengine

Beitragvon Avedo am 14.04.2008, 14:15

Irgendwie sieht das nun wie ein Salat aus beiden Wegen aus. Müsste man die dazugehörige Klasse sehen um das wirklich beurteilen zu können, ob das so Sinn macht. Sieht aber vom Ansatz her Interessant aus.

@mAu
Wir sollten uns tatächlich nochmals Gedanken zu der ganzen Sache machen.
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templateengine

Beitragvon .wired am 14.04.2008, 18:08

Hmm, ich denke, ich habe mich endgültig für die Template Engine entschieden. Auch wenns im Grunde ein Overhead ist, ist es bei meinem höchst umfangreichen Projekt doch sinnvoll.

@Avedo: Darf ich die Idee der Kommentare und der Includes aus deiner Template Engine übernehmen? Ich habe bisher geplant, die Includes ganz normal mit PHP zu machen, aber wenn ich denn schon PHP von HTML trenne, dann richtig ;) . Würde mich jedenfalls sehr freuen ;)

@mAu: Bist du nicht auch bei tutorials.de angemeldet und hast sogar deine eigene Templateengine dort geschrieben? Oder verwechsle ich dich da mit jemandem? ;)

MfG .wired
Bild Bild
Benutzeravatar
.wired
Mitglied
 
Beiträge: 316
Registriert: 24.06.2007, 20:36
Wohnort: Diekholzen

Re: Templateengine

Beitragvon mAu am 14.04.2008, 18:52

.wired hat geschrieben:[...]
@mAu: Bist du nicht auch bei tutorials.de angemeldet und hast sogar deine eigene Templateengine dort geschrieben? Oder verwechsle ich dich da mit jemandem? ;)

MfG .wired


Nein, das bin wirklich ich. Aber das ist ja schon länger her und seitdem hab' ich mich ein bisschen "fortgebildet" in Sachen PHP :) Früher dachte ich eben, man sei "in" wenn man eine möglichst komplexe Templkateengine schreibt & benutzt ;)
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008, 10:17

Re: Templateengine

Beitragvon .wired am 14.04.2008, 18:59

Hehe... Ich denke aber mal wirklich, dass bei besonders umfangreichen und komplexen Projekten eine Templateengine durchaus angebracht ist. So kann man auch wie ich finde viel schneller und besser ein zugehöriges Cachesystem schreiben, vorausgesetzt, man hat sich erstmal tatsächich mit der Templateengine abgerackert ;) Man muss dann halt je nach Situation entscheiden, wobei ich wohl in nächster Zeit bei allen weniger umfangreichen Projekten tatsächlich lieber auf PHP selbst als "Templateengine" umsteigen werde...

[offtopic] Hmm, wird "Templateengine" jetzt eigentlich zusammen oder auseinander geschrieben? o.O :lol: [/offtopic]
Bild Bild
Benutzeravatar
.wired
Mitglied
 
Beiträge: 316
Registriert: 24.06.2007, 20:36
Wohnort: Diekholzen

Re: Templateengine

Beitragvon mAu am 14.04.2008, 19:09

Also ich möchte noch mal klarstellen, dass ich ja auch mit Templates arbeite, nur dass ich eben die Templates nicht durch einen eigenen Parser jage. Mit einer Templateklasse arbeite ich jedoch auch, geht in etwa in die Richtung, wie ich auf Seite 1 geposted habe. Da kann man selbstverständlich auch ein Cachingmechanismus implementieren ...
mAu
Mitglied
 
Beiträge: 13
Registriert: 12.04.2008, 10:17

Re: Templateengine

Beitragvon Avedo am 14.04.2008, 19:33

@topic
Wenn dann würde ich auch nur einfache TemplateEngines benutzen. Auf tutorials.de habe ich zum Beispiel eine Klasse gesehen, die auch mehrere Templates verwalten kann. Anfangs war ich hellauf begeistert. Doch was soll das eigentlich bringen. Das kann man mit meiner Klasse auch. Clonen Freunde. Hat auch mehr oder weniger bei Dolly gefunkt. :lol:

@mAu
Wo hast du denn mal an einer TemplateEngine bei tutorials.de gebastelt. Wusste ich garnicht.

@.wired
Klar kannste das auch übernehmen, aber du kannst auch einfach die Klasse verwenden. Ist ja schon extra nichts wirklich kompliziertes. Die Delimeter kannste nach deinem Belieben anpassen. Kommentiert ist das ganze ja wohl sehr ausreichend. eval() habe ich übrigens ganz absichtlich umgangen und die Ausgabe gepuffert.

@offtopic
Ich schreibs mal mit Bindestrich und mal ohne, aber am liebsten zusammen und beides Groß! :lol: TemplateEngine
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templateengine

Beitragvon .wired am 14.04.2008, 20:17

H3h3, so nun habe ich aber auch mal eine Frage zu meiner *Andy nachmach:* TemplateEngine :lol: :lol: :lol: :lol:

Also ersteinmalzeig ich sie euch mal, aber ich mache das mit noPaste, OK? Will hier nicht das kleine Codefensterchen flooden :P. Hat noch jemand vielleicht Verbesserungsvorschläge was die Performance angeht / einfachere Schreibweisen, Features? (Ausgenommen die Blöcke, an die denke ich beizeiten noch :P, ach ja, und das Cachesystem habe ich auch im Hinterkopf :P)

Und noch eines: Mein Template bleibt merkwürdigerweise immer bei der Funktion (ich weiß, in Klassen heißt das Methode, aber ich habs mir so eingewöhnt^^) template_file() hängen und gibt die Fehlermeldung aus, weiß jemand woran es liegen könnte?

Link: http://nopaste.php-quake.net/24416

MfG .wired und danke im Voraus ;)

PS.: Ist nicht mehr ganz so aktuell, da ich noch ein paar Syntaxfehler rausgehauen habe die __destruct-Funktion korrigiert habe, aber im Ganzen ist es noch aktuell zu meiner Klasse hier auf dem Rechner, nur damit ihr euch wegen dem $this->$template nicht wundert ;)
Bild Bild
Benutzeravatar
.wired
Mitglied
 
Beiträge: 316
Registriert: 24.06.2007, 20:36
Wohnort: Diekholzen

Re: Templateengine

Beitragvon Avedo am 14.04.2008, 21:36

Wozu soll denn die Methode display() gut sein? (Abgesehen davon, dass es im Prinzip keine Unterschiede zu replace() gibt) Warum benutzt du einen Destructor? Wieso speicherst du die verscheidenen Templates in ein Array? Fragen über Fragen, die auf eine Antwort warten.
MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templateengine

Beitragvon .wired am 14.04.2008, 21:54

Ja, die display Methode war nur wieder so ein kleiner Fehler, den habe ich schon behoben. Lautet jetzt:

Code: Alles auswählen
function display()
{
  echo $this->template['template'];
  return TRUE
}


Die Unterschiede meinst du doch auch wohl eher zu parse(), oder? Die Funktion habe ich auch 1 zu 1 von deiner Engine übernommen, fand ich kurz, knackig und gut. Der destructor ist da, um den Variablenarray wieder zu entleeren und Performance freizugeben, so wie ich auch häufiger unset() benutzt habe. Und zum Array: Ich finde es einfach angenehmer die Variablen in einem Array zu speichern als für alles eine neue Variable zu definieren, ich glaube auch irgendwo gelesen zu haben, dass es auch an Leistung spart, trotz dessen, dass man die Variablen ja immernoch im Array selber definieren muss.

MfG .wired
Bild Bild
Benutzeravatar
.wired
Mitglied
 
Beiträge: 316
Registriert: 24.06.2007, 20:36
Wohnort: Diekholzen

Re: Templateengine

Beitragvon Avedo am 26.04.2008, 01:23

Morgen!
Wie gesagt habe ich mir nochmal in Ruhe meine alte TemplateEngine angesehen und einige "Mängel" behoben. Das ganze ist nun, meiner Meinung nach, deutlich übersichtlicher und funktionaler. Unnötiger SchnickSchnack wurde von mir entfernt. Wie immer habe ich versucht meinen Quellcode so verständlich wie nur irgendwie möglich zu dokumentieren.

Die Optionen der alten Klasse Kommentar in das Template einzufügen, habe ich rausgenommen, weil man in HTML selbst dokumentieren kann und das sollte, finde ich, reichen.

Die Möglichkeit zu Includen habe ich deswegen gestrichen, da man das besser und flexibler selbst lösen kann. Einfach mit der parse()-Methode eine Datei aufrufen und den von dieser erzeugten HTML-Code in einer Variabel abspeichern und dann via assign() einen Platzhalter zuweisen. Sehe gehe ich auch sicher, dass logische Strukturen, wie Schleifen oder Bedingungen, nicht in der Template-Datei zu finden sind.

Das direkte Ausgeben des Templates via out() wurde auch geändert. An dieser Stelle steht nun die Methode getTpl(). Diese liefert den HTML-Code des Templates zurück. Wieso nicht gleich ausgeben? Manchmal möchte man ja Templates verschachteln und das wird dadurch möglich. Ruft man nun zwei Templates in zwei verschiedenen Instanzen der Klasse TemplateEngine auf und füllt diese mit Daten, kann man den HTML-Code des einen Templates in einer Variabel speichern und diesen teil via assign() in das andere Template einfügen. So kann man zum Beispiel meinen geliebten Boxen in der Sidebar ein eigenes Template erstellen und sie dennoch ganz einfach und komfortabel in die Website integrieren.

Ich wäre euch sehr dankbar für eure Meinungen, Anregungen und Hinweise.
MfG, Andy

TemplateEngine.php
Code: Alles auswählen
<?php 
error_reporting(E_ALL);

/***
* Template class allows filling templates with life

* @package TemplateEngine
* @version 0.7
* @author Andreas Wilhelm <Andreas2209@web.de>
* @copyright Andreas Wilhelm
**/ 
class TemplateEngine
{

   /* the template itself */
   protected $template;   
   
   /**
   * Cunstructor - Loads template file from $path
   *
   * @access public
   * @param Str $path
   * @return boolean
   */
   public function __construct($path = '')
   {     
      if ($tpl = file_get_contents($path))
      {
         $this->template = $tpl;
         
         return $tpl;    
      }
      
      else
      {
         throw new Exception("Failed to open $path.");
      }   
   }

   /**
   * assign() - Replaces the placeholders with the intended content
   *
   * @access public
   * @param Str $placeholder
   * @param Str $replacement
   * @return String
   */
   public function assign($placeholder, $replacement)
   {   
      $this->template = str_replace('{$'.$placeholder.'}', $replacement, $this->template);
      return  $this->template;
   }

   /**
   * parse() - Parses a file and saves it to a string
   *
   * @access public
   * @param Str $path
   * @return String
   */
   public function parse($path)
   {   
      ob_start();
      include($path);
      $parsed = ob_get_contents();
      ob_end_clean();
      return $parsed;
   }

   /**
   * getTpl() - Returns the parsed template
   *
   * @access public
   * @return String
   */
   public function getTpl()
   {
      return $this->template;
   }
}
?> 
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templateengine

Beitragvon Avedo am 27.04.2008, 18:52

Keiner irgendwelche gehessigen Bemerkungen oder Anregungen für mich?
MfG, Andy
Ich bin zu Mimis Religion konvertiert!
I'm so tired of slitting the throats of people calling me a violent psychopath.
Benutzeravatar
Avedo
Mitglied
 
Beiträge: 464
Registriert: 09.12.2007, 20:12
Wohnort: Göttingen

Re: Templateengine

Beitragvon Basti am 27.04.2008, 19:38

Ah, eigentlich wollte ich schon gestern was schreiben, aber dann hatte ich es wohl doch wieder vergessen.

Also übersichtlich und schlank ist deine Klasse nun wirklich, aber mir persönlich wäre sie als wirkliche TemplateEngine einfach unzureichend, da dann doch einige wichtige Elemente fehlen die meiner Meinung nach zur effizienten Trennung von PHP Teil und Ausgabe nötig sind.

Ich arbeite derzeit selbst an einer eigenen TemplateEngine und versuche dort alles möglichst vielseitig und logisch zu gestalten, wobei im selbstgeschriebenen PHP Teil aber eigentlich nur noch elementare Dinge stattfinden sollen, also Template laden, Blöcke verarbeiten und Template ausgeben. Alles weitere findet innerhalb der Klasse statt.
Und da wären wir auch schon beim dem ersten fehlenden Element: Wie werden mit deiner Klasse Blöcke oder Schleifen realisiert? Mir ist so etwas bei einer TemplateEngine immer sehr wichtg, da vorallem dadurch für mehr Übersichtlichkeit und eine einfachere Umsetzung von "Schleifen-Ausgaben" ermöglicht wird.

Zudem ist es meiner Meinung nach praktischer, wenn man weitere Templatedateien direkt im Template über Platzhalter einfügen kann und nicht noch extra über PHP gehen muss.

Das wäre für mich erstmal am wichtigsten. Alles weitere, was ich auch noch in meiner TemplateEngine einsetze, ist nicht zwingend notwendig, wobei ich eine Anzeigeregelung über Platzhalter (anstatt von if-Abfragen) und ein paar andere Erweiterungen der Grundfunktionen (z.B. um Operatoren, damit einige Platzhalter von Variablen o.ä. abhängig gemacht werden können) durchaus für sinnvoll halte.
Benutzeravatar
Basti
Moderator
 
Beiträge: 1791
Registriert: 15.06.2006, 17:33
Wohnort: Rheinbreitbach

VorherigeNächste

Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast