Opslaan volgorde pagina's menu (sql)
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?
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.
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
Gewijzigd op 03/06/2012 14:04:56 door P-ter AA
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..
@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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?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>
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>
Gewijzigd op 03/06/2012 14:18:35 door Nick Dijkstra
Jurgen B op 03/06/2012 14:15:56:
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.
Maar dan krijg ik toch wat ik nu al heb? Dan klopt er niets van toch?
Nick Dijkstra op 03/06/2012 14:18:00:
Ik gebruik deze code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?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>
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>
Dit had ik eerst ook inderdaad, maar dit werkt toch alleen voor 2 pagina's? Zodra er meer dan 2 pagina's komen klopt het niet meer. Dan krijgen pagina's dezelfde 'volgorde'.
Wat doe je op het moment dat een gebruiker op een 'omhoog' of 'omlaag' knop klikt? Herlaad je dan de pagina, of los je het in de browser op met javascript?
Toevoeging op 03/06/2012 14:34:27:
Erwin H op 03/06/2012 14:30:50:
Wat doe je op het moment dat een gebruiker op een 'omhoog' of 'omlaag' knop klikt? Herlaad je dan de pagina, of los je het in de browser op met javascript?
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Nick Dijkstra op 03/06/2012 14:31:29:
Nee, heb ik geen last van. Ik laat de omhoog-knop niet zijn bij de 1ste en de omlaag-knop niet bij de laatste. Dan werkt het gewoon goed.
Toevoeging op 03/06/2012 14:34:27:
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Toevoeging op 03/06/2012 14:34:27:
Erwin H op 03/06/2012 14:30:50:
Wat doe je op het moment dat een gebruiker op een 'omhoog' of 'omlaag' knop klikt? Herlaad je dan de pagina, of los je het in de browser op met javascript?
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Het werkt inderdaad, maar alleen als er al een volgorde is. Dus bij het aanmaken van een nieuwe pagina moet ik hem dus al een sequence geven i.p.v. 0. Moet ik dan gewoon de hoogste sequence pakken + 1? (in jouw menu -1 aangezien je ws DESC gebruikt bij order)
Maurice vB op 03/06/2012 14:43:46:
Het werkt inderdaad, maar alleen als er al een volgorde is. Dus bij het aanmaken van een nieuwe pagina moet ik hem dus al een sequence geven i.p.v. 0. Moet ik dan gewoon de hoogste sequence pakken + 1? (in jouw menu -1 aangezien je ws DESC gebruikt bij order)
Nick Dijkstra op 03/06/2012 14:31:29:
Nee, heb ik geen last van. Ik laat de omhoog-knop niet zijn bij de 1ste en de omlaag-knop niet bij de laatste. Dan werkt het gewoon goed.
Toevoeging op 03/06/2012 14:34:27:
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Toevoeging op 03/06/2012 14:34:27:
Erwin H op 03/06/2012 14:30:50:
Wat doe je op het moment dat een gebruiker op een 'omhoog' of 'omlaag' knop klikt? Herlaad je dan de pagina, of los je het in de browser op met javascript?
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Het werkt inderdaad, maar alleen als er al een volgorde is. Dus bij het aanmaken van een nieuwe pagina moet ik hem dus al een sequence geven i.p.v. 0. Moet ik dan gewoon de hoogste sequence pakken + 1? (in jouw menu -1 aangezien je ws DESC gebruikt bij order)
Ja, precies.
Nick Dijkstra op 03/06/2012 15:27:06:
Ja, precies.
Maurice vB op 03/06/2012 14:43:46:
Het werkt inderdaad, maar alleen als er al een volgorde is. Dus bij het aanmaken van een nieuwe pagina moet ik hem dus al een sequence geven i.p.v. 0. Moet ik dan gewoon de hoogste sequence pakken + 1? (in jouw menu -1 aangezien je ws DESC gebruikt bij order)
Nick Dijkstra op 03/06/2012 14:31:29:
Nee, heb ik geen last van. Ik laat de omhoog-knop niet zijn bij de 1ste en de omlaag-knop niet bij de laatste. Dan werkt het gewoon goed.
Toevoeging op 03/06/2012 14:34:27:
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Toevoeging op 03/06/2012 14:34:27:
Erwin H op 03/06/2012 14:30:50:
Wat doe je op het moment dat een gebruiker op een 'omhoog' of 'omlaag' knop klikt? Herlaad je dan de pagina, of los je het in de browser op met javascript?
De pagina wordt bij mij dan opnieuw geladen. Maar kan ook opgelost worden mbv Javascript
Het werkt inderdaad, maar alleen als er al een volgorde is. Dus bij het aanmaken van een nieuwe pagina moet ik hem dus al een sequence geven i.p.v. 0. Moet ik dan gewoon de hoogste sequence pakken + 1? (in jouw menu -1 aangezien je ws DESC gebruikt bij order)
Ja, precies.
Het is gelukt dankjewel!