Da es für PHP kein XSLT Version 2 gibt, haben wir es in Weblication® CMS Core/Grid ermöglicht, direkt in allen Templates PHP auszuführen. Den Unterschied zwischen PHP in wsl:php Bereichen und PHP direkt in XSLT ausgeführt, wird Ihnen anhand von Quelltext-Beispielen in diesem Artikel aufgezeigt. Die Beispiele nutzen zur Veranschaulichung die Funktion, um alle Zeichen eines Texts in Großbuchstaben anzuzeigen.
Wichtig:
Jeglicher PHP-Code in XSL-Stylesheets wird NACH der xsl-Transformation ausgeführt. Daher ist es nicht möglich, einer xsl-Variable einen durch PHP ermittelten Wert zuzuweisen.
Reihenfolge bei der XSLT-Transformation:
Sie haben die Möglichkeit, in jedem beliebigen XSL-Stylesheet von Weblication® eigenen PHP-Code auszuführen. Allerdings darf hierbei nicht die gewöhnliche Notation des PHP-Bereiches verwendet werden, sondern ein dafür verfügbares wsl-Tag:
<?php echo "test"; ?>
<wsl:php> echo "test"; </wsl:php>
Sie können an beliebigen Stellen wsl:php Bereiche 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.
<wsl:php> print strToUpper('<xsl:value-of select="wd:fragment[@id = 'text']/text()" />'); </wsl:php>
Das gleiche wie zuvor mit wsl:php umgesetzt, können Sie auch direkt während der XSL-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.
<xsl:value-of select="php:functionString('strToUpper', wd:fragment[@id = 'text']/text())" />
In einem weiteren Beispiel wird Ihnen aufgezeigt, wie Sie das Problem lösen, daß 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.
<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 XSL-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.
... <title><wsl:php>print wEnv::getGlobalValue('pageTitle');</wsl:php></title> ... <value-of select="php:function('wEnv::setGlobalValue', 'pageTitle', 'Spezieller Seitentitel')"/> ...
Im nachfolgenden Beispiel wird global über die wMyProject.php die navid auf Grundlage der Navigationsdatei zur aufgerufenen URL ermittelt und steht über die Funktion als Rückgabewert zur Verfügung (linkes Quelltextbeispiel).
In der Liste für die Suchergebnisse der Volltextsuche (search.wFilelist.php) wird der Rückgabewert der Funktion für die URL der Suchergebnisse genutzt, um diesen den navid-Parameter mitzugeben.
//*********************************************************************************/
/**
* @method String navid(String $url)
*
* @description Gibt die Navigations-ID zu einer URL in der Navigation zurück
*
* @param url URL
*
* @return String
*
*/
//*********************************************************************************/
public static function navid($url){
$wPathProject = wProjectCur::getPath();
//$url = '';
$navid = wNavigation::getNavId($wPathProject."/wGlobal/content/navigations/standard.wNavigation.php", $url);
return $navid;
}
... <xsl:variable name="navid"><xsl:value-of select="php:functionString('wMyProject::navid', $url)" /></xsl:variable> <div class="listEntryUrl"><a href="{$url}?navid={$navid}"><xsl:value-of select="$url"/></a></div> <!--<div class="listEntryUrl"><a href="{$url}"><xsl:value-of select="$url"/></a></div>--> ...
Abschließend nochmals eine Gegenüberstellung, um zu verdeutlichen, welche Aufrufe zu einem erfolgreichen Ergebnis führen und welche nicht.
Tipp:
Damit eine einheitliche Vorgehensweise zur optionalen Maskierung von Anführungszeichen verwendet werden kann, nutzen Sie zum Setzen eines PHP-Strings durch XSL am besten ausschließlich doppelte Anführungszeichen ("...").
Wertzuweisung über PHP an eine XSL-Variable funktioniert so nicht:
<xsl:variable name="test"><wsl:php>echo "testWert";</wsl:php></xsl:variable> <xsl:value-of select="$test"/> <!-- Der Wert von $test bleibt leer -->
Umgekehrt funktioniert die Wertzuweisung (XSL weist einer PHP-Variablen einen Wert zu):
<wsl:php> $testWert = "<xsl:value-of select="wd:fragment[@id='text']/text()"/>"; echo $testWert; // gibt den Wert von wd:fragment[@id='text']/text() aus </wsl:php>