Ik heb een tabel met submenu items vanwaaruit het menu op een website wordt gegenereerd. Deze tabel wordt bijgewerkt zodra er nieuwe pagina's worden toegevoegd in het CMS. Alle nieuwe pagina's komen dus in een submenu. Tot zover geen probleem.
Mijn probleem zit hem in het ordenen van de submenuitems. Natuurlijk kan ik met ORDER BY "gewijzigd" of iets dergelijks werken. Maar ik wil echter dat de gebruiker kan bepalen op welke positie in het submenu een item komt. Heeft iemand een idee hoe ik dit het beste kan realiseren?
Even een vraag ter verduidelijking: wil je dat elk item afzonderlijk een positie kan krijgen of dat de gebruiker de wijze waarop gesorteerd wordt aan kan passen?
Je wilt dus dat elke gebruiker de volgorde van elk item in het submenu kan bepalen.
Je moet dus per gebruiker voor elk item een index opslaan en bij het ophalen sorteren op die index.
Ter illustratie:
Mitch - Menuitem 1 - Index 2
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 1
Geeft als menu voor Mitch:
Menuitem 2, Menuiutem 3, Menuitem 1.
Voorbeeld aan de hand van mijn eerdere voorbeeld.
Stel je wilt Menuitem 4 tussen 2 en 3 plaatsen. 2 blijft dan op z'n plek, daarna komt met index 1 Menuitem 4 en voor elk item dat daarna komt verhoog je de index met 1.
Mitch - Menuitem 1 - Index 2
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 1
wordt =>
Mitch - Menuitem 1 - Index 2+1 = 3
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 1+1 = 2
Mitch - Menuitem 4 - Index 1
Duidelijk, met 2 queries kan ik de INSERT dus voor elkaar krijgen. Nou is het ook de bedoeling dat de positie (Index in het voorbeeld) met een (of meer) UPDATE query(s) gewijzigd kan worden.
Ik wil bijvoorbeeld Menuitem 4 als laatste (Index 3) in het menu:
Mitch - Menuitem 1 - Index 3-1 =2
Mitch - Menuitem 2 - Index 0
Mitch - Menuitem 3 - Index 2-1 = 1
Mitch - Menuitem 4 - Index 3
Of Menuitem 1 als eerste:
Mitch - Menuitem 1 - Index 0
Mitch - Menuitem 2 - Index 0+1 = 1
Mitch - Menuitem 3 - Index 2+1 = 3
Mitch - Menuitem 4 - Index 1+1 = 2
Hoe ga ik dat voor elkaar krijgen met 1 of meer queries?
1. Je wilt een nieuw item toevoegen.
Als je een nieuw item toevoegt op plaats Y, moet je alle indices >= Y met 1 verhogen.
2. Je wilt een item naar boven (een lagere index) verplaatsen.
Eerst doe je een boundary test. Een item met index 0 kan gewoon niet lager.
Alle indices >=Y èn <X doe je +1 en verander je X naar Y.
3. Je wilt een item naar beneden (een hogere index) verplaatsen.
Ook hier wellicht een boundary test. Er zit vast wel een limiet aan 't menu?
Alle indices >X èn <=Y doe je -1 en verander je X naar Y.