Startseite
Startseite

Startseite / Vorlagenentwicklung / Variablen / Kontexte / Sonderfälle

Spezielle Variablen-Eigenschaften

Nachdem auf den vorangegangenen Seiten das Konzept der Variablen und Kontexte in FirstSpirit dargestellt wurde, werden im Folgenden Besonderheiten einiger Variablen und ihrer Definitionsstelle vorgestellt:

Variablen in Aufträgen, Projekteinstellungen und Menüebenen

 

Wie die Tabelle auf der vorherigen Seite zeigt, haben die Kontexte SITE-STORE und root Überschneidungspunkte.

In der Vorschau werden die Variablen dabei in folgender Reihenfolge ausgewertet:

  1. Strukturvariablen
  2. Variablen in Projekteinstellungen

Ist eine Variable in den Projekteinstellungen und in Menüebenen mit gleichem Namen definiert, ist sie sowohl im Kontext root (hier gilt der Wert, der über die Projekteinstellungen zugewiesen ist) als auch im Kontext SITE-STORE (hier gilt der Wert, der über die Menüebene zugewiesen ist) verfügbar. Ohne Anwendung von #global.context(...) (siehe Seite Projektbezogene Kontexte) wird in der Vorschau für die Variable der Wert, der über die Menüebene zugewiesen ist, ausgegeben, da standardmäßig die Variable im tiefsten Kontext berücksichtigt wird.

Bei Strukturvariablen ist darüber hinaus zu beachten, dass sie nur in der Vorschau von Seitenreferenzen (also Struktur-Verwaltung) angezeigt werden, nicht aber von Seiten (Inhalte-Verwaltung).

Auf einer generierten Seite können Strukturvariablen durch Auftragsvariablen überschrieben werden: Sind Auftragsvariablen gesetzt, werden sie auf der generierten Seite ausgelesen und überschreiben Variablen mit demselben Namen, die auf dem Wurzelknoten der Struktur-Verwaltung oder in den Projekteinstellungen definiert sind.

Wichtig Es werden nur Variablen, die auf Wurzelknoten-Ebene der Struktur-Verwaltung definiert sind, überschrieben. In folgenden Fällen werden Strukturvariablen nicht von Auftragsvariablen mit demselben Namen überschrieben:
- Strukturvariablen, die auf Menüebenen definiert werden, die unterhalb des Wurzelknotens liegen,
- Strukturvariablen, die auf Wurzelknoten-Ebene definiert, aber auf einer darunterliegenden Menüebene verändert wurden.

Siehe dazu auch Seite Strukturvariablen.

Dies kann z. B. dazu genutzt werden, einen Unterschied zwischen der Vorschau und der generierten Website (bzw. Teile davon, Auftrag "Teilprojekt generieren") oder zwischen verschiedenen Generierungsaufträgen zu erzielen.

Sollen Variablen aus den Projekteinstellungen bei der Generierung ausgewertet werden, dürfen weder Auftrags- noch Strukturvariablen gesetzt sein.

Contexts: SITE-STORE vs. root

Abb. 1: Struktur-Verwaltungs-Kontext versus Globaler Kontext (zum Vergrößern anklicken)

Beispiele für das Überschreiben von Variablen:
Ist in einer Menüebene, in den Projekteinstellungen und in einem Generierungsauftrag die Variable A mit jeweils unterschiedlichen Werten definiert, gilt in der Vorschau der Wert, der in der Struktur-Verwaltung, auf der generierten Seite der Wert, der im Auftrag definiert ist (allerdings nur für Werte, die auf der Wurzelknoten-Ebene der Struktur-Verwaltung definiert sind, Abb.1 : Fall 1 und 2).

Ist keine Auftragsvariable definiert, gilt auf der generierten Seite der Wert, der in der Struktur-Verwaltung definiert ist (Fall 3).

Nur wenn weder Auftrags- noch Strukturvariable definiert sind, wird der Wert der Variable aus den Projekteinstellungen verwendet (Fall 4).

Variablen in Formatvorlagen

Inhalte von Formatvorlagen oder Skripten können in anderen Vorlagentypen (z. B. Seiten- oder Absatzvorlagen) über die Anweisung $CMS_RENDER(...)$ in Kombination mit dem Parameter template bzw. script eingebunden werden, z. B.

$CMS_RENDER(template:"BEZEICHNER")$

Bei dem BEZEICHNER handelt es sich um das Kürzel der Formatvorlage bzw. des Skripts, welches eingebunden werden soll.

