Tipps und Tricks zu Perl und CPAN-Modulen

Template-im-Template mit Template-Toolkit

Beitrag von Uwe am 06.02.2007 um 14:06 Uhr | 4 Kommentare

Das Template-Modul meiner Wahl ist das Template-Toolkit von Andy Wardley (nicht verunsichern lassen, vom Template-Toolkit Version 2.16 von Adam Kennedy). Vor einigen Jahren habe ich noch mein eigenes Template-System verwendet.

Heute möchte ich einen kleinen "Trick" vorstellen, wie man mit einem Template ein Template erstellen kann. Dies kommt bei diesem Perl-Blog zum Einsatz (bei dem CGI-Skript für die Kommentare).

Normalerweise verwendet Template-Toolkit (kurz: TT2 oder TT) [% und %] als öffnendes und schließendes Tag. Möchte man nun mit einem Template ein Template erstellen, soll ja die Ausgabe wiederum diese Tags enthalten. Normalerweise entfernt TT2 ja alle Tags. Man kann sich nun mit Variablen behelfen:

[% SET tag_open  = '[%' %]
[% SET tag_close = '%]' %]
[% SET var = 'data.name' %]
[% tag_open _ ' ' _ var _ ' ' _ tag_close %]

Dies würde das folgende Template ergeben:

[% data.name %]

Es gibt aber einen eleganteren Weg: TT2 erlaubt die Verwendung alternativer Tags. Mit START_TAG und END_TAG kann man das öffnende und schließende Tag separat angeben, mit TAG_STYLE kann man zwischen verschiedenen Vorgaben wählen:

Style Tags
template [% und %]
template1 [% und %] oder %% und %%
metatext %% und %%
star [* und *]
php <? und ?>
asp <% und %>
mason <% und >
html <!-- und -->

Das obige Template sähe unter der Verwendung von TAG_STYLE => 'star' folgendermaßen aus:

[% SET var = 'data.name' %]
[* [% var %] *]

Natürlich ist das jetzt ein sehr einfaches Beispiel, aber man kann die Ersparnis und Übersichtlichkeit schon erahnen. Zu beachten ist bloß, wo man welche Tags verwendet: Im obigen Beispiel verwendet das template-erzeugende Skript die Standard-Tags ([% und %]), während das erzeugte Template den Tag-Style star ([* und *]) verwendet. Dies gibt man bei der Erzeugung des TT2-Objektes an:

  use Template;
  my $tt2 = Template->new({TAG_STYLE => 'star'}) or die "no TT2";
  $tt2->process(...);

Kommentar abgeben


Im ersten Beispiel-Template kann man statt [% tag_open _ ' ' _ var _ ' ' _ tag_close %] auch [% "$tag_open $var $tag_close" %] schreiben. Bei komplexeren Variablen muß man dann mit ${ ... } arbeiten.

Ich bevorzuge allerdings die Variante ohne Anführungszeichen (bzw. die anderen Alternativen).

Kommentar von Uwe am 07.02.2007 um 19:04 Uhr


Cool, genau das brauche ich nächste Woche und wollte das schon übelst kompliziert lösen *g*

Werd mit Catalyst rumspielen und ein Großteil davon sind Inhalte die sich ca. alle 14 Tage ändern ... wenn überhaupt ... also sollen diese einmal generiert und dann hinterlegt werden als statischer Inhalt. Ein Bereich der Page ist aber komplett Dynamisch wo man auch Inhalte einbinden kann über den ersten weg ... ach, ich bin schon wieder verwirrt *g* mal erzählen wenn es fertig geworden ist :)

Kommentar von Sadrak am 23.03.2007 um 15:12 Uhr


Freut mich, daß Dir der kleine "Trick" hilft.

Dann sollte ich wohl bis nächste Woche noch den geplanten 2. Teil fertigstellen (damit wird es noch ein bißchen einfacher - zumindest was die Template-Tags angeht).

:-)

Kommentar von Uwe am 23.03.2007 um 16:10 Uhr


Hallo Felix,

jetzt ist der 2. Teil doch etwas später fertig geworden. Aber vielleicht kommt er ja nocht "rechtzeitig".

Viel Erfolg bei Deinem Projekt.

Kommentar von Uwe am 30.03.2007 um 19:42 Uhr


Kommentar abgeben