Variable Navigations-Listen mit PHP, XML und XSLT
... oder, taugt XSLT als Templatesprache für die Ausgabelogik?
Hier eine kleines Beispiel, wie man sehr einfach mit XSLT anhand eines gegebenen Wertes eine variable Ausgabe von (XML) Daten erzeugen kann. Als Beispielaufgabe soll hier mal eine Navigationsliste eines Intranets herhalten. - Jeder User bekommt beim Login ein Berechtigungslevel - Je nach Berechtigung des Users sollen nur die Teile der Navigation angezeigt werden für die der User auch eine Berechtigung hat. - Die gesamte Navigation, mit allen insgesamt möglichen Items, soll aber nur einmal als XML/XHTML gepflegt werden müssen. Vorraussetzung ist PHP 5 ;-) So sieht die gesamte Navigation als XML aus.
Der Wert anhand dem bestimmt wird ob ein User das notwendige Berechtigungslevel hat ist im XML das Attribut 'acl'. CODE: <?xml version="1.0" encoding="ISO-8859-1" ?> <ul id="navigation" class="horizontal"> <li acl = "1"><a href = "edit.php">Daten pflegen</a> <ul> <li acl = "1"><a href="edit.php?flag=input">eingeben</a></li> <li acl = "1"><a href="edit.php?flag=edit">editieren</a></li> </ul> </li> <li acl = "2"><a href = "filter.php">Filter</a> <ul> <li acl = "2"><a href = "filter.php?flag=set">Filtern</a></li> <li acl="2"><a href ="filter.php?flag=del">Filter löschen</a></li> </ul> </li> <li acl = "1"><a href = "script1.php">Ausgabe</a> <ul> <li acl = "1"><a href = "script2.php">Persönliche Liste</a></li> <li acl = "2"><a href = "script3.php">Gesamtliste</a></li> <li acl = "2"><a href = "script4.php">Statistik</a></li> </ul> </li> </ul> Man könnte jetzt den XML-Baum in PHP z.B. mit SimpleXML einlesne und für jeden Knoten prüfen ob das acl-Attribut passt, damit einen neuen (redizierten) XML-Baum erzeugen und diesen dann ausgeben. Oder man macht die Ausgabe einfach mit XSL. Dann sieht der PHP-Code z.B. so aus: PHP: Hier wird also "nur noch" der Wert $acl gesetzt (kommt z.B. aus der Session), die notwendigen DOM und XSLT Objekte erzeugt, transformiert und fertig ist die Ausgabe. CODE: <ul id="navigation" class="horizontal"> <li> <a href="edit.php">Daten pflegen</a> <ul> <li> <a href="edit.php?flag=input">eingeben</a> </li> <li> <a href="edit.php?flag=edit">editieren</a> </li> </ul> </li> <li> <a href="script1.php">Ausgabe</a> <ul> <li> <a href="script2.php">Persönliche Liste</a> </li> </ul> </li> </ul> Die ganze "Ausgabe-Magie" ist im XSLT-Template zu finden. Das kann hier z.B. so ausssehen: CODE: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="yes" media-type="text/xml" /> <!-- der ACL Parameter der "aussen" gesetzt wird --> <xsl:param name="acl" select="'X'"/> <!-- aufraeumen --> <xsl:strip-space elements="*" /> <!-- Alle ul Tags die ein passendes acl oder kein acl haben --> <xsl:template match="ul[@acl=$acl]|ul[not(@acl)]"> <ul> <!-- id Attribute uebernehmen --> <xsl:if test="@id"> <xsl:attribute name="id"> <xsl:value-of select="@id"/> </xsl:attribute> </xsl:if> <!-- class Attribute uebernehmen --> <xsl:if test="@class"> <xsl:attribute name="class"> <xsl:value-of select="@class"/> </xsl:attribute> </xsl:if> <xsl:apply-templates /> </ul> </xsl:template> <!-- alle li Tags die ein passendes acl haben --> <xsl:template match="li[@acl=$acl]"> <li> <xsl:apply-templates /> </li> </xsl:template> <!-- Die Links in den li Tags --> <xsl:template match="a"> <a> <xsl:attribute name="href"> <xsl:value-of select="@href"/> </xsl:attribute> <xsl:value-of select="."/> </a> </xsl:template> <!-- Das ist der Default fuer "nix machen" wenn sonst kein Template passt! Damit kann man sich Arbeit sparen und Fehler vermeiden ;-) --> <xsl:template match="*"> </xsl:template> </xsl:stylesheet> Es wird also einfach für jeden <ul> und <li> Tag geprüft ob das acl-Atribut passt, wenn ja, den Knoten und dessen Kinder ausgeben, wenn nein einfach ignorieren. Das schöne an XSLT finde ich, dass es eine allgemein gültige Lösung ist. So ein Template funktioniert mit jedem Standardkonformen XSLT-Prozessor und ist keine PHP spezifische Lösung oder gar eine eigene Templatesprache die auf PHP/RegEx beruht. Für Ausgabe Logik und/oder als Templatesprache ist XSLT meiner Meinung nach also auf jeden Fall einen Blick wert! Weiterführende Doku zu XSL: XSL Funktionen in PHP W3C XSLT Spezifikation
Autor: Jens Giessmann
in PHP, XML
am
Dienstag, 9. Januar 2007
um
17:32
Kommentare (0) | Trackbacks (0) Trackbacks
Trackback-URL für diesen Eintrag
Keine Trackbacks
|
blog powered by Serendipity