29. maj 2007 - 11:26Der er
19 kommentarer og 2 løsninger
Link sortering - en udfordring
Skal lige sige at jeg er nogenlunde nybegynder i PHP men...:
Jeg er ved at lave et mindre admin-system hvor en bruger skal kunne administrere en link-samling. Det vil sige tilføje/redigere/slette links.
MEN...de skal også kunne sortere i links. Forestiller mig at alle links bliver listet og så kommer der op/ned pile ud for dem hvor de så onclick bliver flyttet en tak op eller ned.
Hvordan laver man dette i PHP, når der også skal tages højde for at man kan slette links??
(eks. en linksamling på 10 links...sletter man link 3, skal link 4-10 automatisk rykke en plads frem på listen)
lav et ekstra felt i din database hvor du har en tal værdi der indikere hvad linkets rækkefølge er og så når man klikker på op skal den tage den der har rækkefølge+1 og sætte til samme rækkefølge som den der er klikket på og den der er klikket på til rækkefølge+1
Ja, så langt er jeg også nået i mine overvejelser. Som jeg ser det, er der 2 problemer som jeg ikke umiddelbart er kompetent nok til at løse:
1. Hvordan man får de øvrige (et variabelt antal af links) til at ændre sorteringsværdi. 2. Hvordan man får alle links til at tilpasse deres sorteringsværdi, hvis man sletter et link midt i det hele.
1. Ved op: UPDATE tabel SET sorter=sorter+1 WHERE sorter=(ny sorteringsværdi); UPDATE tabel SET sorter=(ny sorteringsværdi) WHERE id=(id) Ved ned: UPDATE tabel SET sorter=sorter-1 WHERE sorter=(ny sorteringsværdi); UPDATE tabel SET sorter=(ny sorteringsværdi) WHERE id=(id)
2. DELETE tabel WHERE id=(id) UPDATE tabel SET sorter=sorter-1 WHERE sorter>=(slettet sorteringsværdi);
lav en forløbende sorterings værdi og så brug for ned: <?php $result = mysql_query("SELECT * FROM tabel WHERE id='".$_GET['id']."' LIMIT 1") or die(mysql_error()); $row = mysql_fetch_assoc($result); mysql_query("UPDATE tabel SET sortering='".($row['sortering'])."' WHERE sortering='".$row['sortering']-1."' LIMIT 1") or die(mysql_error()); mysql_query("UPDATE tabel SET sortering='".($row['sortering']-1)."' WHERE id='".$_GET['id']."' LIMIT 1") or die(mysql_error()); ?> og for op: <?php $result = mysql_query("SELECT * FROM tabel WHERE id='".$_GET['id']."' LIMIT 1") or die(mysql_error()); $row = mysql_fetch_assoc($result); mysql_query("UPDATE tabel SET sortering='".($row['sortering'])."' WHERE sortering='".$row['sortering']+1."' LIMIT 1") or die(mysql_error()); mysql_query("UPDATE tabel SET sortering='".($row['sortering']+1)."' WHERE id='".$_GET['id']."' LIMIT 1") or die(mysql_error()); ?>
det jeg har gjort er at efter din query hvor du sletter en post så kører denne mysql_query("UPDATE tabel SET sortering=sortering-1 WHERE sortering> ".$row['sortering']."") or die (mysql_error()); // $row['sortering'] er fra den post du lige har slettet så hent den før du sletter den
ahh..ok jeg var ikke lige klar over at den "looper" update-sætningen på den måde i php så. mener nemlig ikke det var sådan man gjorde i asp :) prøver det lige og vender tilbage
det eneste jeg mener er at du skal lave 2 updates for at undgå huller i din sorterings tal række, det nytter ikke noget hvis de får samme tal eller hvis der er huller så den ikke vil ændre rækkefølge når du kører din update
Synes ikke det fungere helt som det skal. Hvis jeg bruger pidgets eksempel virker det slet ikke. Hvis jeg bruger dmdiscos forslag og klikke det nederste element på listen en tand op - ryger den helt op i toppen af listen :-S ... Men det er dog den der virker bedst.
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.