Hallo iedereen,

Ik ben bezig met een klein CMS'je. Ik wil gebruikers de mogelijkheid geven de volgorde van pagina's in het menu te wijzigen.

Ik heb deze tabel (versimpeld):

navitems
- id
- title
- sequence

In het overzicht van alle pagina's staan 2 pijltjes bij iedere pagina: omhoog en omlaag.

Nu weet ik alleen niet hoe ik het werkend krijg aangezien het volgende gebeurd:

- Een nieuwe pagina begint standaard met sequence (volgorde) = 0
- Bij het klikken op omhoog heb ik squence - 1 gedaan (het menu doet ORDER BY squence ASC), en bij omlaag dus + 1

Bij het klikken op omhoog komt de pagina helemaal bovenaan te staan aangezien de sequence meteen lager is dan die met 0 of een ander getal. Bij andere pagina
s moet de volgorde dus ook veranderd worden. Zonder dat de al eerder opgeslagen volgorde gereset wordt.

Ik hoop dat het duidelijk is. Zou iemand weten hoe ik dit op kan lossen?

Maurice
wat je dan krijgt is natuurlijk dat er twee menu items kunnen zijn met dezelfde sequence. maar hoe je dit moet oplossen... heel dirty, maar ik zou beginnen door gewoon de hele tabel te droppen, en bij iedere wijziging opnieuw te vullen.
Jeroen vd op 03/06/2012 13:49:04

wat je dan krijgt is natuurlijk dat er twee menu items kunnen zijn met dezelfde sequence. maar hoe je dit moet oplossen... heel dirty, maar ik zou beginnen door gewoon de hele tabel te droppen, en bij iedere wijziging opnieuw te vullen.


Maar dan vergeet hij de volgorde die de vorige keer was ingesteld?
die is toch al op de pagina, hoe kan de gebruiker die dan veranderen?

je haalt de boel op. je laat de gebruiker iets aanpassen. verwijder de inhoud van de tabel. vul m opnieuw met de nieuwe gegevens.

zoals ik al zei, heel erg dirty.
Volgens mij snap ik het niet :X

Hier in ieder geval nog wat voor de duidelijkheid:

HTML Tabel op CMS-pagina:

# | Titel | Volgorde

2 | Twee | up / down
3 | Drie | up / down
4 | Vier | up / down

In DB:

id | title| sequence

2 | Twee | 0
3 | Drie | 0
4 | Vier | 0

De gebruiker klikt op UP bij id = 4
Dus bij 4 --> 0 - 1 = -1

HTML wordt:

# | Titel | Volgorde

4 | Vier | up / down
2 | Twee | up / down
3 | Drie | up / down
Je hoeft natuurlijk niet je hele tabel leeg te gooien, het enige wat je hoeft te doen is het sequence veld aan te passen. Dus zodra de gebruiker klaar is met zijn aanpassingen lees je de nieuwe volgorde uit en pas je elk record in de database aan. Als je het slim doet hoef je alleen de aangepaste menu items aan te passen. Het is echter wel een query voor elke aanpassing, je draait mogelijk dus wel een groot aantal queries.
Erwin H op 03/06/2012 14:09:45

Je hoeft natuurlijk niet je hele tabel leeg te gooien, het enige wat je hoeft te doen is het sequence veld aan te passen. Dus zodra de gebruiker klaar is met zijn aanpassingen lees je de nieuwe volgorde uit en pas je elk record in de database aan. Als je het slim doet hoef je alleen de aangepaste menu items aan te passen. Het is echter wel een query voor elke aanpassing, je draait mogelijk dus wel een groot aantal queries.


Ahaa oke! Maar hoe lees ik die nieuwe volgorde uit? Ik heb genoeg verstand van PHP maar het inzicht is soms echt ver te zoeken..
Of je maakt een positions tabel:


PS: Ben totaal geen expert hierin, dus ik weet echt niet of dit goed of fout is.
@Wouter, waarom zou je in godsnaam position afsplitsen van navigation
Afhankelijk van de hoeveelheid pagina's in je menu is het dus de vraag wat sneller is kwa querytijd. Danwel hele tabel opnieuw vullen, danwel alleen de aangepaste items een update geven. Persoonlijk zou ik voor het laatste gaan.
Ik gebruik deze code:


<?php
if(isset($_GET['omhoog']) && isset($_GET['volgorde'])){
	mysql_query("UPDATE categorieen SET volgorde = volgorde +1 WHERE volgorde = ".mysql_real_escape_string($_GET['volgorde']));
	mysql_query("UPDATE categorieen SET volgorde = volgorde -1 WHERE id = ".mysql_real_escape_string($_GET['omhoog']));
}elseif(isset($_GET['omlaag']) && isset($_GET['volgorde'])){
	mysql_query("UPDATE categorieen SET volgorde = volgorde -1 WHERE volgorde = ".mysql_real_escape_string($_GET['volgorde']));
	mysql_query("UPDATE categorieen SET volgorde = volgorde +1 WHERE id = ".mysql_real_escape_string($_GET['omlaag'])); 
	}
?>

<a title="Omhoog" href="?omhoog=<?php echo $row['id'];?>&volgorde=<?php echo $row['volgorde']-1;?>">Onhoog</a> 
<a title="Omlaag" href="?omlaag=<?php echo $row['id'];?>&volgorde=<?php echo $row['volgorde']+1;?>">Omlaag</a>

Reageren