Modified Preorder Tree Traversal Case Study
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.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
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.
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 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.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
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).
Quote:
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.
Edit:
Quote:
Ik kan namelijk de root verwijderen...
En andere niet-leafs.
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.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
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.