php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > XML
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


XML Hier passt alles rein, was das Thema XML (XSLT, JSON etc...) betrifft, auch in Verbindung mit PHP

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 20-10-2005, 09:42
creative-w3
 Newbie
Links : Onlinestatus : creative-w3 ist offline
Registriert seit: Oct 2005
Beiträge: 2
creative-w3 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Menü aus XML erzeugen, Syntax-Problem Array-Aufbau

Hallo allerseits,

ich möchte aus einer XML-Datei (1) über eine php-Klasse (2) ein Array (3) erzeugen. In einen Array bekomme ich auch alles ganz gut, jedoch weiß ich nicht, wie ich in der Methode "buildMenuStructure" für die Kinder in eine tiefere Ebene des Array komme, so dass das Modell wie in 3 entsteht. Ich habe immer alle Menüelemente auf einer Ebene - die SubElemente sind also nicht als Children zugeordnet...

Ich hoffe, dass mich der eine oder andere verstanden hat und mir helfen kann! Wäre sehr geil

Viele Grüße,
André


1. XML-Datei
PHP-Code:
<?xml version="1.0"?>
<menu>
    <menuElement view="defaultview" url=""/>
    <menuElement view="systems" url="?op=systems">
        <menuSubElement view="systemgroups" url="?op=systemgroups"/>
        <menuSubElement view="systemoverview" url="?op=systemOverview"/>
        <menuSubElement view="addsystem" url="?op=addSystem"/>
        <menuSubElement view="import" url="?op=import"/>
    </menuElement>
    <menuElement view="mylandscape" url="?op=mylandscape">
        <menuSubElement view="personaldata" url="?op=personaldata"/>
        <menuSubElement view="responsibilities" url="?op=responsibilities"/>
        <menuSubElement view="subscriptions" url="?op=subscriptions"/>
    </menuElement>
</menu>
2. Ausschnitt der php-Klasse
PHP-Code:
public function buildMenuAsArray($whichMenu$activeView) {
    
    
// Menueexistenz feststellen
    
if(!array_key_exists($whichMenu$this->map)) {
        die(
"The selected menu doesn't exist in the menuMap.");
    } 
    
    
// XML-Datei als DOM-Objekt einlesen
    // :TODO: Datei-Existenz pruefen...
    
$this->menuDom = new domDocument();
    
$this->menuDom->preserveWhiteSpace false;
    
$this->menuDom->load($this->map[$whichMenu]);
    
    
// Mit der ersten Menue-Ebene starten...
    
$highestElements $this->menuDom->getElementsByTagName('menuElement'); 
    foreach(
$highestElements as $highestElement) {
        
$this->buildMenuStructure($highestElement$this->menu$activeView);
    }
}

