Taglibs vs. Templates

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
mcerror
Beiträge: 19
Registriert: 19.05.2008, 16:20:22

Taglibs vs. Templates

Beitrag von mcerror » 21.05.2008, 00:18:15

Hallo,

ich hab mal eine grundsätzliche Frage zur Verwendung von Taglibs. Es macht doch keinen Unterschied, ob ich nun eine Taglib einbinden, die etwas ausgibt, oder ein weiteres Template mit den Inhalten? Falls doch, welche Vorteile bietet eine Taglib denn und wann nutze ich was?

NOch was: wie gehe ich vor, wenn ich eine Webseite mit vielen bestehenden Modulen erstelle? Helfen mir da Taglibs vielleicht?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Taglibs vs. Templates

Beitrag von dr.e. » 21.05.2008, 13:14:14

Hallo mcerror,
ich hab mal eine grundsätzliche Frage zur Verwendung von Taglibs. Es macht doch keinen Unterschied, ob ich nun eine Taglib einbinden, die etwas ausgibt, oder ein weiteres Template mit den Inhalten?
doch, es gibt einen signifikaten Unterschied: Taglibs sind ein fester core-Bestandteil des Frameworks und bilden die Basis von Templates. Ein <html:template /> ist im Grunde nichts anderes als die Implementierung einer Taglib. Der Tag-Parser des Frameworks ist dabei so gestaltet, dass er bekannte Tags als Kindknoten des aktuellen DOM-Knotens hinzufügt. Damit kann man - sofern man auf dem aktuellen Knoten "sitzt" - auf diesen über die definierten API-Funktionen zugreifen. Vorteil davon ist, dass die komplette GUI-Struktur in einem Objektbaum (DOM-Baum bestehend aus Objekten, die von der Klasse Document erben) gehalten wird.
Falls doch, welche Vorteile bietet eine Taglib denn und wann nutze ich was?
An sich gibt es dazu eine ganz einfache Regel: nutze das, was du hast, solange es dir deine Anforderungen erfüllt. Das bedeutet konkret, dass du Templates zur Strukturierung der Ausgaben so lange nutzen solltest, wie diese ihren Dienst tun. Sollte eine GUI-Struktur zu komplex werden, kann man entweder Teilbereiche mit <core:importdesign /> in andere Template-Dateien auslagern, oder sich eine eigene TagLib erstellen, die den gewünschten Effekt bringt. In letzter Konsequenz ist es an vielen Stellen auch Geschmacksache, ob eine Taglib Sinn macht, oder die Aufgabe auch innerhalb eines DocumentControllers abgehandelt werden kann. Wenn du möchtest, können wir an einer konkreten Aufgabenstellung diskutieren, wann welche Möglichkeit Sinn macht...
NOch was: wie gehe ich vor, wenn ich eine Webseite mit vielen bestehenden Modulen erstelle? Helfen mir da Taglibs vielleicht?
In meiner Antwort gehe ich davon aus, dass die Module nicht als APF-Module vorliegen. Hier können Taglibs in der Tat helfen. Ich könnte mir dabei vorstellen, dass eine Taglib die Einbindung und das Ausgabe-handling übernehmen kann. Im konkreten Fall könnte die Taglib so aussehen:

Code: Alles auswählen

   class mod_taglib_import extends Document
   {

      function mod_taglib_import(){         
      }
      
      
      function transform(){
         
         // Prüfen, ob Tag-Parameter angegeben wurde 
         if(!isset($this->__Attributes['file'])){
            trigger_error('[mod_taglib_import::transform()] Required attribute "file" is not provided in attributes list!');
          // end if
         }
                
         // Prüfen, ob Modul-Datei existiert       
         if(!file_exists($this->__Attributes['file'])){
            trigger_error('[mod_taglib_import::transform()] File "'.$this->__Attributes['file'].'" does not exist!');
          // end if  
         }
         
         // Outputbuffer starten
         ob_start();
         
         // Modul einbinden. Dieses erzeugt seine Ausgabe selbst
         include_once($this->__Attributes['file']);
         
         // Outputbuffer beenden
         ob_end_flush();     
         
         // Inhalt des Outputbuffer zurückgeben
         return ob_get_contents();    
         
       // end function  
      }
      
    // end class  
   }
