[Db <--> Oo] Een menusysteem volgens DOM

Pagina: 1
Acties:
  • 524 views sinds 30-01-2008
  • Reageer

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
In PHP/MySQL ben ik een menusysteem aan het bouwen. Ieder menuitem is een zgn. node-object in PHP, met bekende DOM-properties/methods als parentNode, childNodes, appendChild etc.

Dit node-object schrijft de boomstructuur weg in de volgende tabel:

code:
1
2
3
integer nodeId 
integer parentNodeId
integer order


Waarin nodeId = het ID van de node (er is ook nog een tabel node, met daarin gegevens over de node), parentNodeId is de...juist... en order is het volgnummer van deze node t.o.v. zijn broertjes en zusjes.

Bijv. de volgende boomstructuur, waarin de getallen nodeId's zijn:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1---+
|   |    
|   +-- 5 (parentNode=1, order=1)
|   |    
|   +-- 6 (parentNode=1, order=2)
|
2---+
|   |    
|   +-- 10 (parentNode=2, order=1)
|   |    
|   +-- 9 (parentNode=2, order=2)
|   |    
|   +-- 3 (parentNode=2, order=3)


Je kunt dan een node instantieren met:

PHP:
1
2
3
4
5
6
7
$oNode = new node(2); //pak node 2

$aoChildNodes = $oNode->getChildNodes();

print_r($aoChildNodes[0]); //print node 10
print_r($aoChildNodes[1]); //print node 9
print_r($aoChildNodes[2]); //print node 3


Maar nu komt het probleem: ik wil dat nodes op meerdere plekken in de tree kunnen verschijnen, bijv.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1---+
|   |    
|   +-- 6 
|   |    
|   +-- 5 
|
2---+
|   |    
|   +-- 10
|   |    
|   +-- 9 
|   |    
|   +-- 5


Als ik nu echter een object van node 5 maak, weet PHP niet welke van de twee (het kind van node 1 of het kind van node 2) hij moet nemen in de database! Hierdoor werken functies als getPreviousSibling niet meer, want volgens de database kan dit zowel node 9 als node 6 zijn.

Wat moet ik veranderen aan mijn opzet?

[ Voor 3% gewijzigd door Rekcor op 26-06-2007 13:33 . Reden: typo ]


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 25-11 23:28
Ik denk dat het het beste is om nog een extra tabel te maken waarin je de pagina's zelf zet.

In je 'tree tabel' zet je dan i.p.v. de content van de pagina enkel een verwijzing naar het pagina id.

Iedere node in de tree heeft van dus zijn eigen ID, en verwijst naar een pagina. Iedere pagina kan dus meerdere inkomende verwijzingen hebben.

(Qua onderhoudbaarheid aan de interfacekant zal het trouwens nog wel een uitdaging worden ;))

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1---+ 
|   |    
|   +-- 5 (parentNode=1, order=1, pageid = 3)  <-- allebei pageid 3
|   |    
|   +-- 6 (parentNode=1, order=2, pageid = 6)
|
2---+ 
|   |    
|   +-- 10 (parentNode=2, order=1, pageid = 10)
|   |    
|   +-- 9 (parentNode=2, order=2, pageid = 9)
|   |    
|   +-- 3 (parentNode=2, order=3, pageid = 3)  <--- allebei pageid 3

[ Voor 29% gewijzigd door Flard op 26-06-2007 13:44 ]


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Oke, je schuift er dus een laag tussen. Iedere node is uniek, maar verschillende nodes verwijzen naar dezelfde content. Slim! _/-\o_

Ik blijf dat lastig vinden: de relatie tussen objecten en tabellen/gegevens in je db.

[ Voor 25% gewijzigd door Rekcor op 26-06-2007 13:52 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

met bekende DOM-properties/methods
Als je op zoek bent naar informatie dan is het handig wanneer je de beestjes bij de juiste naam kunt noemen. De datastructuur die je hier aan het maken bent heet een tree. Het heeft dus eigenlijk weinig met DOM te maken (een hond is wel een dier, maar een dier is geen hond.). Een tree heeft inderdaad nodes waarvan 1 node de root. Deze node heeft geen parent. Alle andere nodes hebben 1 parent en 0 of meer children. Alleen de leafs hebben geen children.

Maar goed, mbt je probleem. Ik zou inderdaad ook een tussenlaag er tussen zetten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10 13:03
Janoz schreef op dinsdag 26 juni 2007 @ 13:56:
[...]

Als je op zoek bent naar informatie dan is het handig wanneer je de beestjes bij de juiste naam kunt noemen. De datastructuur die je hier aan het maken bent heet een tree. Het heeft dus eigenlijk weinig met DOM te maken (een hond is wel een dier, maar een dier is geen hond.).
Ok, maar in feite gedraagt mijn structuur zich straks wel als een DOM. Zo kun je e.e.a. ook exporteren naar xml. Maar goed, nu zit ik proberen mijn gelijk te halen, i.p.v. je te bedanken voor je nuttige tip :). Top!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

nu zit ik proberen mijn gelijk te halen
Inderdaad ;). Je loopt hard te beweren dat een hond een kat is omdat ze allebei een staart en 4 poten hebben terwijl ik zeg dat het allebei zoogdieren zijn ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 25-11 23:28
Het Document Object Model is een manier om een document weer te kunnen geven. Het bestaat uit de gedachte dat een document bestaat uit verschillende objecten (header, body), die vervolgens weer bestaan uit objecten, die weer bestaan uit objecten, enz.
Dit is een boomstructuur, maar er zijn veel meer voorbeelden van boomstructuren. Ik denk dat jouw geval ook geen DOM is, het heeft namelijk niks met de opmaak van een pagina (document) te maken, maar meer met de gehele site.

Je kunt dus wel zeggen dat je een hond aan het maken bent, omdat het vier benen en een staart heeft, maar eigenlijk maak je een kat. Het zijn wel allebei dieren ;)
Pagina: 1