Ein Tag in einem Tag
18.04.2005
Im Movable Type verwenden wir Tags, um den Kontrollfluss in einem Template zu definieren und um auf die Datenbank zugreifen zu können. Das Verhalten eines Tags kann mit Hilfe von Attributen verändert werden. Diese Attribute legen Werte für Eingabeparameter fest.
Leider dürfen die Werte für ein Attribut nur Konstanten sein. Manchmal wäre es aber sinnvoll, wenn diese zum Beispiel auch durch das Ergebnis eines anderen Tags gebildet werden könnten. Movable Type unterstützt dies jedoch nicht. Aber ein Plugin kann uns helfen.
Ein Beispiel
Angenommen Sie benutzen ein Vorlagen-Modul und Sie wollen diese Vorlage an unterschiedliche Stellen einbetten. Zum Beispiel wollen Sie die Vorlage aus einem individuellen Archiv und aus dem Hauptindex heraus benutzen. Innerhalb der Vorlage wollen Sie dann an Hand der EntryID erkennen, wo Sie sich befinden, um anschließend spezifische Dinge zu erledigen.
- Wenn ich auf der Seite "Kontakt" bin, dann tue folgendes...
- Wenn ich auf der Seite "Sitemap" bin, dann tue folgendes...
Man könnte meinen, diesen Vergleich mit Hilfe des Compare Plugin (zur Einführung lesen Sie bitte Vergleiche für bedingte Generierungen) umsetzen zu können.
<MTIfEqual a="[MTEntryID]" b="123">
...
</MTIfEqual>
Natürlich müssen Sie die Konstante "123" durch die spezifische ID ersetzen, gegen welche Sie prüfen wollen. Dieser Vergleich wird dann vernünftig funktionieren, wenn das individuelle Archiv für einen Eintrag erstellt wird. Wenn aber der Prozess aus dem Kontext des Hauptindex heraus auf diese Zeilen stößt, ist keine ID definiert und er wird mit einer Fehlermeldung beendet werden.
Die Lösung scheint doch ganz trivial zu sein: definieren wir einfach eine eigene Variable. Sorgen wir dafür, dass diese Variable auch im Kontext der Haupt-Index Vorlage definiert ist, und vergleichen wir dann gegen diese eigene Variable.
<MTIfNonEmpty tag="MTEntryID">
<MTSetVar name="mgs_id" value="<MTEntryID>">
<MTElse>
<MTSetVar name="mgs_id" value="">
</MTElse>
</MTIfNonEmpty>
Die Vorgehensweise wird aber leider auch scheitern. Sie zeigt eine Beschränkung des Movable Type: dieses wertet nämlich die rechte Seite der Zuweisung nicht wie gewünscht aus. Diese muss unbedingt eine Konstante sein. Ein anderes Tag ist in dieser Situation verboten.
Jetzt wird es Zeit, dass ein Plugin die Arbeit übernimmt..
Das MTTagInvoke Plugin
Das so genannte MTTagInvoke Plugin ist in der Lage, eine Situation wie im obigen Beispiel zu meistern.
Die Installation des Plugin ist sehr einfach. Nachdem Sie das Plugin von der genannten Adresse heruntergeladen haben, müssen Sie lediglich die Datei »mttaginvoke.pl« in das »plugins« Verzeichnis unterhalb der Movable Type Installation kopieren.
Dieser einfache Kopiervorgang ist ausreichend, um das Plugin dem Movable Type gegenüber bekannt zu machen.
Sie können das MTTagInvoke auf verschiedene Weisen benutzen. Hier möchte ich mich darauf konzentrieren, das obige Problem zu lösen. Der Code, um einer eigenen Variablen die ID eines Eintrags zuzuweisen, ist wie folgt.
<MTTagInvoke tag_name="MTSetVar">
<MTTagAttribute name="name">mgs_id</MTTagAttribute>
<MTTagAttribute name="value"><$MTEntryID$></MTTagAttribute>
</MTTagInvoke>
Auf den ersten Blick sieht der Code etwas merkwürdig aus. Lassen Sie mich erklären:
- Zunächst rufen wir das MTTagInvoke Tag auf.
- Dem MTTagInvoke wird eine Reihe von Parametern übergeben.
- Der wichtigste Parameter wird mit dem »tag_name« Attribut übergeben. Hiermit legen wir dasjenige Tag fest, welches vom MTTagInvoke aufgerufen werden soll. In unserem Fall ist es das »MTSetVar« Tag.
- Natürlich müssen auch die Parameter für das »MTSetVar« Tag spezifiziert werden. Dies sind der Name und der Wert der Variable, welche gesetzt werden soll. Beide werden mit Hilfe des »MTTagAttribute« Tag festgelegt. Der entscheidende Punkt ist die Tatsache, dass die rechte Seite der Zuweisung als Inhalt des »MTTagAttribute« Tag festgelegt wird. Und da sind auch andere Tags erlaubt.
Das »MTTagInvoke« Tag bietet auch andere Wege, um die Attribute für das indirekt aufgerufene Tag zu übergeben. Das obige Beispiel hätte auch wie folgt notiert werden können.
<MTTagInvoke tag_name="MTSetVar" name="mgs_id">
<MTTagAttribute name="value"><$MTEntryID$></MTTagAttribute>
</MTTagInvoke>
Ich bevorzuge die zuerst vorgestellte Art. Zumindest für mich ist deren Struktur klarer.
Lösung des Problems
Nachdem wir nun das »MTTagInvoke Plugin« verstanden haben, ist die Lösung für unser Problem recht einfach.
<MTIfNonEmpty tag="MTEntryID">
<MTTagInvoke tag_name="MTSetVar">
<MTTagAttribute name="name">mgs_id</MTTagAttribute>
<MTTagAttribute name="value"><$MTEntryID$></MTTagAttribute>
</MTTagInvoke>
<MTElse>
<MTSetVar name="mgs_id" value="">
</MTElse>
</MTIfNonEmpty>
...
<MTIfEqual a="[MTGetVar name='mgs_id']" b="123">
...
</MTIfEqual>
Die ersten paar Zeilen garantieren, dass die Variable »mgs_id« existiert. Wenn wir uns im Kontext eines Eintrags befinden, wird die ID des Eintrags meiner Variable zugewiesen. Wenn wir uns in einem anderen Kontext befinden (zum Beispiel auf der Haupt-Index Seite), wird der Variablen ein leerer String zugewiesen.
Die Zeilen ganz unten prüfen, ob die ID des Eintrags mit einer spezifischen ID identisch ist. Wenn dem so ist, wird etwas HTML ausgegeben. Wenn sie nicht gleich sind, wird der Abschnitt übersprungen.
Durch das Kopieren der ID eines Eintrags in eine eigene Variable (bzw. dem Initialisieren dieser Variablen mit einem leeren String) werden die Vergleiche innerhalb der Vorlage viel einfacher. Wir müssen nicht dauernd die Möglichkeit behandeln, dass die Variable eventuell nicht definiert ist. Wir können uns darauf verlassen, dass die eigene Variable immer definiert ist.
mgs | 18.04.2005
Feedback erwünscht!
Wie fanden Sie den Eintrag? Interessant? Langweilig? Ich freue mich über Ihren Kommentar. Wenn Ihnen der Eintrag geholfen hat, setzen Sie doch einen Link auf http://www.movable-type-weblog.de/.
Bitte keinen Spam
Um das Weblog vor Spam zu schützen, wird das MT-Approval Plugin eingesetzt. Sie müssen einen neuen Kommentar zunächst in der Vorschau ansehen, bevor dieser auf dem Server gespeichert werden kann. Ferner wird ein Kommentar erst gesichtet, bevor er freigegeben wird. Näheres finden Sie in meinem Artikel Weblog Spamming Grundlagen, wo einige Schutzmaßnahmen skizziert werden.
Wenn Sie sich an TypeKey angemeldet haben, wird Ihr Kommentar automatisch freigegeben.
Neuen Kommentar schreiben
TypeKey wurde an dieser Stelle vorübergehend deaktiviert. Erstellen Sie Ihren Kommentar bitte ohne TypeKey oder melden Sie sich im Vorschau-Dialog an.

