PHP vrienden,

kunnen jullie even testen? Ik ben intussen een beetje code-blind geworden ...
Eventuele fouten/verbeteringen graag melden ;-)

http://www.jankoehoorn.nl/hierarchicalmenu/index.php

Bedoeling: een CSS menu, drie niveau's diep. Moet in een CMS terecht komen.

p.s. het zou kunnen dat hij gek gaat doen als we allemaal tegelijk gaan testen. Normaal gesproken is er slechts 1 persoon mee aan het sleutelen natuurlijk.
Het ziet er goed uit.
Alle lft en rgt waarden veranderen mooi wanneer je iets verwijderd.
Het enige wat ik kan bedenken wat je misschien nog wilt doen (als je er geen reden voor kan bedenken dus niet) is het volgende:
Nog een column maken genaamd "level" of "parent_id" of iets dergelijks wat je kunt gebruiken om ALLEEN de children te selecteren, niet alle descendants.
Zoals het nu is kun je alleen menu-items verwijderen die geen children hebben. De nummering in dit systeem verloopt zo:



Je begint hij het top-level item aan de linkerkant.

1) heeft hij een child, dan ga je omlaag
2) heeft hij geen child, dan ga je naar rechts
3) kun je niet naar rechts dan ga je omhoog

Je kunt dus simpel controleren of een item geen children heeft, want dan is de waarde van lft maar 1 minder dan die van rgt. (Ik gebruik geen "left" en "right", want dat zijn reserved words in MySQL)

Mijn tabel ziet er zo uit:
id | title | parent_id | lft | rgt

Alleen children selecteren is gemakkelijk op deze manier: je neem alle item waarvan de waarden van lft en rgt tussen de waarde van lft en rgt van de parent liggen.

Een item wissen is al iets moeilijker. Je moet eerst checken of er geen children zijn. Vervolgens alle lft's die groter zijn dan de lft van het verwijderde item met 2 verlagen, en ook zo voor de rgt's.

Todo: een item toevoegen implementeren.
Ik heb hier vroeger nog een hoop mee gedaan.

Ik heb nog een MySQL stored procedures voor dingen als
alle subnodes selecteren
het pad van de node tot root
...
inserten als child van een node
drag-drop van een tak naar een andere node
...

Als je iets nodig hebt, mag je me pm'en.


O ja, trouwens: het werkt echt wel perfect en het is zeer handig. Eens je het systeem door hebt, speel je er mee.
Ik ben bekend met het sitepoint artikel.
Ik nam aan dat je alleen de velden 'id' , 'title', 'lft' en 'rgt' had, meer stonden er niet in de tabel (id is zo goed als een must have).

Zoals het nu is kun je alleen menu-items verwijderen die geen children hebben

Zolang je niet gaat spelen met de values in de option tags ben ik het met je eens.
Ik kan namelijk de root verwijderen...
En andere niet-leafs.
Die drag en drop van de ene tak naar de andere klinkt interessant. De rest lukt al wel.

Edit:

Ik kan namelijk de root verwijderen...
En andere niet-leafs.

Zoals gezegd, dit script is bedoeld voor in een CMS. Ik mag aannemen dat een klant er niet op uit is zijn eigen menustructuur om zeep te helpen.
Ga altijd uit van het ergste?

Je zei zelf al dat het controleren simpel is, waarom dan geen controle?
Oké, probeer nog een de root te verwijderen? En als het lukt, graag je methode?
Ik kan ondertussen alleen nog maar leafs verwijderen =] (dus het werkt nu goed)
Oké, bedankt voor de tip.

Reageren