Avatar billede sesam Nybegynder
09. august 2005 - 18:58 Der er 24 kommentarer og
1 løsning

Sortere i menu fra DB

Hej,
laver min menu dymanisk fra min MySQL DB.
Fx.
PROFIL
  om os
  her bor vi
  kontakt
PRODUKTER
...

Jeg kunne godt tænke mig at vide hvordan jeg i min admin del kan sortere disse menu punkter:

  om os
  her bor vi
  kontakt

Altså rykke op & rykke ned...

Hvordan er fremgangsmåden?
Er det muligt at sige at menu punkt 1 ikke kan rykkes op og
tilsvarende at sidste menupunkt ikke kan rykkes ned?
Avatar billede nielle Nybegynder
09. august 2005 - 19:03 #1
For det første skal du have et storteringsfelt med i din menu tabel. Dette angiver i hviken række tingene skal vises i. Du bruger så

... ORDER BY sorting

- når du trækker ud.
Avatar billede sesam Nybegynder
09. august 2005 - 19:05 #2
Ja det har jeg...
Avatar billede nielle Nybegynder
09. august 2005 - 19:05 #3
For det andet skal du så i din admindel kunne rette i sorteringen.

Lad os antage at dine rækker ligger sådan her:

MenuText, sorting
=================
om os, 1
her bor vi, 2
kontakt, 3

- og du gerne vil have ombyttet "her bor vi" med "kontakt" så skal du kunne ændre 2-tallet til et 3-tal og omvendt.
Avatar billede nielle Nybegynder
09. august 2005 - 19:07 #4
Problemet er at hvis du først updater 2 til at være 3 så har du pludselig 2 3-taller og så går det galt.

Løsningen på dette er at først opdatere 2 til noget som ikke forekommer på forhånd, f.eks. -1, derefter omdøbe 3 til 2m og så tilsidst omdøbe -1 til 3.
Avatar billede nielle Nybegynder
09. august 2005 - 19:08 #5
Dette kunne se sådan her ud:

UPDATE menuTabel SET sorting=-1 WHERE sorting=2
UPDATE menuTabel SET sorting=2 WHERE sorting=3
UPDATE menuTabel SET sorting=3 WHERE sorting=-1
Avatar billede nielle Nybegynder
09. august 2005 - 19:09 #6
Alt dette skal selvfølgeligt pakkes pænt ind i din admin-del, men det er da selve kernen i løsningen.
Avatar billede sesam Nybegynder
09. august 2005 - 19:10 #7
Det var også min tanke, men det kunne jo være der var en "nemmere" måde at gøre det på...
Men hvordan løser jeg så det med:
Er det muligt at sige at menu punkt 1 ikke kan rykkes op og
tilsvarende at sidste menupunkt ikke kan rykkes ned?
Avatar billede nielle Nybegynder
09. august 2005 - 19:18 #8
Det er da rimeligt nemt som det er beskrevet.

Hvsi du ikke vil kunne rykke første punkt op (forståligt), så er trivket først at spørge om min og maks værdierene for sorting:

SELECT min(sorting) AS minimum, max(sorting) AS maximum FROM menuTabel

Disse to tal sammenligner du med det sorting på det id som man ønsker at flytte; Hvis dette er lig med minimum så tillader du ikke "flyt op" og hvis det er lig med maksimum så tillader du på tilsvarende vis tilsvarende ikke "flyt ned".
Avatar billede sesam Nybegynder
09. august 2005 - 19:22 #9
Ja absolut det er nemt ;O) det var også ment sådan...

Den sidste du kom med det kræver måske lige lidt mere forklaring... ;O)
Avatar billede nielle Nybegynder
09. august 2005 - 19:28 #10
S' gerne:

Du laver førest et SQL-kald:

SELECT min(sorting) AS minimum, max(sorting) AS maximum FROM menuTabel

Dette giver dig to tal, minimum og maksimum, for værdierne af sorting.

Dernæst tager du det id, f.eks. 42, som du tænker på at flytte (op eller ned). For dette laver du så et SQL kald for at finde ud af hvad sorting-værdien er for dette:

SELECT sorting WHERE id=42

