Avatar billede s0mmer Nybegynder
09. oktober 2008 - 20:39 Der er 11 kommentarer og
1 løsning

Ændre menu rækkefølge

Godaften eksperter

Simpelt spørgsmål: Jeg har en række menupunkter order by id fra min SQL. Hvis det skal være muligt at ændre rækkefølgen i browseren, hvad er den umiddelbare nemmeste måde?

+1 på det menupunkt man vælger og -1 på menupunktet+1 ? (Hvis i forstår :))
Avatar billede majbom Novice
09. oktober 2008 - 20:43 #1
rækkefølgen SKAL ændres efter udtrækket?

nogen bestemt rækkefølge? omvendt eller?
Avatar billede olebole Juniormester
09. oktober 2008 - 21:27 #2
<ole>

Noget i denne stil?

<?php
if (isset($_POST["contxt"]) && $_POST["contxt"]=="updateSort") {
    $aShowSort = explode(",", $_POST["showInxes"]);
    for ($i=0,$j=count($aShowSort); $i<$j; $i++) {
        // Opdater rækken med id=$aShowSort[$i]
        // - sæt værdien af feltet 'show_inx' til $i
       
        // Når du senere viser menuen, sorterer du
        // - den på feltet 'show_inx' i query'en
    }
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sorter Menu</title>
<style type="text/css">
ul {
    width: 210px;
}
li {
    position: relative;
}
li span {
    position: absolute;
    right: 2px;
    top: 3px;
}
</style>
<script type="text/JavaScript">
// http://www.eksperten.dk/spm/848491
function moveItem(oPic, bUp) {
    var oLI = oPic.parentNode.parentNode;
    if (bUp && oLI.previousSibling) oLI.parentNode.insertBefore(oLI, oLI.previousSibling);
    else if (!bUp && oLI.nextSibling) oLI.parentNode.insertBefore(oLI, oLI.nextSibling.nextSibling);
}
function saveSort() {
    var aLI = document.getElementById("menu").getElementsByTagName("li");
    var a = [];
    for (var i=0,j=aLI.length; i<j; i++) {
        a[i] = aLI[i].getAttribute("id").split("men_")[1];
    }
    document.getElementsByName("showInxes")[0].value = a.join(",");
}
</script>
</head>
<body>

<form action="" method="post" onsubmit="saveSort(this)">
<input type="hidden" name="showInxes" value="">
<input type="hidden" name="contxt" value="updateSort">
<ul id="menu">
    <li id="men_1">Menupunkt med DB-ID: 1<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_2">Menupunkt med DB-ID: 2<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_3">Menupunkt med DB-ID: 3<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_4">Menupunkt med DB-ID: 4<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_5">Menupunkt med DB-ID: 5<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_6">Menupunkt med DB-ID: 6<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_7">Menupunkt med DB-ID: 7<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
    <li id="men_8">Menupunkt med DB-ID: 8<span><img src="up.png" onclick="moveItem(this,1)" title="Up"><img src="down.png" onclick="moveItem(this)" title="Down"></span></li>
</ul>
<button type="submit">Gem</button>
</form>

</body>
</html>

/mvh
</bole>
Avatar billede olebole Juniormester
09. oktober 2008 - 21:33 #3
Forklaring:

Du skal bruge to små ikoner: 'up.png' og 'down.png', som klikkes, når et menupunkt skal flyttes op eller ned.

li-elementernes id fremkommer ved at sætte 'men_' foran deres id i DB'en.

Hver række i DB'en skal have et ekstra felt 'show_inx', som du sorterer på, når du henter menuen - ligesom du gør nu med feltet 'id'. Det er dette felt, du opdaterer med dokumentet ovenfor (SQL'en må du selv skrive). Default værdien for 'show_inx' kan du bare sætte til 0
Avatar billede s0mmer Nybegynder
09. oktober 2008 - 23:07 #4
olebole > umiddelbart troede jeg at den virkede. men der sker et eller andet.. her er koden:

