Mailinglisten-Archive |
Guten Abend!
Folgende Ausgangslage:
Ich habe eine XML-Datei, die mir einen Menübaum beschreibt, sie sieht
gekürzt in etwa so aus:
<ul id="navigation" class="horizontal">
<li acl = "1"><a href = "edit.php">Daten pflegen</a>
<ul acl = "1">
<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 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>
</ul>
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.
Auf der ersten Ebene funktioniert das mit folgender Methode:
public function buildMenu() {
$query = '/ul/li[@acl="'.$this->perm.'"]';
$xpath = new DOMXPath($this->menu);
$result = $xpath->query($query);
$newDom = new DOMDocument();
$root = $newDom->createElement('ul');
$root->setAttribute('id','navigation');
$root->setAttribute('class','horizontal');
$root=$newDom->appendchild($root);
foreach ($result as $node) {
$simpleNode = simplexml_import_dom($node);
if ((int)$simpleNode['acl'] <= (int)$this->perm) {
$root->appendChild($newDom->importNode($node,TRUE));
}
}
return $newDom->saveXML();
}
Aber eben nur auf der *ersten* Ebene... Alle meine Versuche, das ganze "in
die Tiefe" gehen zu lassen, schlagen fehl. Ich weiß, daß der zweite
Parameter bei der Methode $newDom->importNode, also das TRUE sagt, daß alle
nachfolgenden Knoten mitgenommen werden.
Ich habe diese Funktion mir gebaut und wollte sie dann erweitern, bin aber
hoffnungslos gescheitert, darum auch keine weiterführenden Code-Snippets...
:-(
Es geht also nach meinem Verständnis darum, den Parameter TRUE
herauszunehmen und mit Rekursion zu prüfen was im Parameter acl steht und
entsprechend den Knoten in den neuen Baum ($newDom) einzubauen... und mit
Rekursion hapert's bei mir anscheinend grundlegend, weil alles was ich damit
erreiche ist Kopfweh ;-(
Ich mach's auch gern andersherum, streiche die Knoten, die nicht
hineinpassen...hatte aber auch in dieser Richtung keinen Lichtblitz...
Anmerkung: Aus dieser XHTML-Liste wird ein dynamisches Menü...
Wenn mir wer weiterhelfen könnte, hätte ich vielleicht doch noch ein
(verspätetes) Christkind ;-)
Danke im Voraus,
Albin
--
| Albin Blaschka, Mag.rer.nat.
| Etrichstrasse 26, A-5020 Salzburg
| * www.albinblaschka.info * www.thinkanimal.info *
| - It's hard to live in the mountains, hard but not hopeless!
php::bar PHP Wiki - Listenarchive