Setzen und Ausgeben von Variablen in Formatvorlagen
Aufgrund der Verfügbarkeit von Variablen in tieferen Kontexten, kann auch in Formatvorlagen z. B. auf Variablen, die in Seiten- oder Absatzvorlagen vorhanden sind, zugegriffen werden: Ist z. B. in einer Seitenvorlage die Variable gv_page definiert:

$CMS_SET(gv_page, "Variable im Seitenkontext")$                                                                                                             (Seitenvorlage)

kann auf diese in einer über den $CMS_RENDER(...)$-Aufruf in die Seitenvorlage eingebundenen Formatvorlage zugegriffen und so z. B. über

$CMS_VALUE(gv_page)$                                                                                                                                                           (Formatvorlage)

ausgegeben werden.

Wichtig Wie bereits zuvor dargestellt, ist hier natürlich wichtig, die Variable gv_page vor dem Aufruf $CMS_RENDER(...)$ zu definieren

Variablen, die in Formatvorlagen definiert sind, sind hingegen standardmäßig nicht im (höheren) Seitenkontext verfügbar. Das heißt, auf Variablen, die in Formatvorlagen definiert sind, kann in Seitenvorlagen nicht zugegriffen werden. Die Ausgabe kann daher nur über die Formatvorlage selbst, nicht aber über die Seitenvorlage erfolgen.

Wird z. B. in einer Formatvorlage die Variable gv_form definiert

$CMS_SET(gv_form, "Variable im Formatvorlagen-Kontext")$                                                                                         (Formatvorlage)

kann diese nur über die Formatvorlage ausgegeben werden, z. B.

$CMS_VALUE(gv_form)$                                                                                                                                                           (Formatvorlage)

Um eine in einer Formatvorlage definierte Variable auch im Seitenkontext verfügbar zu machen, kann der $CMS_RENDER(...)$-Aufruf um den Parameter context:"this" ergänzt werden.

Wichtig Hierbei ist allerdings zu beachten, dass auf diese Weise Variablen in einem anderem Kontext ungewollt überschrieben werden können.

Ist z. B. in einer Formatvorlage die Variable gv_form definiert:

$CMS_SET(gv_form, "Variable im Formatvorlagen-Kontext")$                                                                                         (Formatvorlage)

kann auf diese über folgenden $CMS_RENDER(...)$-Aufruf in der Seitenvorlage zugegriffen

$CMS_RENDER(template:"BEZEICHNER", context:"this")$                                                                                                  (Seitenvorlage)

und so z. B. über

$CMS_VALUE(gv_form)$                                                                                                                                                            (Seitenvorlage)

ausgegeben werden.

Das gleiche gilt natürlich auch für Absatzvorlagen und Skripte.

Variablen in Verweisen

 

Ein weiterer häufiger Anwendungsfall für geschachtelte Kontexte ist das Verwenden von Verweisvorlagen im DOM-Editor (CMS_INPUT_DOM).

Kontexte: DOM mit Verweis

Abb. 2: Kontexte in Verweisen

Standardmäßig erben Verweise in DOM-Editoren Variablen aus höheren Kontexten, d.h. Variablen, die beispielsweise zuvor in der Seite oder einem Absatz initialisiert wurden, in der / dem der DOM-Editor mit einer Verweisvorlage verwendet wird, können in der Verweisvorlage selbst verwendet werden. Abb. 2 zeigt schematisch die Gültigkeit von Variablen / Werten in Verweisvorlagen in einem DOM-Editor.

Dabei wird die Gültigkeit von Variablen, wenn sie im Formular oder im Ausgabekanal initialisiert werden, dargestellt:

  • pt_var_form: eine Variable, die im Formular einer Seitenvorlage initialisiert wurde
  • pt_var_out: eine Variable, die im Ausgabekanal einer Seitenvorlage initialisiert wurde (z. B. über $CMS_SET(...)$)
  • st_var_form: eine Variable, die im Formular einer Absatzvorlage, speziell in der Eingabekomponente CMS_INPUT_DOM initialisiert wurde
  • st_var_out: eine Variable, die im Ausgabekanal einer Absatzvorlage initialisiert wurde (z. B. über $CMS_SET(...)$)
  • link_var_form: eine Variable, die im Formular einer Verweisvorlage initialisiert wurde
  • link_var_out: eine Variable, die im Ausgabekanal einer Verweisvorlage initialisiert wurde

Wichtig Es ist nicht ratsam, in der Verweisvorlage den Inhalt des DOM-Editors der Seite oder des Absatzes auszugeben, die / der den Verweis enthält, da so eine Endlosschleife entstünde (in Abb. 2: st_var_form, angedeutet durch die gestrichelte Linie).
Allgemein gilt, dass es niemals sinnvoll ist, den äußeren Kontext in einem inneren auszugeben.
 

