PHP in XSLT ausführen

17. Mai 2010

Weblication CMS erlaubt es in allen XSLT-Templates direkt PHP auszuführen. Somit steht Ihnen eine offene und leistungsfähige Template-Sprache zur Verfügung.

Da es für PHP kein XSLT2 gibt, haben wir aus der Not eine Tugend gemacht und es ermöglicht, direkt in allen Templates PHP auszuführen. Den Unterschied zwischen PHP in wsl:php Bereichen und PHP direkt in XSLT ausgeführt zeige ich Ihnen anhand ein paar Beispielen.

Nehmen wir mal an, Sie wollen bei einem Text alle Zeichen groß darstellen, dann können Sie das sowohl über wsl:php oder auch über XSLT-PHP machen.

PHP in wsl:php Bereichen

Sie können an beliebigen Stellen wsl:php Beriche definieren, in denen Sie wiederum beliebigen PHP-Code einbinden können. Sie können diesen direkt in das Template schreiben oder inkludieren.

Bei dieser Form wird das PHP nach der XSLT-Transformation ausgeführt, was in den meisten Fällen gewünscht ist.

Text über wsl:php in Großbuchstaben umwandeln

<wsl:php>
  print strToUpper('<xsl:value-of select="wd:fragment[@id = 'text']/text()" />');
</wsl:php>

PHP während der XSLT-Transformation ausführen

Das gleiche wie können Sie auch direkt während der XSLT-Transformation erledigen. Das funktioniert ganz einfach über php:functionString, indem Sie als ersten Parameter eine PHP-Funktion und deren Parameter wiederum als weitere Parameter angeben. Sie können so entweder auf vordefinierte PHP-Funktionen, CMS Framework-Funktionen oder auch auf eigene Funktionen zurückgreifen.

Mit dieser eleganten Methode können Sie XSLT beliebig erweitern und haben eine mächtige Template-Sprache ohne Grenzen.

Text in der XSLT-Transformation in Großbuchstaben umwandeln

<xsl:value-of select="php:functionString('strToUpper', wd:fragment[@id = 'text']/text())" />

Prüfen der Projektsprache

<xsl:if test="php:functionString('wProjectCur::getLanguage') = 'en'">
  <span>Hello</span>
</xsl:if>

In einem weiteren Beispiel will ich Ihnen noch zeigen, wie Sie das Problem lösen, dass Sie XSLT Variablen nicht nachträglich manipulieren können. Dazu umgehen Sie einfach XSLT-Variablen und nutzen statt dessen globale PHP-Variablen, die Sie über php:functionString setzen bzw. auslesen. 

Variablen über php:functionString setzen und in einem Attribut auslesen

<xsl:value-of select="php:function('wEnv::setGlobalValue', 'backgroundColor', 'black')"/>
<xsl:if test="position() = 1">
<xsl:value-of select="php:function('wEnv::setGlobalValue', 'backgroundColor', 'red')"/>
</xsl:if>

<div style="background-color:{php:functionString('wEnv::getGlobalValue', 'backgroundColor')}">*</div>

Und noch eine interessante Möglichkeit ergibt sich durch php:functionString. Da diese Funktionen bereits während der XSLT-Transformation und vor den WSL-Tags ausgeführt werden, können Sie darüber Werte in der Seite setzen, die davor (z.B. im HTML-Kopf) ausgegeben werden.

Werte über php:functionString während der XSLT-Transformation setzen und davor über wsl:php ausgeben

...
<title><wsl:php>print wEnv::getGlobalValue('pageTitle');</wsl:php></title>
...
<xsl:value-of select="php:function('wEnv::setGlobalValue', 'pageTitle', 'Spezieller Seitentitel')"/>
...