mehrfache-aufrufe-von-psx-modulen-mit-veraenderten-parametern.png
  • Holm Gehre
  • 10.04.2017
  • DE

Mehrfache Aufrufe von PSX-Modulen mit veränderten Parametern

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?
 

Was ist ein PSX-Modul?

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"/>

 

Mehrere PSX-Module in einer Seite

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


 

Das Context-Dynament

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.


Zusammenfassung

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.

 

Social Media