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