Nested data via DOM

Door Arian Stolwijk, 13 jaar geleden, 2.500x bekeken

Een oneindige diepte maken voor bijvoorbeeld een menu, mappenstructuur. Nu met DOM.

Het voordeel met werken met DOM is dat je op een relatief gemakkelijke manier de parent node en en de child nodes kunt bereiken.

In principe maakt het van 2 dimensionale data (bijvoorbeeld uit een database) een geneste DOMDocument.

Aangezien DOMDocument af en toe toch nog best lastig is, heb ik er het e.e.a. omheengebouwd zodat alles simpel te benaderen is.

Zoals je ziet heten mijn classes:
- Nested
- Nested_Child
- Nested_Children
- Nested_Child_Properties
- Nested_Exception

Deze komen dus overeen met de bestanden:
- Nested.php
- Nested/Child.php
- Nested/Children.php
- Nested/Child/Properties.php
- Nested/Exception.php

Het voorbeeld staat helemaal onderaan.
Het komt er op neer dat je eerst de data in de class gooit met de Nested->addChild() method.
De eerste parameter is het ID, de 2e is het id van het parent element. De derde parameter is de bijbehorende data bij het element (de 'properties').

Vervolgens kan je direct al met Nested->getElements() de elementen loopen, omdat getElements() een iteratable object terug geeft (Nested_Children) waar de elementen (Nested_Child) inzitten.

Het Nested_Child element heeft een aantal methods, bijvoorbeeld:
- getParent() - deze geeft het Nested_Child object terug van het parent element
- getChildren() - deze geeft een Nested_Children object terug met een verzameling van Nested_Child objects
- getProperties() - deze geeft het Nested_Child_Properties object terug. Deze kan je met de __get() magic method benaderen om de data snel op te vragen. Dit object kan je tevens loopen met bijvoorbeeld foreach en while.

De Nested class zelf heeft naast addChild() en getElements() ook nog een method getElement()
Met deze method ga je zoeken naar een bepaald element. Deze geeft dan ook een Nested_Child object terug.

Je kunt ook gebruik maken van xPath. Bijvoorbeeld //*[@tekst="bla"] om alle children te selecteren die een property tekst hebben met bla.

De Nested class heeft ook nog een debug() method, deze zet wat xml op het scherm, zodat je snel de structuur van je elementen boom kunt zien

Gesponsorde koppelingen

PHP script bestanden

  1. nested-data-via-dom

 

Er zijn 7 reacties op 'Nested data via dom'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jesper Diovo
Jesper Diovo
13 jaar geleden
 
0 +1 -0 -1
Het ziet er op zich wel goed uit. Ik weet alleen niet of je die functies als rewind(), current(), next() enz. wel moet gebruiken. Die zijn al in gebruikt door PHP zelf, hè...
Arian Stolwijk
Arian Stolwijk
13 jaar geleden
 
0 +1 -0 -1
Daardoor kan je juist de foreach op je object los laten, zodat je bijvoorbeeld de children van een element kunt loopen...

Zie ook de Iterator interface op php.net: http://nl.php.net/Iterator
Arend a
Arend a
13 jaar geleden
 
0 +1 -0 -1
[Edit: Whops, niet goed gekeken, never mind, ik laat het toch staan ter referentie]

Arjan: het is gebruikelijk om dan de notatie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
class MyIterator implements Iterator {
}


Dit heeft twee voordelen:
- het is andere programmeurs expliciter en duidelijk(er) dat je de Iterator interface gebruikt.
- het zal een error geven als je de iterator interface niet goed geimplementeerd hebt, dit maakt het debuggen makkelijker.
Eddy E
Eddy E
13 jaar geleden
 
0 +1 -0 -1
Heb je ook een voorbeeld of voorbeeldcode van het gebruik?

Ik ben hier naar op zoek (naar zo'n class) maar het wil nog niet echt werken.
Een verduidelijkend voorbeeld doet vaak wonderen.

Edit:

Stom... helemaal onderaan zie ik het nu staan.
Had dus gewoon niet goed gekeken!
Arian Stolwijk
Arian Stolwijk
13 jaar geleden
 
0 +1 -0 -1
@ Eddy
Ik heb bij de toelichting nog wat extra info gezet hoe je het kunt gebruiken.
Lode
Lode
13 jaar geleden
 
0 +1 -0 -1
Iterators zijn onderdeel van de SPL;

Die heeft een heel ander overzicht: http://www.php.net/~helly
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Arian Stolwijk
Arian Stolwijk
13 jaar geleden
 
0 +1 -0 -1
Ik heb even het e.e.a. aangepast.

Het was namelijk zo dat ik hem gebruikte i.c.m. een database, en daar waren niet alle data zo gesorteerd dat eerste de parents kwamen en daarna pas de children.

Daarom heb ik verzonnen dat het element wat je toevoegt als de parent nog niet bestaat, het element nog even tijdelijk wordt opgeslagen in een array, en als de parent van dat element voorbij komt, wordt het element wat nu in die tijdelijke array zat, daaruit gehaald, aan de parent toegevoegd en verwijderd uit de array.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. nested-data-via-dom

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.