CMS-Inhalte mit Liquid-Templates ausliefern

Die hier beschriebenen Features sind bis Version 6.9.1 ein optionaler Bestandteil des Rails Connectors. Wenn Sie diese Features mit einem aktuellen Rails Connector weiter nutzen möchten, finden Sie den betreffenden Quelltext in einem Git-Repository.

Was ist Liquid?

Liquid ist eine in Ruby implementierte Template-Sprache mit Fokus auf Sicherheit und Robustheit. Liquid-Templates sind einfacher zu entwickeln als ERB-Templates. Daher können Templates mit Liquid häufig schneller und mit geringerer Fehlergefahr umgesetzt werden. Um fehlende kundenspezifische Felder und nil-Werte braucht man sich als Template-Autor nicht zu kümmern. Liquid stellt hier (im Gegensatz zu ERB) graceful degradation sicher.

Grundlegende Informationen über die Verwendung von Liquid stehen beispielsweise auf http://wiki.shopify.com/UsingLiquid zur Verfügung.

Der Rails Connector erweitert die Grundsyntax von Liquid um spezielle Sprachkonstrukte, mit denen CMS-Inhalte angezeigt werden können. Diese werden im Folgenden beschrieben.

Inhalte ausgeben und Sub-Templates einbinden

Dieses Liquid-Template gibt den Titel und Hauptinhalt der aktuellen Seite (repräsentiert durch obj) aus und ruft dann ein weiteres Template auf:

<h1>{{ obj.title }}</h1>
{{ obj.body }}
{% template 'toclist' %}

Das CMS-Objekt obj ist in einem Drop gekapselt, das die Zugriffe auf die Methoden und Felder des Objekts regelt. Der Drop wandelt Text automatisch in dessen HTML-Darstellung um, löst Links auf und fügt Bearbeitungselemente ein.

Das folgende Template gibt eine Liste der Unterordner und -Dokumente ( toclist) aus, falls das betreffende CMS-Objekt ein Ordner ist. Jedes Element erscheint mit einem Vorschaubild und dem verlinkten Titel.

<ul>
{% for object in obj.toclist %}    
  <li>{{ object.thumbnail | image_tag }}
  {{ object.title | link_to: object }}</li>
{% endfor %}
</ul>

Die Vorschaubilder werden in diesem Beispiel über das einelementige Linklistenfeld thumbnail eingebunden, aus der der Filter image_tag ein im Browser darstellbares Bild erzeugt. Mit Hilfe des link_to-Filters wird ein HTML-Link erzeugt, über den man im Browser zum Zielobjekt gelangen kann.

Linklisten mit mehreren Elementen können in Liquid ebenfalls verwendet werden:

<ul>
{% for link in obj.related_links %}
  <li>{{ link | link_to }}</li>
{% endfor %}
</ul>

Enthält ein Link einen ausgefüllten Titel, verwendet der Filter link_to diesen als Linktext. Andernfalls setzt er bei internen Links den Titel der referenzierten Datei ein und bei externen Links die URL.

Auf einzelne Links aus einer Linkliste kann auch über den Index des Links zugegriffen werden:

{{ "Ein Ersatz-Linktext" | link_to: obj.related_links[2] }}

Der Standard-Linktext wird in diesem Beispiel durch einen benutzerdefinierten Text ersetzt.

Bearbeitungselemente automatisch erzeugen

Wird die Rails-Applikation als Vorschauansicht in das GUI des CMS eingebunden, so gibt es die Möglichkeit, Bearbeitungselemente für die dargestellten CMS-Inhalte zu integrieren. Bei der Verwendung von Liquid-Templates können die Bearbeitungselemente entweder automatisch oder manuell gesetzt werden.

Voreingestellt werden die Bearbeitungselemente automatisch gesetzt. Gibt man beispielsweise den Titel eines CMS-Objekts aus, so erscheint in der Vorschau automatisch ein Bearbeitungselement:

{{ obj.title }}

Um im Einzelfall kein Bearbeitungselement auszugeben, kann der Filter editmarker verwendet werden:

{{ obj.title | editmarker: false }}

Bearbeitungselemente manuell ausgeben

Um die automatische Ausgabe von Bearbeitungselementen für alle Liquid-Templates einer Rails-Anwendung global zu deaktivieren, wird folgende Zeile in die Konfiguration aufgenommen:

RailsConnector::Configuration.auto_liquid_editmarkers = false

Die folgende Liquid-Anweisung führt dann nicht mehr dazu, dass ein Bearbeitungselement erzeugt wird:

{{ obj.title }}

Der Autor eines Templates kann jedoch manuell mit folgender Syntax Bearbeitungselemente erzeugen:

{{ obj.title | editmarker }}

URLs für Inhalte generieren

Mit dem Filter url kann man sich die URL geben lassen, unter der ein CMS-Objekt erreichbar ist:

external:{{ object | url }}

Dies ist beispielsweise dann nützlich, wenn ein CMS-Objekt als Flash-Content oder als Java Applet in eine HTML-Seite eingebunden werden soll.

Felder von Objekten auf Werte prüfen

{% if obj.mein_feld != blank %}
  Mein Feld enthält den Wert {{ obj.mein_feld }}.
{% else %}
  Mein Feld enthält keinen Wert.
{% endif %}

Im obigen Code wird der else-Zweig in den folgenden Fällen ausgewertet:

  • obj.mein_feld enthält einen leeren String
  • obj.mein_feld == nil
  • obj hat gar kein Feld mein_feld

Daher ist der Test obj.mein_feld != blank der beste Weg, um vor leeren Feldwerten zu schützen. Mit einer ähnlichen Syntax lässt sich explizit testen, ob ein String leer oder der Feldwert nil ist:

{% if obj.mein_feld == empty %}
  Mein Feld enthält einen leeren String.
{% endif %}
{% if !obj.mein_feld %}
  Mein Feld ist nicht vorhanden (== nil).
{% endif %}

Zeit oder Datum formatiert ausgeben

Zeit- und Datumswerte können mit Hilfe des date-Filters ausgegeben werden:

{{ obj.ip_eventStart | date: "%d.%m.%Y" }}

Der folgende Template-Code holt das CMS-Objekt, das durch den benannten Link my_name referenziert wird und gibt dessen Titel aus:

{{ named_object["my_name"].title }}

Benannte Links können im CMS als Links in der Linkliste relatedLinks einer CMS-Datei mit der Vorlage NamedLink gespeichert werden. Das Ziel eines Links in der Linkliste kann im Rails Connector über den Linktitel referenziert werden.

Action-Marker einbinden

In der integrierten Vorschau können Menübefehle und registrierte Assistenten per Action-Marker verfügbar gemacht werden. Der Template-Code, mit dem sich beispielsweise ein Bildbearbeitungsassistent einbinden lässt, könnte so aussehen:

{% actionmarker obj.some_image editImageWizard %}
  [Bild bearbeiten]
{% endactionmarker %}