<?
if (isset($_POST["contxt"]) && $_POST["contxt"]=="updateSort") {
    $aShowSort = explode(",", $_POST["showInxes"]);
    for ($i=0,$j=count($aShowSort); $i<$j; $i++) {
        $db->ExecSQL("UPDATE sp_context SET place = '".$i."' WHERE id='".$aShowSort[$i]."'");

        // Opdater rækken med id=$aShowSort[$i]
        // - sæt værdien af feltet 'show_inx' til $i
       
        // Når du senere viser menuen, sorterer du
        // - den på feltet 'show_inx' i query'en
    }
}

?>

        <form action="" method="post" onsubmit="saveSort(this)">
<input type="hidden" name="showInxes" value="">
<input type="hidden" name="contxt" value="updateSort">
<ul id="menu">

    <?
          for($i=0;$i<count($menupunkter);$i++)

    print_r ("<li id='men_".$menupunkter[$i][3]."'>".$menupunkter[$i][1]."<span><img src='images/up.jpg' onclick='moveItem(this,1)' title='Up'><img src='images/down.jpg' onclick='moveItem(this)' title='Down'></span></li>");
       
      ?>
      </ul><br />
<button type="submit">Opdater menu</button>
</form>



Javascripten er uændret
Avatar billede s0mmer Nybegynder
09. oktober 2008 - 23:08 #5
Derudover er alle pladser 0 under place.. Og id har pt værdier: 1,2,3,11
Avatar billede olebole Juniormester
09. oktober 2008 - 23:51 #6
"men der sker et eller andet.." >> Hvad sker der?
Avatar billede olebole Juniormester
10. oktober 2008 - 00:01 #7
Prøv denne:

<?php
if (isset($_POST["contxt"]) && $_POST["contxt"]=="updateSort") {
    $aShowSort = explode(",", $_POST["showInxes"]);
    for ($i=0,$j=count($aShowSort); $i<$j; $i++) {
        $db->ExecSQL("UPDATE sp_context SET place = '".$i."' WHERE id='".$aShowSort[$i]."'");
        print "UPDATE sp_context SET place = '".$i."' WHERE id='".$aShowSort[$i]."'<br>";
        // Opdater rækken med id=$aShowSort[$i]
        // - sæt værdien af feltet 'show_inx' til $i
       
        // Når du senere viser menuen, sorterer du
        // - den på feltet 'show_inx' i query'en
    }
}
?>

- og se, om du gør, hvad du forventer. Kik også i din kildekode i browseren og tjek, om du skriver ud, hvad du forventer.
Avatar billede olebole Juniormester
10. oktober 2008 - 00:04 #8
Forøvrigt bør du altid bruge 'LIMIT 1' i slutningen af en update query, hvis du ved, det kun er én række, der skal opdateres. Ellers leder MySQL tabellen færdig, for at se, om der skulle være flere rækker, der opfylder WHERE betingelsen - og det er jo overflødige vitaminer at bruge  =)
Avatar billede s0mmer Nybegynder
10. oktober 2008 - 00:49 #9
olebole > mindre fejl i mine id's :) den virker perfekt. mange tak for hjælpen! send svar så får du points..
Avatar billede olebole Juniormester
10. oktober 2008 - 01:17 #10
Hehe ... det var også, hvad min fornemmelseskirtel fortalte mig  ;o)

Det kunne selvfølgelig laves lidt mere 'sexy' med drag'n'drop, men da der formodentlig kun skal flyttes ret få punkter engang imellem, fik du den 'hurtige og beskidte'  ;o)
Avatar billede majbom Novice
10. oktober 2008 - 08:27 #11
aah det var sådan den skulle forståes :)
Avatar billede olebole Juniormester
10. oktober 2008 - 11:10 #12
- ja, jeg måtte også lige vende pandekagen et par gange i luften, før jeg forstod, hvad s0mmer præcis mente  =)
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