Mailinglisten-Archive |
Hi,
On Thu, Dec 28, 2006 at 12:04:09AM +0100, Albin Blaschka wrote:
> Folgende Ausgangslage:
> Ich habe eine XML-Datei, die mir einen Menübaum beschreibt, sie sieht
> gekürzt in etwa so aus:
[..]
> <li acl = "1"><a href = "script1.php">Ausgabe</a>
> <ul acl = "1">
> <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>
[..]
> Wichtig ist hier der Parameter acl, der soetwas wie ein
> einfaches Rechte-System umsetzt: der angemeldete User gehört also entweder
> Gruppe 1 oder 2 an und entsprechende Menü-Punkte soll er bekommen.
So wie du die acl Attribute vergeben hast, wiedersprechen die sich
aber. Der li node oben wird ja z.B. nur fuer acl 1 freigegeben, hat
aber Kinder der acl 2...
Ich gehe mal davon aus, das kommt von "ich habe alles versucht..."
;-)
Wie auch immer, hier noch ein ganz anderer Ansatz:
Wenn du XML hast, warum machst du die Transformation nicht mit XSL?
Dann kannst du dir den ganzen rekursiven Kram und das Dom-Node gebaue
in PHP sparen.
Hier mal ein Beispiel wie es gehen koennte (mit einem "aufgeraeumten"
xml-Source, d.h. ohne acl Att. in den ul Tags, geht aber auch mit)
Ergebnis:
--------------------------------schnipp-----------------------------
<ul id="navigation" class="horizontal">
<li>
<a href="edit.php">Daten pflegen</a>
<ul>
<li>
<a href="edit.php?flag=input">Werk eingeben</a>
</li>
<li>
<a href="edit.php?flag=edit">Werk 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>
--------------------------------schnapp-----------------------------
php-Code mit XML-String
--------------------------------schnipp-----------------------------
<?php
$xml = '<?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">Werk eingeben</a></li>
<li acl = "1"><a href="edit.php?flag=edit">Werk 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>
';
// Parameter-Wert der im XSL-Template fuer die ACL-Preufung verwendet
// wird.
$acl = 1;
// XML-Source initialisieren
$xmlDom = new DOMDocument();
$xmlDom->loadXML($xml);
// laden des XSLT Stylesheet als DOM
$xslDom = new DOMDocument();
$xslDom->load('trash.xsl');
// XSLT processor initialisieren
$xsl = new XsltProcessor;
// stylesheet importieren
$xsl->importStylesheet($xslDom);
// ACL-Wert aus $acl im XSL-Template setzen
$xsl->setParameter('', 'acl', $acl);
// Transformation ausfuehren -> return XML
$out = $xsl->transformToXML($xmlDom);
print_r($out);
?>
--------------------------------schnapp-----------------------------
Und hier das passende XSL-Template dazu (trash.xsl):
--------------------------------schnipp-----------------------------
<?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>
<!--
Nicht loeschen !!! Das ist der Default fuer "nix machen" wenn
sonst kein Template past!
-->
<xsl:template match="*">
</xsl:template>
</xsl:stylesheet>
--------------------------------schnapp-----------------------------
Gruss Jens
php::bar PHP Wiki - Listenarchive