private function 
buildMenuStructure($menuElement$menu$activeView) {
    
$active = ($menuElement->getAttribute("view") == 
        
strtolower($activeView)) ? true false;
    
$gotChildren $menuElement->hasChildNodes();
    
$this->menu[] = array('view' => $menuElement->getAttribute("view"), 
                          
'url' => $menuElement->getAttribute("url"),
                          
'active' => $active
                          
'gotChildren' => $gotChildren);
    if(
$gotChildren) {
        
$childElements $menuElement->childNodes;
        foreach(
$childElements as $childElement) {
            
$this->buildMenuStructure($childElement$menu$activeView);
        }        
    }

3. gewünschter Aufbau des Array
PHP-Code:
$menu[menuItem][url] = "bla..."
               
[view] = "blubb..."
               
[active] = 1
               
[gotChildren] = 1
               
[childActive] = 1
               
[children][menuItem] ... usw. (alle SubElementeStruktur wie oben) ... 
Mit Zitat antworten
freelancermap.de - IT Projektvermittlung für Selbständige und Freiberufler
  #2 (permalink)  
Alt 20-10-2005, 21:11
creative-w3
 Newbie
Links : Onlinestatus : creative-w3 ist offline
Registriert seit: Oct 2005
Beiträge: 2
creative-w3 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich habe es inzwischen ganz anders gelöst (und es funktioniert auch...).
Falls es jemanden interessiert (Kritik ist ausdrücklich erwünscht):

XML-Datei:
PHP-Code:
<?xml version="1.0"?>
<menu>
    <menuElement view="defaultview" url=""/>
    <menuElement view="systems" url="?op=systems">
        <menuElement view="systemgroups" url="?op=systemgroups"/>
        <menuElement view="systemoverview" url="?op=systemOverview">
            <menuElement view="systemgroups2" url="?op=systemgroups2"/>
            <menuElement view="systemgroups3" url="?op=systemgroups3"/>
        </menuElement>
        <menuElement view="addsystem" url="?op=addSystem"/>
        <menuElement view="import" url="?op=import"/>
    </menuElement>
    <menuElement view="mylandscape" url="?op=mylandscape">
        <menuElement view="personaldata" url="?op=personaldata"/>
        <menuElement view="responsibilities" url="?op=responsibilities"/>
        <menuElement view="subscriptions" url="?op=subscriptions"/>
    </menuElement>
</menu>

Menü-Klasse (die menuMap ist ja klar...):
PHP-Code:
<?php
/*
 * Systemlandschaft: class/template/menu.class.php
 * Autor: Andre Kolell 
 * Erstellt: 19.10.2005, 20:54
 *
 * Kurzbeschreibung:
 * Diese Klasse liest eine XML-Menuestruktur ein und stellt diese dann in der
 * gewuenschten Form (bisher ist lediglich "Array" implementiert) bereit.
 */
 
class Menu {
    
    
// Zuordnungen zwischen Menues und einzubindenden XML-Dateien
    // (jedes Menue, z.B. Hauptmenue, Shortcuts, etc. hat seine eigene Datei)
    
private $map;
    
    
// Das "fertige" Menue (bisher ist lediglich "Array" implementiert)
    
private $menu;
    
    
// Aktueller View 
    
private $activeView;        // als String, z.B. "defaultView"
    
private $activeViewKey;        // als Key in einem Array, z.B. "4"


    
    // Konstruktor. $activeView entspricht der aus vielen Webprojekten bekannten 
    // "$display"-Variable. Zum Zeitpunkt der Erstellung dieses Menues muss also
    // der aktuelle View bereits bekannt sein.
    
function __construct($activeView) {
        
        
// Zuordnungen zwischen Menues und einzubindenden XML-Dateien bereitstellen
        
include_once("class/template/menu/menumap.properties.php");
        
$this->map $menuMap;
        
        
// Aktiven View belegen
        
$this->activeView $activeView;
    }



    
// Erzeugt das Menue ($whichMenu) als Array aus der XML-Datei
    
public function buildMenuAsArray($whichMenu) {
        
        
// Menueexistenz feststellen
        
if(!array_key_exists($whichMenu$this->map)) {
            die(
"The selected menu doesn't exist in the menuMap.");
        } 
        
        
// XML-Datei als DOM-Objekt einlesen
        // :TODO: Datei-Existenz pruefen...
        
$menuDom = new domDocument();
        
$menuDom->preserveWhiteSpace false;
        
$menuDom->load($this->map[$whichMenu]);
        
        
// Wurzelelement "menu" und dessen Kinder (erste Menueebene) holen
        
$rootElementNodeList $menuDom->getElementsByTagName('menu');
        
$rootElement $rootElementNodeList->item(0);
        
$firstMenuLevel $rootElement->childNodes;
        
        
// Komplette Baumstruktur erzeugen, aktives Element kennzeichnen (und merken)
        
foreach($firstMenuLevel as $menuElement) {
            
$this->buildMenuAsArrayAddElement($menuElement00);
        }    

        
// Ist ein Menuepunkt (View) aktiv, und ist dieser Menuepunkt in einer
        // tieferen Ebene als der Ersten, muss die Baumstruktur geoffnet werden
        
if(isset($this->activeViewKey) && 
                
$this->menu[$this->activeViewKey]['hierachy'] > 0) {
            
$this->buildMenuAsArrayOpenRelevantItems($this->activeViewKey);
        }
    }    

    
// Fuegt dem Array-Menue ein Menueelement hinzu 
    
private function buildMenuAsArrayAddElement($menuElement$crntLevel$parentKey) {
        if(
$menuElement->getAttribute("view") == strtolower($this->activeView)) {
            
$activeView true;
            
$this->activeViewKey count($this->menu);
        } else {
            
$activeView false;    
        }
        
$gotChildren $menuElement->hasChildNodes();
        
$this->menu[] = array('view' => $menuElement->getAttribute("view"), 
                              
'url' => $menuElement->getAttribute("url"),
                              
'hierachy' => $crntLevel,
                              
'parent' => $parentKey,
                              
'activeView' => $activeView
                              
'open' => false);
        if(
$gotChildren) {
            
$crntLevel++;
            
$thisElementsKey = (count($this->menu)-1);
            
$childElements $menuElement->childNodes;
            foreach(
$childElements as $childElement) {
                
$this->buildMenuAsArrayAddElement($childElement$crntLevel$thisElementsKey);
            }        
        }
    }

    
// Oeffnet die gleich- und uebergeordnete Struktur eines Menueelementes
    
private function buildMenuAsArrayOpenRelevantItems($parentKey) {
        
        
// Aktuelles Menueelement und Elemente gleicher Ebene oeffnen
        // :TODO: Es geht sicherlich einfacher!?
        
for($i 0$i count($this->menu); $i++) {
            if(
$this->menu[$i]['parent'] == $parentKey) {
                
$this->menu[$i]['open'] = true;
            }    
        } 
        
        
// Sofern es sich bei dem aktuellen Menueelement nicht um eines der ersten 
        // Ebene handelt, wird die Methode nun mit dem Elternelement aufgerufen        
        
if($this->menu[$parentKey]['hierachy'] > 0) {
            
$this->buildMenuAsArrayOpenRelevantItems($this->menu[$parentKey]['parent']);            
        }    
    }

    
// Gibt das Menue zurueck 
    
public function getMenu() {
        return 
$this->menu;
    }

?>

Folgendes Array entsteht ($activeView = "responsibilities"):
PHP-Code:
Array
(
    [
0] => Array
        (
            [
view] => defaultview
            
[url] => 
            [
hierachy] => 0
            
[parent] => 0
            
[activeView] => 
            [
open] => 
        )

    [
1] => Array
        (
            [
view] => systems
            
[url] => ?op=systems
            
[hierachy] => 0
            
[parent] => 0
            
[activeView] => 
            [
open] => 
        )

    [
2] => Array
        (
            [
view] => systemgroups
            
[url] => ?op=systemgroups
            
[hierachy] => 1
            
[parent] => 1
            
[activeView] => 
            [
open] => 
        )

    [
3] => Array
        (
            [
view] => systemoverview
            
[url] => ?op=systemOverview
            
[hierachy] => 1
            
[parent] => 1
            
[activeView] => 
            [
open] => 
        )

    [
4] => Array
        (
            [
view] => systemgroups2
            
[url] => ?op=systemgroups2
            
[hierachy] => 2
            
[parent] => 3
            
[activeView] => 
            [
open] => 
        )

    [
5] => Array
        (
            [
view] => systemgroups3
            
[url] => ?op=systemgroups3
            
[hierachy] => 2
            
[parent] => 3
            
[activeView] => 
            [
open] => 
        )

    [
6] => Array
        (
            [
view] => addsystem
            
[url] => ?op=addSystem
            
[hierachy] => 1
            
[parent] => 1
            
[activeView] => 
            [
open] => 
        )

    [
7] => Array
        (
            [
view] => import
            
[url] => ?op=import
            
[hierachy] => 1
            
[parent] => 1
            
[activeView] => 
            [
open] => 
        )

    [
8] => Array
        (
            [
view] => mylandscape
            
[url] => ?op=mylandscape
            
[hierachy] => 0
            
[parent] => 0
            
[activeView] => 
            [
open] => 
        )

    [
9] => Array
        (
            [
view] => personaldata
            
[url] => ?op=personaldata
            
[hierachy] => 1
            
[parent] => 8
            
[activeView] => 
            [
open] => 1
        
)

    [
10] => Array
        (
            [
view] => responsibilities
            
[url] => ?op=responsibilities
            
[hierachy] => 1
            
[parent] => 8
            
[activeView] => 1
            
[open] => 1
        
)

    [
11] => Array
        (
            [
view] => subscriptions
            
[url] => ?op=subscriptions
            
[hierachy] => 1
            
[parent] => 8
            
[activeView] => 
            [
open] => 1
        
)


Dieses kann dann z.B. an Smarty übergeben und dort weiterverarbeitet werden...

Hoffe auf Feedback!

Viele Grüße,
André
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

PHP Marktplatz-Software
PHP Marktplatz-SoftwareEs hat sich viel getan! Die neue Version 7.5.9 unserer PHP Marktplatz-Software ebiz-trader steht ab sofort zur Verfügung.

28.10.2019 | Berni

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni


 

Aktuelle PHP Scripte

SMT

Server Monitoring & Management Tool Das SMT wurde von einem Administrator für Administratoren entwickelt, es vereinfacht den Alltag in der klassischen Administration und Verwaltung. Mit dem SMT kannst Du alle Deine Server & Dienste verwalten und überwach

04.09.2020 palle_1977 | Kategorie: PHP
numaeks Web-Farbmixer

Die RGB-Farben lassen sich hier auf unterschiedliche Weise mischen. Zur Einstellung werden auch die Dreh- und Schieberegler mit Canvas verwendet. Gespeichert werden die Farben in einem Cookie.

04.09.2020 numaek | Kategorie: JAVASCRIPT/ Tools
phplinX-Erotikportal 4 ansehen phplinX-Erotikportal 4

Erweiterbares Portal speziell für Erotik mit den Modulen Webkatalog, Bannermanagement und Kleinanzeigenmarkt. Sämtliche Module können über einen einzigen Adminbereich verwaltet werden.

18.06.2020 Cosinus14 | Kategorie: PHP/ Anzeigenmarkt
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:50 Uhr.