PSX-Module sind praktisch, werden separat gecached und aus keinem Delivery Server Projekt wegzudenken. Doch wirft das Verhalten, bei der mehrfachen Verwendung innerhalb einer Seite, die Frage auf: Geht das überhaupt und wenn ja, wie?
Die OpenText Dynament-Dokumentation beschreibt PSX-Module wie folgt:
"PSX-Module stellen eine selbstständige Kombination aus einem XML-Inhalt und einem XSL-Stylesheet dar und können separat gerendert werden. Sie werden als Platzhalter in einem Inhalt eingebettet und beim Abfragen des Inhalts mit einem eigenen Caching-Verhalten separat erzeugt und eingefügt. Eine Bedingungsprüfung für das PSX-Modul erfolgt erst beim Ersetzen des Platzhalters. Sind die Bedingungen nicht erfüllt, wird der Platzhalter aus dem gerenderten Ergebnis entfernt und das PSX-Modul nicht angezeigt."
Das nachfolgende Beispiel entstammt ebenfalls dieser Dokumentation:
<rde-dm:include content="trails:news-list.xml"
stylesheet="hs-newslist.xsl"
cachingtime="60"/>
Unter Umständen ist es notwendig oder wünschenswert, mehrere PSX-Module innerhalb einer Seite zu verwenden. Ich denke hier zum Beispiel an die Darstellung von filterbaren Pressemitteilungen und einer vorselektierten Liste nach Themengebieten oder der Anzeige von verschiedenen Target-Suchen, die auf zu übegebende Parameter reagieren.
Im nachfolgende Beispiel werden 3 Variablen in einer Seite definiert, von den PSX-Modulen 1 und 2 ausgelesen bzw. angezeigt.
<html> <head><title>Context-Demo</title></head> <body> <h1>PSX-Module</h1> <h2>Standard - Context</h2> <rde-dm:attribute mode="write" attribute="request:variableOne" op="set" value="1"/> <rde-dm:attribute mode="write" attribute="request:variableTwo" op="set" value="2"/> <rde-dm:attribute mode="write" attribute="request:variableThree" op="set" value="3"/> <h3>Include PSX 1</h3> <rde-dm:include content="daten.xml" stylesheet="styles.xsl"/> <rde-dm:attribute mode="write" attribute="request:variableOne" op="set" value="4"/> <rde-dm:attribute mode="write" attribute="request:variableTwo" op="set" value="5"/> <rde-dm:attribute mode="write" attribute="request:variableThree" op="set" value="6"/> <h3>Include PSX 2</h3> <rde-dm:include content="daten.xml" stylesheet="styles.xsl"/> </body> </html>
<dynament> <var1> <rde-dm:attribute mode="read" attribute="request:variableOne" tag="notag" /> </var1> <var2> <rde-dm:attribute mode="read" attribute="request:variableTwo" tag="notag" /> </var2> <var3> <rde-dm:attribute mode="read" attribute="request:variableThree" tag="notag" /> </var3> </dynament>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="dynament"> <p>Variable 1: <xsl:value-of select="./var1/text()"/></p> <p>Variable 2: <xsl:value-of select="./var2/text()"/></p> <p>Variable 3: <xsl:value-of select="./var3/text()"/></p> </xsl:template> </xsl:stylesheet>
Das resultierende Ergebnis ist auf den ersten Blick leicht mißverständlich, da für PSX 1 die Variablenwerte 1,2,3 erwartet wurden.
Die Verarbeitung der schreibenden Dynaments erfolgt aber im Kontext der HTML-Seite und nur das "fertige" Ergebnis wird an die PSX-Module übergeben - daher zeigen die Bereiche "Include PSX 1" und "Include PSX 2" identische Werte für die Variablen 1,2,3 und 4,5,6
Um das gewünschte Ergebnis zu erreichen, kann das "Context-Dynament" genutzt werden. XML und XSL müssen hierfür nicht ergänzt oder erweitert werden. Der HTML-Code wurde um 2 Dynaments (CPS, Context) erweitert und sieht nun folgendermaßen aus.
<html> <head><title>Context-Demo</title></head> <body> <h1>PSX-Module</h1> <h2>Context - Übergabe</h2> <rde-dm:attribute mode="write" attribute="request:variableOne" op="set" value="1"/> <rde-dm:attribute mode="write" attribute="request:variableTwo" op="set" value="2"/> <rde-dm:attribute mode="write" attribute="request:variableThree" op="set" value="3"/> <rde-dm:cps mode="id" type="guid" id-attribute="request:contextid" process-mode="execute" /> <h3>Include PSX 1</h3> <rde-dm:context context="[#request:contextid#]" mode="process" context-scope="request"> <rde-dm:context mode="transfer" source="request"> <attribute name="variableOne" /> <attribute name="variableTwo" /> <attribute name="variableThree" /> </rde-dm:context> <rde-dm:context mode="commit" source="request"> <attribute name="variableOne" /> <attribute name="variableTwo" /> <attribute name="variableThree" /> </rde-dm:context> </rde-dm:context> <rde-dm:include content="daten.xml" stylesheet="styles.xsl" context="[#request:contextid#]" context-scope="request" /> <rde-dm:attribute mode="write" attribute="request:variableOne" op="set" value="4"/> <rde-dm:attribute mode="write" attribute="request:variableTwo" op="set" value="5"/> <rde-dm:attribute mode="write" attribute="request:variableThree" op="set" value="6"/> <rde-dm:cps mode="id" type="guid" id-attribute="request:contextid" process-mode="execute"/> <rde-dm:context context="[#request:contextid#]" mode="process" context-scope="request"> <rde-dm:context mode="transfer" source="request"> <attribute name="variableOne" /> <attribute name="variableTwo" /> <attribute name="variableThree" /> </rde-dm:context> <rde-dm:context mode="commit" source="request"> <attribute name="variableOne" /> <attribute name="variableTwo" /> <attribute name="variableThree" /> </rde-dm:context> </rde-dm:context> <h3>Include PSX 2</h3> <rde-dm:include content="daten.xml" stylesheet="styles.xsl" context="[#request:contextid#]" context-scope="request" /> </body> </html>
Mit dem "CPS-Dynament" wird eine GUID erzeugt, um dem jeweiligen Kontext eine eindeutige Identifizierungsmöglichkeit zu geben. Das Attribute "process-mode=execute" unterdrückt eine Ausgabe dieser GUID.
Über das "Context-Dynament" werden zunächst die Variablen zum jeweiligen Zeitpunkt transferiert und an das PSX-Modul übermittelt.
Das Ergebnis entspricht nun den Erwartungen.
Mit dem Context-Dynament lassen sich eigenständige, instanzenfähige Module erstellen, die jeweils in ihrer eigenen "Sandbox" ausgeführt und gecached werden. Laufen PSX-Module im Kontext der Rahmenseite, werden zunächst alle schreibenden Dynaments von oben nach unten abgearbeitet und die Endergebnisse an die PSX-Module übergaben.
Holm Gehre ist seit Mitte 2017 Senior Softwareentwickler und Projektleiter bei CHEFS CULINAR und betreut dort mit seinem Team die Opentext-Plattform. Seit dem Jahr 2001 und bis Mitte des Jahres 2017 betreute und entwickelte er Opentext- (vormals RedDot-) basierte Webseiten nationaler und internationaler Kunden auf Basis von Management und Delivery Server.