Die Taglib erwartet dabei ein Attribut "file", das den Pfad und die Datei des einzubindenen Moduls enthält. Mit Hilfe der ob_*-Funktionen wird der Inhalt dabei "aufgefangen" und an der Stelle, an der die Taglib eingebunden ist im Baum eingefügt. Die Einbindung des Tags passiert dabei wie folgt:

Code: Alles auswählen

<core:addtaglib namespace="sites::mysite::pres::taglib" prefix="mod" class="import" />
<mod:import file="/var/www/html/mysite/guestbook/guestbook.php" />
Im Beispiel gehe ich davon aus, dass die PHP-Datei mit der Taglib im Ordner apps/sites/mysite/pres/taglib abgelegt wurde. Diese Angabe muss dann entsprechend an deine Umgebung angepasst werden. Innerhalb des Moduls kann jedoch jedweder gültige PHP-Code ausgeführt werden. Wichtig ist dabei, dass die darüber eingebundenen Module ihre Ausgabe direkt erzeugen. Wie ist egal, es geht nur darum, dass der Tag die Ausgabe "auffangen" kann.

Ich hoffe, ich konnte dir damit helfen.
Viele Grüße,
Christian

mcerror
Beiträge: 19
Registriert: 19.05.2008, 16:20:22

Re: Taglibs vs. Templates

Beitrag von mcerror » 21.05.2008, 14:01:25

Hallo,

hmm und wie wird das eingebundene Modul mit den URL Parametenr versorgt? Ich habe jetzt versucht meine Newsanzeige so einzubinden und das klappt auch schon ganz gut. Hatte zuerst SChwierigkeiten mit dem datei Pfad, aber in dem Fall muss man einen absoluten Pfad angeben.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Taglibs vs. Templates

Beitrag von dr.e. » 21.05.2008, 18:01:08

Hallo mcerror,
hmm und wie wird das eingebundene Modul mit den URL Parametenr versorgt?
Du kannst innerhalb deines Moduls weiter auf Parameter aus den globalen variablen $_GET, $_POST, $_REQUEST, ... zugreifen. Wenn es um Informationen geht, die im aktuellen DOM-Knoten vorliegen, kann man diese in der Taglib vor dem include[_once]() definieren und in der eingebundenen Datei nutzen. Damit schafft man sich zwar eine direkte Abhängigkeit, kann das jedoch dadurch umgehen, dass man dies in das $_REQUEST-Array schreibt und im Modul abfragt, ob der Parameter gesetzt ist und falls nein einen Standard-Wert annimmt.

Quellcode könnte folgender sein:

TagLib-Code:

Code: Alles auswählen

...      
         // Outputbuffer starten
         ob_start();
         
         // Attribute des aktuellen DOM-Knotens publizieren
         $_REQUEST['lang'] = $this->__Language;
         $_REQUEST['newsperpage'] = $this->__Attributes['newsperpage'];
   
         // Modul einbinden. Dieses erzeugt seine Ausgabe selbst
         include_once($this->__Attributes['file']);
         
         // Outputbuffer beenden
         ob_end_flush();     
...
Einbindung der Tagllib:

Code: Alles auswählen

<core:addtaglib namespace="sites::mysite::pres::taglib" prefix="mod" class="import" />
<mod:import file="/var/www/html/mysite/newsmodule.php" newsperpage="5" />
Modul-Datei newsmodule.php:

Code: Alles auswählen

...
if(isset($_REQUEST['lang'])){
   $lang = $_REQUEST['lang'];
}
else{
   $lang = 'de';
}

if(isset($_REQUEST['newsperpage'])){
   $newsperpage = $_REQUEST['newsperpage'];
}
else{
   $newsperpage = 'de';
}
...
Mit dem Parameter newsperpage wollte ich lediglich demonstrieren, dass man bei der Übergabe an das Modul auch Attribute aus der Tag-Definition direkt übergeben kann. Solltest du noch Fragen haben, dann melde dich einfach.
Viele Grüße,
Christian

mcerror
Beiträge: 19
Registriert: 19.05.2008, 16:20:22

Re: Taglibs vs. Templates

Beitrag von mcerror » 22.05.2008, 23:02:03

Hallo dr.e.,

ok, damit hab ichs tatsächlich hin bekommen. Ich kann nun alle meine akten Module verwenden. danke!

MC

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste