[PHP] Uitklappen menu items

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Hmm..volgens mij doe ik het veel te moeilijk, maar ik kom er niet uit :/

Ik heb dus een Mambo-database met daarin menu items. Elk item heeft een parent. De items waarvan parent==0 zijn de hoofdmenu-items en verschijnen in een horizontale balk daarboven. De items waarvan parent!=0 verschijnen, al naar gelang hun parent, in een menu links. Nu kunnen die linker menu items ook children hebben (1 niveau). Ik heb dus 3 lagen.
Het ID van het gekozen menu-item wordt altijd meegegeven via een $_GET structuur.

Dus, om het even makkelijk te maken:
niveau1: Hoofdmenu
niveau2: Linkermenu - hoofditems
niveau3: Linkermenu - Subitems

Nu was het geen probleem om de hele structuur te laten zien aan de linker kant, afhankelijk van het hoofdmenu item, maar ik wil dat ie alle niveau2 items laat zien behorende bij een hoofdmenu en als ik dan op zo'n item klik dat ie dan de subitems laat zien. Als ik vervolgens op zo'n subitem klik moet ie uiteraard de content laten zien, maar ook de uitgeklapte structuur met zichzelf erin. Logisch uiteraard.

Nu is het niet moeilijk om de boom uit te laten klappen als je op een niveau1-item klikt. Ik heb alle items in een array $items staan:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
showItems(getUpperItem($Typeid), $items, 0);

function showItems($pid, $items, $level) {
 foreach($items as $item) {
   if($item['parent']==$pid) {
      echo "Menuitem bla, level $level";
      showItems($item['id'], $items, $level+1);
   }
 }
}

function getUpperItem($id) {
  //functie geeft bovenste menuitem terug
}


$Typeid is het id van het menuitem dat ie via de $_GET structuur krijgt.

Maar op één of andere manier krijg ik het niet voor elkaar om ook zo'n soort iteratieve manier toe te passen voor mijn probleem. Wat ik moet doen volgens mij:
- Eerst achterhalen wat het niveau1-item is aan de hand van $Typeid(geen probleem, werkt goed).
- Vervolgens één voor één de menu-items van niveau 2 printen aan de linkerkant
- Een check in bouwen om te controleren of het huidige item dat geprint wordt geselecteerd is óf dat het huidige item een child heeft die geselecteerd is.
- Zoja, toon de children.

Maar...naar mijn weten maak ik geen denkfout. Alleen heb ik nu al 10 verschillende controlestructuren verzonnen en elke keer lukt het net niet (klapt ie niet uit, klappen ze allemaal uit) of een CGI error, wat volgens mij echt rampzalig is. Is dit eigenlijk wel met een iteratieve functie te doen?

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

kleine schop in de juiste richting, je bent nu wel bezig met $pid (parent id) maar niet met $level (die je dus eigenlijk wil hebben)

Doe daar eens wat mee zou ik zeggen ;)

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Probeer het eens als volgt:

Bepaal het pad van je geselecteerde item naar de root. Sla dit op in een array.
Geef deze selectie van items door naar je showItems, ipv parentid.
Als de parent null is, of voorkomt in deze array en ook nog voldoet aan het level dat je wil tonen, dan moet je het item weergeven.
Vervolgens kijk je of het id van het huidige item voorkomt in je array, zo ja, dan roep je het showItems voor het volgende level aan.

Volgens mij kom je dan al aardig in de richting. Het voordeel is dat mocht je meer levels willen gaan ondersteunen, dan hoef je aan showItems niets meer te doen. En mocht je het mogelijk willen maken om meerdere nodes opengeklapt te houden, dan vergt dat ook minder aanpassing.

edit:
Verduidelijkingetjes toegevoegd.

offtopic:
Je bent zowel iteratief als recursief bezig, je functie is recursief, niet iteratief ;)

[ Voor 41% gewijzigd door bigbeng op 13-03-2006 13:20 ]


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Okee, bedankt voor de goede tips. Ik gebruikte $level alleen om in te springen :P Bedankt voor de tips, ik ga er vanavond nog eens naar kijken.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Ik heb ooit een module voor Mambo geschreven die een list maakt van de navigatie (om een SuckerFish menu te maken). Deze kun je hier downloaden en eens bekijken. Staat wat documentatie in de code zelf die de logica beschrijft. Misschien helpt dat je verder.

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
@Bigbeng:
Ik heb nu even naar jouw manier gekeken en ik heb hem in 5 min. geimplementeerd! :*)
Dankjewel, hij werkt perfect.

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1