Somit stehen Werte, die der Redakteur in einen Verweis eingegeben wird (in Abb. 2: link_var_form) standardmäßig nur im Kontext des Verweises zur Verfügung. Mit #global.context("NAME") können diese Werte auch im nächst höheren Absatz- bzw. Seitenkontext verfügbar gemacht werden:

$CMS_SET(#global.context("section")["link_var_form"],link_var_form)$

bzw.

$CMS_SET(#global.context("PAGE")["link_var_form"],link_var_form)$

Variablen innerhalb eines Verweises können wie auch für andere FirstSpirit-Objekte durch Verwendung von $CMS_SET(...)$ überschrieben werden. Dies gilt sowohl für Variablen, die als Bezeichner für Eingabekomponenten auf dem Formular-Register der Verweisvorlage verwendet, als auch für Variablen, die z. B. per $CMS_SET(...)$ in einem Ausgabekanal der Verweisvorlage definiert werden. Ein Anwendungsbeispiel hierfür kann eine Auto-Vervollständigung oder Auto-Korrektur z. B. für E-Mail-Adressen sein (siehe dazu auch das Beispiel für E-Mail-Verweise). Dabei wird zunächst geprüft, ob seitens des Redakteurs in die Eingabekomponente lt_reference eine E-Mail-Adresse mit dem erforderlichen „mailto:“ eingegeben wurde. Fehlt das „mailto:“, wird es automatisch ergänzt, z. B.

$CMS_IF(!lt_reference.startsWith("mailto:"))$
$CMS_SET(lt_reference, "mailto:"+lt_reference)$
$CMS_END_IF$

Variablen in Globalen Inhalten

Abb. 3: Struktur von Globalen Inhalten

Inhalte einer Globalen Seite (und ggf. der in der Globalen Seite eingebundenen Absätze) wird in der gewünschten Vorlage mit $CMS_VALUE(#global.gca("BEZEICHNER"))$ ausgegeben werden. Dabei muss für den Platzhalter BEZEICHNER der Referenzname der auszugebenden Seite aus den Globalen Inhalten angegeben werden. An der Stelle des Aufrufs von $CMS_VALUE(#global.gca("BEZEICHNER"))$ wird der Inhalt der entsprechenden Vorlage eingefügt und der Kontext der Globalen Seite beginnt. Hier werden also Kontexte geschachtelt.

Abb. 2 zeigt vereinfacht die Struktur einer Seite mit Absatz in der Inhalte-Verwaltung („PS“) mit einer Seite und Absatz aus den Globalen Inhalten („GCA“). Auch hier kann man demnach von „äußeren“ Elementen (z. B. die Seite in der Inhalte-Verwaltung) und „inneren“ Elementen (z. B. der Absatz in den Globalen Inhalten) sprechen.

Abb. 4: Kontexte von Globalen Inhalten

Durch diese Schachtelung können sich Kontexte der Absätze überlappen oder überschreiben, da z. B. Absatz (PS) und Absatz (GCA) jeweils über einen Kontext mit dem Namen section verfügen. Seite (PS) und Seite (GCA) verfügen hingegen jeweils über einen eigenen Kontext. Über #global.context("section") wird in diesem Fall immer nur der Kontext des „innersten“ Absatzes und damit in der Regel der Absatz aus den Globalen Inhalten angesprochen.
Über #global.page.id und #global.page.name oder #global.page.uid bzw. #global.section.id und #global.section.name können jeweils die ID und der Referenzname der Seite bzw. des Absatzes aus der Inhalte-Verwaltung bzw. aus den Globalen Inhalten ausgegeben werden.

Variablen, die in den Seiten- und Absatzvorlagen definiert werden, auf denen die Seiten (PS) und (GCA) bzw. Absätze (PS) und (GCA) basieren, gelten standardmäßig für die aktuelle Seite bzw. den aktuellen Absatz sowie für alle inneren Elemente. Soll eine Variable auch in den äußeren Elementen verfügbar gemacht werden, kann dazu #global.context("PAGE") verwendet werden.

Werden in den Seiten- und Absatzvorlagen Variablen mit demselben Bezeichner definiert, gilt immer die Variable des aktuellen Elements. Das heißt, in jeder Vorlage kann auf die in dieser Vorlage definierten Variablen mit den bekannten Anweisungen (siehe auch Seite Variablen in Vorlagen) zugegriffen werden.

Um sicherzustellen, dass über jede der Vorlagen für die Seite und Absätze aus der Inhalte-Verwaltung sowie aus den Globalen Inhalten auf die Variablen des aktuellen Elements und der anderen Elemente zugegriffen werden kann, sollten eindeutige Variablenbezeichner in den Vorlagen gewählt werden.

Variablen in geschachtelten Eingabekomponenten

Kontexte in geschachtelten Eingabekomponenten

Abb. 5: Geschachtelte Eingabekomponenten (zum Vergrößern anklicken)

Über die Eingabekomponente FS_LIST, Typ INLINE mit source="SECTIONTEMPLATES" können Listen von Absätzen, die auf unterschiedlichen Absatzvorlagen basieren, erstellt werden.

Je nach Konfiguration können dabei Absätze (mehrfach) ineinander geschachtelt werden (Abb. 4). Absatz A, der unterhalb der Seite eingehängt ist, kann dabei als „äußerer“ Absatz bezeichnet werden. Die Absätze B bis E, die mithilfe von FS_LIST erstellt werden, können als „innere“ Absätze bezeichnet werden.

Nested contexts

Abb. 6: Kontexte von geschachtelten Eingabekomponenten

Der Inhalt von FS_LIST wird in der gewünschten Vorlage mit $CMS_VALUE(BEZEICHNER)$ ausgegeben. Dabei muss für den Platzhalter BEZEICHNER der Variablenbezeichner von FS_LIST angegeben werden. Im Beispiel der Abb. 4 enthalten z. B. die Absätze A und B jeweils eine FS_LIST-Komponente, deren Inhalt jeweils in Absatz A bzw. B ausgegeben wird. An der Stelle des Aufrufs von $CMS_VALUE(BEZEICHNER)$ beginnt der Kontext des „nächsten“, inneren Absatzes (siehe auch Abb. 5).

Durch diese Schachtelung können sich Kontexte der Absätze überlappen oder überschreiben.

Im Beispiel von FS_LIST verfügen der äußere und die inneren Absätze z. B. über einen gemeinsamen Kontext mit dem technischen Bezeichner section. Dabei kann in jedem Absatz, unabhängig davon, ob es der äußere oder ein innerer ist, standardmäßig per Angabe des Variablenbezeichners auf alle Variablen zugegriffen werden, die in der zugehörigen Absatzvorlage, oder in einem höheren Kontext definiert sind. Ist eine Variable mit demselben Bezeichner in mehreren Kontexten vorhanden (eine Variable mit demselben Bezeichner wird z. B. in einem inneren und dem äußeren oder in der Seite definiert), wird immer auf die Variable des aktuellen Absatzes zugegriffen.

Soll eine Variable auch in äußeren Absätzen verfügbar gemacht werden, kann dazu

$CMS_SET(#global.context.parentContext.parentContext["WERT"], BEZEICHNER)$ 

(siehe dazu auch #global.context("NAME")) verwendet werden.

Um sicherzustellen, dass über jede der Absatzvorlagen für den äußeren und die inneren Absätze sowohl auf die Variablen des aktuellen und der anderen Absätze zugegriffen werden kann, sollten eindeutige Variablenbezeichner in diesen Absatzvorlagen gewählt werden.

Um Endlosschleifen zu vermeiden, sollte in keinem Absatz ein Absatz mit derselben Absatzvorlage angelegt werden können. Mithilfe der Tags TEMPLATES / TEMPLATE kann die Menge der auswählbaren Absatzvorlagen eingeschränkt werden.

Wichtig Wichtiger Hinweis zur Schachtelung von FS_LIST-Eingabekomponenten
Werden mithilfe von FS_LIST zu viele Schachtelungen vorgenommen, kann dies nicht nur zu Problemen hinsichtlich der Bedienbarkeit (Usability) für Redakteure und der Wartbarkeit in der Entwicklung führen, sondern auch zu Performance-Beeinträchtigungen. Erfahrungen haben gezeigt, dass nach Möglichkeit Schachtelungen über 3 Ebenen hinaus vermieden werden sollten!

Speziell wird davon abgeraten, bei Verwendung von FS_LIST, Typ INLINE / SECTIONTEMPLATES, sprachabhängige Eingabekomponenten miteinander zu verschachteln (also sprachabhängige FS_LIST-Eingabekomponente mit sprachabhängigen Eingabekomponenten, siehe dazu auch Parameter useLanguages). Insbesondere in Kombination mit Regeln kann dies zu nicht-speicherbaren Konfigurationen führen!

© 2005 - 2015 e-Spirit AG | Alle Rechte vorbehalten. | Letzte Änderung: 2013-12-09