Bedingungen mit Compare Plugin kombinieren
09.05.2005
In Vergleiche für bedingte Generierungen habe ich gezeigt, wie das Compare Plugin genutzt werden kann, um Varianten eines Seitentyps zu erstellen. Das Plugin ermöglichet es, Werte zu vergleichen und optional das eine oder andere Codesegment in den Ausgabestrom einzufügen. Aber eine einfache Bedingung der Form "vergleiche einen Wert mit einem anderen Wert" ist erst der Anfang. Wir sind auch in der Lage, komplexe Bedingungen zu erstellen. Und es ist nicht einmal so schwierig.
Grundlagen
Das Compage Plugin bietet eine Reihe von Tags an - wie zum Beispiel MTIfEqual, MTIfNotEqual, MTIfGreater, MTIfGreaterOrEqual, MTIfLess, etc. Die meisten dieser Tags arbeiten auf identische Art und Weise: sie akzeptieren mindestens zwei Pflichtattribute, a und b. Das Plugin vergleicht die Werte der beiden Attribute und nur genau dann, wenn der Vergleich korrekt ist, werden die eingeschlossenen Zeilen in die generierte Datei übernommen.
Fangen wir am besten einmal mit zwei einfachen Beispielen an.
<MTIfEqual a="1" b="2">
<p>Das wird nie gezeigt werden.</p>
</MTIfEqual>
Die obigen Zeilen zeigen einen Vergleich, bei welchem die beiden Konstanten "1" and "2" verglichen werden. Natürlich sind sie nicht identisch. Also wird der innere Teil des Tags niemals ausgewertet werden.
<MTIfEqual a="1" b="1">
<p>Das wird immer zu sehen sein.</p>
</MTIfEqual>
Die obigen Zeilen zeigen einen Vergleich, bei welchem die beiden Konstanten "1" and "1" verglichen werden. Natürlich sind sie immer identisch. Also wird der innere Teil des Tags immer ausgewertet werden.
Es ist nicht sinnvoll, zwei konstante Werte auf diese Weise zu vergleichen. Ich wollte damit nur die grundlegende Struktur zur Verwendung dieser Tags deutlich machen. In FAQ: Kategorie auf der Startseite verstecken habe ich einen Weg beschrieben, um selektiv einzelne Kategorien in einer Indexvorlage auszugeben. Nehmen wir doch einfach dieses Szenario für die folgenden Beispiele.
Wir können eine Liste aller Kategorienamen wie folgt erzeugen.
<ul>
<MTCategories>
<li><MTCategoryLabel></li>
</MTCategories>
</ul>
Wenn wir die Kategorie "Hardware" aus dieser Liste entfernen wollten, können wir dies wie folgt erreichen.
<ul>
<MTCategories>
<MTIfNotEqual a="[MTCategoryLabel]" b="Hardware">
<li><MTCategoryLabel></li>
</MTIfNotEqual>
</MTCategories>
</ul>
Wir sehen, dass die beiden Werte für das Compare nicht unbedingt Konstanten sein müssen. Diese können auch Tags sein. Jedoch ist die Syntax zur Notation dieser Tags etwas anders: wir müssen alle spitzen Klammern durch eckige Klammern und alle doppelten Hochkommata durch einfach Hochkommata ersetzen.
Bedingung UND Bedingung
Nehmen wir einmal an, dass wir eine Liste der Kategorien erstellen wollen. Aber es sollen die beiden Kategorien "Hardware" und "Software" ausgeschlossen werden. Das ist recht einfach umzusetzen.
<ul>
<MTCategories>
<MTIfNotEqual a="[MTCategoryLabel]" b="Hardware">
<MTIfNotEqual a="[MTCategoryLabel]" b="Software">
<li><MTCategoryLabel></li>
</MTIfNotEqual>
</MTIfNotEqual>
</MTCategories>
</ul>
Wir verschachteln die beiden Vergleiche. Der Kontrollfluss wird den ersten Vergleich nur genau dann passieren, wenn die aktuelle Kategorie nicht "Hardware" ist. Anschließend sorgt der zweite Vergleich dafür, dass die aktuelle Kategorie nicht "Software" ist. Als Konsequenz wird das li-Tag nur genau dann ausgegeben, wenn die Kategorie weder "Hardware" noch "Software" ist.
Weitere Vergleiche hinzuzufügen, ist recht einfach. Wir müssen lediglich alle weiteren Vergleiche in die bestehende Struktur einbauen..
Bedingung ODER Bedingung
Im vorangegangenen Beispiel habe ich gezeigt, wie man eine UND-Bedingung codieren kann. Die ODER-Bedingung ist etwas schwieriger. Wie können wir erreichen, das etwas generiert wird, wenn die eine oder die andere Bedingung wahr ist?
Zu diesem Zweck müssen wir eine eigene Variable verwenden. Wie Sie sicherlich wissen, erlaubt das Movable Type die Verwendung von Variablen. Man kann einer Variablen einen Wert zuweisen und diesen später wieder auslesen. Hierfür verwendet man die beiden Tags MTSetVar und MTGetVar.
<MTSetVar name="mgs_var" value="mgs for president">
<MTSetVar name="mgs_var" value="better not">
<MTGetVar name="mgs_var">
Die obigen Zeilen weisen einer Variable zweimal einen Wert zu und lesen diesen später wieder aus. Die zweite Zuweisung überschreibt den Wert, der sich bereits in der Variable befunden hat.
Wenn wir "tue etwas, wenn die Kategorie Hardware oder Software ist" umsetzen wollen, können wir die folgenden Zeilen verwenden.
<ul>
<MTCategories>
<MTSetVar name="mgs_condition" value="0">
<MTIfEqual a="[MTCategoryLabel]" b="Hardware">
<MTSetVar name="mgs_condition" value="1">
</MTIfEqual>
<MTIfEqual a="[MTCategoryLabel]" b="Software">
<MTSetVar name="mgs_condition" value="1">
</MTIfEqual>
<MTIfEqual a="[MTGetVar name='mgs_condition']" b="1">
<li><MTCategoryLabel></li>
</MTIfEqual>
</MTCategories>
</ul>
Wir verwenden die Variable "mgs_condition", um das Ergebnis zu errechnen. Anfänglich wird diese Variable auf "0" gesetzt. Wenn dann der Name der Kategorie "Hardware" ist, wird die Variable auf "1" gesetzt. Anschließend wird die Variable, wenn der Name der Kategorie "Software" ist, auf "1" gesetzt. Nach diesen Zeilen hat die Variable genau dann den Wert "1", wenn die Kategorie entweder "Hardware" oder "Software" ist.
Der abschließende Vergleich sieht auf den ersten Blick etwas merkwürdig aus.
<MTIfEqual a="[MTGetVar name='mgs_condition']" b="1">
Die linke Seite des Vergleichs ist ein Movable Type Tag. Es handelt sich um das MTGetVar Tag, welches wir benutzen, um den Wert der Variablen zu ermitteln. Wir müssen lediglich die Regel beachten, dass spitze Klammern durch eckige Klammern und doppelte Hochkommata durch einfache Hochkommata ersetzt werden müssen.
Wenn wir dies beachten, machen die obigen Zeilen auch Sinn. Sie bedeuten: "extrahiere den Wert der Variablen mgs_condition und wenn dieser Wert 1 ist, dann mach folgendes".
Kombinierte Bedingungen
Wenn wir die Bedingung komplexer gestalten, wird dies die Codierung nicht wirklich verkomplizieren. Sie wird nur länger werden. Wir müssen die Bedingung in mehrere Teile spalten, jeden unabhängig berechnen, die Zwischenresultate in Variablen ablegen, und letztendlich alle Variablen zusammenführen.
mgs | 09.05.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.