Hvis så denne sorting-værdi er lig med minimum, så giver du ikke brugeren noget menupunkt for "flyt op". Og hvis den er lig med maksimum, så har du heller ikke noget "flyt ned" punkt. Hvis det ligger imellem de to yderpunkter, så har du selvfølgelig både en "flyt op" og en "flyt ned".
Avatar billede nielle Nybegynder
09. august 2005 - 20:49 #11
Du blev så tavs?
Avatar billede sesam Nybegynder
10. august 2005 - 08:01 #12
haha nej jeg fundere bare over hvordan jeg skal gribe det an... sidder lige og tester lidt ;O)
Avatar billede nielle Nybegynder
10. august 2005 - 18:38 #13
Jamen, spørg endeligt hvis der er knas med at få det til at virke. :^)
Avatar billede sesam Nybegynder
10. august 2005 - 21:59 #14
Ja kan godt få det til at virke men glemte lige en ret vigtig detalje ;(
Min menu har uendelige undermenu punkter... Altså:
Menu1
  '>Undermenu1
          '>Undermenu2
                '>Undermenu3
Osv....
Når jeg flytter et menu punkt skal de underliggende punkter selvfølgelig følge med...
Hvordan klarer jeg den?

Min tabel ser sådan her ud:
page_id | parent_id | page_name | page_content

så kan du garanteret gætte dig til resten...
Avatar billede nielle Nybegynder
10. august 2005 - 22:58 #15
Da alt det ovenstående kode jo ikke ændre på id eller parent_id, men kun på sorting, så burde dette ikke give problemer.
Avatar billede nielle Nybegynder
10. august 2005 - 22:59 #16
Hvis din atbel ser sådan der ud:

page_id | parent_id | page_name | page_content

- så har du jo ikke noget sorting-felt. Det er du nødt til at have.
Avatar billede sesam Nybegynder
11. august 2005 - 08:17 #17
Ja ok nu har jeg fattet det.... ;O)
Avatar billede nielle Nybegynder
11. august 2005 - 18:06 #18
Cool. Har du så også fået det til at fungere?
Avatar billede sesam Nybegynder
12. august 2005 - 10:20 #19
Nu er jeg bare stødt på endnu et problem.

eks.
Menu1
'>Undermenu1 sort = 1
'>Undermenu2 sort = 2
'>Undermenu3 sort = 3

Hvis jeg sletter side 2 så opstår der et problem når jeg så opretter en ny side.
Den nye side skal i realiteten ha: sort = 4 da undermenu 3 jo har sort = 3
Men hvis jeg så efterfølgende vil flytte undermenu 3 så mangler sort 2 og siden forbliver på sin plads, og den nye side har jo stadigvæk sort = 4

så ser menuen sådan her ud:

Menu1
'>Undermenu1 sort = 1
'>Undermenu2 sort = 2
'>Undermenu3 sort = 4

Forstår du problemet?
Avatar billede nielle Nybegynder
12. august 2005 - 11:29 #20
I mine oprindelige kode-stumper så gør det faktisk ikke noget at der er huller i sorteringsrækkefølgen. Men jeg kan jo gætte at du ikke gør det helt på den måde. ;^)

Løsningen på dit problem er at du, når du sletter et menupunkt, også fjerner hullet (vi kunne jo kalde det ”at defragmentere sorteringen” ;^):

$SQL = "SELECT page_id FROM dinMenuTabel WHERE parent_id=" . parent_id . " ORDER BY sorting";
$result = mysql_query($SQL);

$nySorting = 0;
while ($row = mysql_fetch_assoc($result))
{
    $nySorting++;
    $SQL2 = "UPDATE dinMenuTabel SET sorting=" . $nySorting . " WHERE page_id=" . page_id;
    mysql_query($SQL2);
}
Avatar billede nielle Nybegynder
16. august 2005 - 19:00 #21
Har du fået kigget på det?
Avatar billede nielle Nybegynder
26. august 2005 - 09:58 #22
?
Avatar billede sesam Nybegynder
29. august 2005 - 08:41 #23
Jeg er lige vendt hjem fra ferie, så derfor svarer jeg først nu...
Det virker fint mange tak for hjælpen...
Gider du smide et svar... ;O)
Avatar billede nielle Nybegynder
29. august 2005 - 08:54 #24
Ferie har vi jo alle ret til - selv har jeg heldigvis en lille uge tilbage :^)

... og et svar :^)
Avatar billede sesam Nybegynder
29. august 2005 - 09:04 #25
Så må du ha' god ferie når den tid kommer ;O)
Og endnu en gang tak for hjælpen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester