C92EDDFB75FB4AF99F287CAAC09F331A
  • Thomas Pollinger
  • 22.05.2019
  • DE

Einführung in das Template Rendering

 

Allgemein

Was ist eigentlich ein RenderTags, ObjectLoader (Provider) oder RenderSpot? Diese Frage haben sich sicherlich viele gestellt, als man sich ab Version 7.0 und nachfolgenden Versionen mit dem s.g. Navigation Manager beschäftigen musste. Es gibt gerade bei dieser Art von Template Rendering, einen maßgeblichen Unterschied zwischen:

den man verstanden haben sollte. Ich muss zugeben, wenn man nicht direkt ein Software-Entwickler ist, versteht man den Unterschied und das Zusammenspiel nicht wirklich.

Jedoch wenn man das einmal im richtigen Kontext und Blickwinkel verstanden hat. Dazu noch die Unterschiede, Eigenarten und Arbeitsweisen kennt. Obendrauf noch das Zusammenspiel mit ASP.NET (C#) kennt - eröffent sich eine ganze andere Welt der Möglichkeiten. Diese übertrifft sogar viele Erwartungen und daher möchte ich meine Erfahrungen in einer neuen, sehr groß angelegten, Artikelserie für alle niederschreiben.
 

Vorab

Der primäre Verwendungszweck dieses Template Renderings ist das Rendern von Navigationen. Beim Rendern des Eintrags einer Navigation fragt man mit RenderTags oder eines ObjectLoader Informationen über die Navigationsstruktur ab und steuern so die Ausgabe der Navigation.

Hier drei Beispiel, damit man den Unterschied erkennen kann:
 

RenderSpot

<reddot:cms>
   ...
</reddot:cms>

 

RenderTag

<navigation:nextlevel>
<output type="object" object="String:Hello World" />

 

ObjectLoader (Provider)

<%!! Context:CurrentPage.Headline !!%>

Wenn man dies einmal verinnerlicht hat, ist das lesen, schreiben und verwenden aller drei Komponenten in Kombination einfach.

 

Hinweise

Wenn Seiten gerendert werden, ersetzt der Pagebuilder zunächst alle Platzhalter <%element%> in den Templates durch die entsprechenden Werte und führt dann das Template Rendering aus. Die Platzhalter sind für das Template Rendering transparent, d. h., lediglich die Werte der Platzhalter sind für die RenderTags oder ObjectLoader während des Template Rendering sichtbar.

Der Einsatz des Template Renderings ist nicht auf das Rendern von Navigationen begrenzt. Wenn man das Template Rendering in Content-Klassen verwendet, die nicht als Navigations-Templates verwendet werden, steht einem alles - außer der RenderTag navigation, der ObjectLoader Navigation:, die Index-Objekte und der Navigation Manager - zur Verfügung. Damit kann man beispielsweise Informationen über den Renderprozess der Seite abfragen oder auch das HTML eines Elements rendern.

 

RenderSpot

Ein RenderSpot ist für den Pagebuilder der Bereich, welcher kennzeichnet das hier ein Rendering stattfinden soll. In der Regel wird für komplexe Template Renderings, wie beispielsweise eine bedingte Anweisungen, die ausführliche Schreibweise verwendet. Dabei markiert der RenderSpot den Anfang und das Ende des Bereiches, in dem weitere RenderTags stehen:

<reddot:cms>
  <if>
    <query ...>
      <htmltext>...</htmltext>
    </query>
  </if>
</reddot:cms>

RenderSpots dürfen nicht ineinander verschachtelt werden und müssen eindeutig voneinander definiert und abgrenzt sein. Innerhalb dieser RenderSpots können auch Kommentare wie folgt eingebaut werden:

<reddot:cms>
   <!-- Kommentar innerhalb eines RenderSpot -->
</reddot:cms>

Notiz: In einigen Tag-Strukturen kann die Verwendung von Kommentaren dazu führen, dass das Template Rendering nicht ausgeführt wird. Daher sollte man die Kommentare nur direkt unterhalb des RenderSpot verwenden.

Die RenderSpots werden im Management Server in den main.config definiert. Der Abschnitt sieht wie folgt aus:

<Rendering>
    <Preparse>
...
    </Preparse>
    <Spots>
        <Spot name="XmlSpot" typename="XmlSpot" namespace="Reddot.CMS.Rendering.Spots" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll">
            <BeginTag>
                <![CDATA[<reddot:cms>]]>
            </BeginTag>
            <EndTag>
                <![CDATA[</reddot:cms>]]>
            </EndTag>
        </Spot>
        <Spot name="AsyncXmlSpot" typename="XmlSpot" namespace="Reddot.CMS.Rendering.Spots" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" asynchronous="true">
            <BeginTag>
                <![CDATA[<reddot:asynccms>]]>
            </BeginTag>
            <EndTag>
                <![CDATA[</reddot:asynccms>]]>
            </EndTag>
        </Spot>
        <Spot name="DirectSpot" typename="DirectSpot" namespace="Reddot.CMS.Rendering.Spots" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll">
            <BeginTag>
                <![CDATA[<%!!]]>
            </BeginTag>
            <EndTag>
                <![CDATA[!!%>]]>
            </EndTag>
        </Spot>
    </Spots>
    <ObjectLoader>
...
    </ObjectLoader>
    <RenderTags>
...
    </RenderTags>
</Rendering>

Es gibt drei Typen von RenderSpots:

welche sich wie folgt in der Schreibweise unterscheiden:
 

XmlSpot

<reddot:cms>
  ...
</reddot:cms>

 

AsyncXmlSpot (deprecated / non functional)

<reddot:asynccms>
  ...
</reddot:asynccms>

 

DirectSpot

<%!! ... !!%>

Alle drei Varianten besitzen einen eindeutigen Begin- und End-Tag. Jedoch ist zu beachten, dass der RenderSpot AsyncXmlSpot nicht funktionsfähig ist und auch als abgekündigt markiert ist.

 

RenderTag

Kommen wir nun zu den eigentlichen RenderTags, welche ebenfalls in der main.config definiert werden. Im selben Abschnitt, nur etwas weiter unten:

<Rendering>
    <Preparse>
...
    </Preparse>
    <Spots>
...
    </Spots>
    <ObjectLoader>
...
    </ObjectLoader>
    <RenderTags>
        <Tag name="output" typename="OutputTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="store" typename="StoreTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="fileread" typename="FileReadTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="if" typename="IfTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="process" typename="ProcessTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="foreach" typename="ForEachTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="navigation" typename="NavigationTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="pagesMostCommented" typename="PagesMostCommentedTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Tag name="currentPageCommentCount" typename="CurrentPageCommentCountTag" namespace="Reddot.CMS.Rendering.Tags" filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
    </RenderTags>
</Rendering>

Hier sieht man nun sehr genau, dass die RenderTags klar definiert sind:

  • output
  • store
  • navigation
  • if
  • foreach
     
  • pagesMostCommented (TempoSocial / limited maintenance)
  • currentPageCommentCount (für TempoSocial/ limited maintenance)
     
  • fileread (deprecated / non functional / don't use it)
  • process (deprecated / non functional / don't use it)

Und auch nur diese Tags werden als RenderTags bezeichnet. Diese werden wir uns in einem späteren Artikel jeweils genauer ansehen.

 

ObjectLoader (Provider)

Die Funktionalitäten des Template Renderings werden mit Hilfe von ObjectLoadern (Providern) bereitgestellt. Es gibt ObjectLoader (Provider) für den Zugriff auf Eigenschaften und Methoden und ObjectLoader für die Typisierung.

Auch ObjectLoader sind Objekte und haben daher eigene Eigenschaften und Methoden. Die Eigenschaften und Methoden eines ObjectLoaders fragt man, anders als die anderer Objekte, mit einem Doppelpunkt ab.

ObjectLoader können für die Typisierung von Werten verwendet werden. Dabei konvertiert der ObjectLoader die Zeichen nach dem ObjectLoader in den entsprechenden Typ.

Über die folgenden ObjectLoader (Provider) greift man auf folgende Eigenschaften und Methoden zu:

  • Array
    Über den ObjectLoader Array erhält man Zugriff auf die Objekte innerhalb eines Arrays, welchen man zuvor erzeugt hat.
  • Context / RDObj
    Über den ObjectLoader Context (Alias: RDObj) erhält man Zugriff auf die Objekte im Management Server.
  • Debug (deprecated / non functional / don't use it)
    Funktion und Arbeitsweise aktuell nicht näher erläutert oder bekannt.
  • Escape / RDEscape
    Über den ObjectLoader Escape (Alias: RDEscape) kann man vordefinierte Werte abfragen und Sonderzeichen codieren.
  • Navigation
    Über den ObjectLoader Navigation kann man Navigationsbereiche aufrufen, welche man zuvor im Navigation Manager erstellt hat.
  • Store / RDStore
    Über den ObjectLoader Store (Alias: RDStore) kann man auf Objekte und Variablen zugreifen, welche man zuvor definiert hat. Diesen Provider benötigt man, wenn man Schleifen verwenden möchte.
  • Social
    Über den ObjectLoader Social kann man auf Objekte und Variablen zugreifen, welche durch die TempoSocial-Integration bereitgestellt werden.

Die folgenden ObjectLoader (Provider) verwendet man für die Typisierung:

  • Boolean / Bool
    Eine Variable dieses Typs hat entweder den Wert True oder False.
  • Guid
    Eine Variable dieses Typs einen eindeutigen Bezeichner dar (Globally Unique Identifier, globaler eindeutiger Bezeichner).
  • Int32 / Int
    Eine Variable dieses Typs ist eine Zahl ohne Kommastellen. Eine Zahl dieses Typs ist mindestens -2147483648 und höchstens 2147483647.
  • String / Str / RDString
    Eine Variable dieses Typs ist eine Zeichenfolge.

ObjectLoader werden ebenfalls in der main.config definiert:

<Rendering>
    <Preparse>
...
    </Preparse>
    <Spots>
...
    </Spots>
    <ObjectLoader>
        <Loader name="Bool:" 
            typename="BoolLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Boolean:" 
            typename="BoolLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Context:" 
            typename="ContextLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="RdObj:" 
            typename="ContextLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Debug:" 
            typename="DebugLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Escape:" 
            typename="EscapeLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="RdEscape:" 
            typename="EscapeLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Guid:" 
            typename="GuidLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Int32:" 
            typename="Int32Loader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Int:" 
            typename="Int32Loader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Navigation:" 
            typename="NavigationLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Store:" 
            typename="StoreLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="RdStore:" 
            typename="StoreLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="String:" 
            typename="StringLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Str:" 
            typename="StringLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="RdString:" 
            typename="StringLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Array:" 
            typename="ArrayLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader name="Social:" 
            typename="SocialObjLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
        <Loader type="default" 
            typename="StringLoader" 
            namespace="Reddot.CMS.Rendering.Objects" 
            filename="C:\OpenText\WS\MS\Assemblies\OpenText.WS.MS.Server.dll" />
    </ObjectLoader>
    <RenderTags>
...
    </RenderTags>
</Rendering>

 

Anmerkungen

  • Beim Template Rendering wird alles case-sensitiv behandelt. Daher bitte Groß- und Kleinschreibung beachten.
  • Die Technologie hinter dem Template Rendering ist Microsoft .NET / C# (derzeit 4.6.1), Assembly Refelction und somit vollständig Objekt-Orientiert (OO).
  • Im Navigation-Manager Handbuch steht nur das, was zusätzlich zum Funktionsumfang von Microsoft oder speziell für den Management Server hingefügt wurde (Objekte, Methoden, Eigenschaften usw.).

 

Customizing

Es gibt auch die Möglichkeit eigene s.g. Custom RenderSpots, RenderTags oder ObjectLoader mit .NET Framework zu erstellen und dann beim Template Rendering aufzurufen. Dazu findet man im OpenText™ Developer Network Beispiel Code und eine ausführliche Anleitung.

 

Gilt für

  • OpenText™ Web Site Management Server
    Release 16.0.3
  • Letztes Artikelupdate
    23.06.2019

 

Siehe auch


Über den Autor:
Thomas Pollinger

... ist Senior Site Reliability Engineer bei der Vodafone GmbH in Düsseldorf. Seit dem Jahr 2007 betreut er zusammen mit seinen Kollegen die OpenText- (vormals RedDot-) Plattform Web Site Management für die deutsche Konzernzentrale.

Er entwickelt Erweiterungen in Form von Plug-Ins und PowerShell Skripten. Seit den Anfängen in 2001 (RedDot CMS 4.0) kennt er sich speziell mit der Arbeitweise und den Funktionen des Management Server aus.