Wiki - JavaScript / VBScript - Tri Drag and Drop dans une liste dynamique
     Tri Drag and Drop dans une liste dynamique

Plateforme : PHP / Ajax / JVS / MySQL
Détails : Permet le tri d'une liste dynamique par Drag and Drop sans rechargement 

Pré requis ?

Il existe plusieurs script sur le web qui propose du drag and drop, j'ai fait le tour de tout ces scripts, et il y en a un qui sort du lot qui est très puissant, et en plus de cela très simple à utiliser.
Pour réaliser ce script vous aurez besoin de Jquery, c'est un framework Javascript qui permet de simplifier l'utilisation de javascript. Pour le télécharger rendez vous sur : http://www.jquery.com/
On utilisera aussi un plugin Jquery nommé interface que vous trouverez ici : http://interface.eyecon.ro/download


Comment utiliser JQuery et Interface pour une liste ?

Après avoir téléchargé les 2 fichiers JS, vous devez les intégrer dans votre projet.
Pour cela rien de plus simple, dans votre header de votre page tapez ceci :

<head>

<!-- Importation JQuery et Interface.js -->
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/interface.js"></script>

<!-- Styles de votre liste -->       
<style type="text/css" media="all">

    .sortable_item {
        cursor : move;
        width : 100%;
        list-style : none;
    }
   
    .ul_style {
       
          list-style-type : none;
          margin : 0;
          padding : 0;
    }
   
</style>

</head>


Comment utiliser le drag & drop pour trier une liste ?

Après avoir importé Jquery et Interface dans votre entête HTML vous pouvez commencer à créer votre liste de tri.
Voici comment procéder :
<body>

<!-- ici ce trouve votre liste -->

<ul id="sortlist" class="ul_style">
 
    <li id="votre_id_1" class="sortable_item">item 1</li>
    <li id="votre_id_2" class="sortable_item">item 2</li>
    <li id="votre_id_3" class="sortable_item">item 3</li>
    <li id="votre_id_4" class="sortable_item">item 4</li>
   
</ul>


<!-- ce script java est à intégrer juste avant votre balise </body> -->

<script type="text/javascript">

    $(document).ready (
        function() {
            $( "#sortlist" ).Sortable( {
            accept : 'sortable_item',
            axis : 'vertically',
            opacity : 0.6,
            onchange : function ( sorted ) {
            serial = $.SortSerialize( 'sortlist' );
            }
        });
    });

</script>

</body>


Remarque :
Ici les listes ne contiennent que du texte.
On peut bien sur intégrer des images et autres comme élément de liste.

Voici ci dessous le résultat obtenu :





Quel sont les options disponibles pour ma liste ?


Voici quelques options permettant de personnaliser le drag & drop,
Vous trouverez la liste de ces paramètres et méthodes sur : http://interface.eyecon.ro/docs/sort


axis : Bloque le drag & drop sur un axe (vertically ou horizontally)
opacity : Permet de régler l'opacité (de 0 à 1)
fx : Durée de l'effet d'apparition lors du drop (nombre en ms)
ghosting : crée un copie de l'élément déplacé


Comment sauvegarder la position de la liste avec PHP et MySql ?

Pour allez encore plus loin on peut utiliser les méthodes Jquery pour envoyer une requête Ajax.
Avec Ajax vous pouvez appeler une page PHP qui vous permettra de sauvegarder les positions
des éléments et cela sans recharger la page.

<script type="text/javascript">

    $(document).ready (
        function () {
            $( "#sortlist" ).Sortable ( {
            accept : 'sortable_item',
            axis : 'vertically',
            opacity : 0.6,
            onchange : function ( sorted ) {
            serial = $.SortSerialize ( 'sortlist' );
            // requète Ajax pour l'enregistrement des positions
            $.ajax ( {
                url : "set_position.php",
                type : "post",
                data : serial.hash,

                // Si vous avez besoin d'un feedback de la requête vous
                // pouvez utiliser ces fonctions ci dessous.

                //complete: function(data){alert(data);},
                //success: function(feedback){ $('#data').html(feedback); }
                //error: function(){alert('Erreur lors du déplacement ');}


                });
            }

        });
    });

</script>


Remarque :

Attention les id des éléments de la liste ( balise <li id='votre id'> )
doit être cohérent avec les id contenu dans la base MySql.

Voici maintenant le script php "set_position.php" :

<?

    /* 
    Mettez ici votre script de connexion à votre base de données
    */

    // Récupération des valeurs post envoyé par la requête Ajax

    $sortlist = $_POST [ 'sortlist' ];
       
    // On update la table avec les nouvelles positions
   
    for ($i = 0 ; $i < count ( $sortlist ) ; $i++) {
       
            // SQL Query :
            $query = ( "update matable set position='".($i + 1)."' where id = $sortlist [ $i ] " );
            $ajout = mysql_query ($query) or die ( mysql_error() );
       
    }


?>



JQuery et les plugins ?

Voici les différents plugin JQuery si vous voulez approfondir l'utilisation de ce framework javascript :

http://docs.jquery.com/Plugins



 Commenter ce wiki sur le forum

- haut de page -


Fichiers joints :
FichierDescriptionTaille de fichier
Télécharger ce fichier (sortlist.zip)sortlist.zipFichiers exemples avec JQuery et Interface inclus40 Kb
 
Commentaires (35)
Re : Exemple de la structure de la table à créer
35 Lundi, 01 Mars 2010 19:36
w@k
Bonjour,
la structure est très simple :
id : uint (clé primaire auto-incrément)
nom : text (ou tout autre champs utiles)
...
position : uint
Exemple de la structure de la table à créer
34 Lundi, 01 Mars 2010 19:31
Noooz
Bonjour, ce script est très intéressant, je suis en train de l'utiliser pour un listage dynamique de document mp3 sur un site spip afin de créer et modifier des playlist récupérées par un lecteur flash...
Le drag and drop fonctionne très bien mais je n'arrive pas à enregistrer la position dans la table, serait-il possible d'avoir un exemple de structure de la table devant recevoir l'info, pour l'instant j'ai une table "position_list" possédant 2 champs "id" et "position"
Ainsi qu'un exemple du fichier "set_position.php" configuré avec cette structure de table...
Merci encore pour ce script
IE
33 Jeudi, 04 Février 2010 11:34
yopopipo
Pas de retour pour le pb de IE qui ne drag qu'une fois chaque element?
Re : Erreur bête
32 Jeudi, 04 Février 2010 09:40
w@k
Les deux sont normalement valable.
Mais tu as raison, il est préférable d'écrire :
$query = ( "update matable set position='".($i + 1)."' where id = ".$sortlist [ $i ]);
pb IE
31 Jeudi, 04 Février 2010 02:04
yopopipo
Meme probleme que cité plus bas:
Sous IE 7 et 8, impossible de dragué 2 fois le meme objet...
Erreur bete
30 Jeudi, 04 Février 2010 00:58
Alex
Erreur bete:

where id =". $sortlist [ $i ] );
au lieu de
where id = $sortlist [ $i ] " );

Depent du type de donnee du champ 'id'
serial.hash
29 Mardi, 26 Janvier 2010 16:36
gabriel
bonjour,
merci pour ce script

petite question.

je souhaite obtenir serial.hash sous la form (item1,item2,item3...) plutot que sous la forme (sortlist[]=item1&sortlist[]=item2...)

comment puis-je proceder?
merci pour vos reponses
Bug sous IE7
28 Mardi, 06 Octobre 2009 16:49
Jimbo
Si comme Didier (message du 13/12/2008) vous connaissez le même bug, il vous faut supprimer la "," après "data : serial.hash" !
Aides en détail
27 Mercredi, 20 Mai 2009 10:30
w@k
Merci de publier votre code dans la partie forum du site,
je regarderai si je vois pas une erreur qui traine.
Firefox est moins sensible au erreur de balise par exemple alors que IE pour la moindre petite erreur cela peut avoir des conséquences sur le fonctionnement global.
Emplacement du script
26 Mercredi, 20 Mai 2009 10:26
Xélie
J'utilise IE7 et IE6 (via multiIE). Que le script soit juste avant la balise , juste après ou dans le cela ne change rien, je ne comprend pas pourquoi, sur votre wiki cela fonctionne très bien.

Merci pour votre réponse rapide !
Attention à l'emplacement des scripts
25 Mercredi, 20 Mai 2009 10:06
w@k
Il me semble que les scripts fonctionne plus ou moins bien selon leurs emplacements dans le code.
Quel version de IE utilisez vous ?
Et une autre question, est ce que mon exemple de déplacement dans mon wiki (sur cette page) fonctionne correctement avec votre version d'IE ?
Soucis IE
24 Mercredi, 20 Mai 2009 09:58
Xelie
Bonjour,
sous IE, une fois qu'un élément a été déplacé, je n'arrive pas à le déplacer une deuxième fois. Cela se produit avec ou sans l'appel Ajax et pas sur FireFox. Une idée du soucis ? (je suis partie de vos fichiers de départ)
Merci par avance
?
23 Vendredi, 06 Mars 2009 23:19
w@k
Bonsoir,
Alors là aucune idée dsl... je n'ai jamais eu d'erreur firebug.
scripts pour drag and drop
22 Vendredi, 06 Mars 2009 19:51
christophe
Bonjour,
Votre script étant tellement intéressant, je me permet de vous recontacter avec mes scripts.

0){
echo '';
echo ' ';

foreach($listePagesFromSrubrique as $page){
echo '('.$page[page_id].') '.$page[page_titre].'';
}
echo '';
echo '';
}
?>

ensuite votre script javascript avec :
...
url: "set_position.php",
type: "post",
data: serial.hash,
...

alert(serial.hash) affiche bien le tableau :
sortlist[]=5&sortlist[]=15&sortlist[]=2&sortlist[]=3

mais dans firebug j'ai ce message :
Firebug needs to POST to the server to get this information for url: http://localhost/__backoffice_v4/maj/rang_pages.php

et la mise à jour ne se fait pas.
voici le script :
Test en get
21 Vendredi, 06 Mars 2009 09:46
Christophe
Bonjour
merci de votre aide et je vais essayer tout cela en get
problème
20 Jeudi, 05 Mars 2009 23:12
w@k
Bonjour,
J'ai déjà réalisé ce script avec des paramètres en GET,
cela ne pose normalement aucun problème.
Je pense que cela vient directement du code de la page index.php
Désolé si je ne vous aide pas plus car il est très difficile de débugger un code que je n'ai pas sous les yeux, cela peut venir de tout et n'importe quoi, un point virgule par exemple ;)
Bon courage, il s'agit la plupart du temps d'une petite erreur.
La fonction php ne fonctionne pas
19 Jeudi, 05 Mars 2009 22:46
christophe
Bonjour,
le déplacement fonctionne bien mais pas le script ajax :
url: "index.php?m=1&a=set_position"

En fait la page qui modifie les rangs est appelé par une page index via la valeur "a" dans l'url

merci de votre aide.
nop
18 Jeudi, 05 Mars 2009 13:44
w@k
Content que ton problème soit résolu.
Ne te casse pas la tête pour le dérangement, j'aime bien résoudre les problème ;)
Tout est résolu
17 Jeudi, 05 Mars 2009 13:24
kickoff
C'est bon tout est résolu et fonctionne nickel merci et désolé pour le dérangement
kickoff
16 Jeudi, 05 Mars 2009 12:52
FF à la rescousse
j'ai le droit à cette belle erreur :
uncaught exception: Access to restricted URI denied (NS_ERROR_DOM_BAD_URI)

a noter que je suis chez free
du novueau
15 Jeudi, 05 Mars 2009 12:46
kickoff
maintenant dans mon alerte j'ai :

sortlist[]=2&sortlist[]=1&sortlist[]=3&sortlist[]=4&sortlist[]=5&sortlist[]=6&sortlist[]=7&sortlist[]=8&sortlist[]=9&sortlist[]=10&sortlist[]=11&sortlist[]=12&sortlist[]=13&sortlist[]=14&sortlist[]=15&sortlist[]=16&sortlist[]=17&sortlist[]=18&sortlist[]=19&sortlist[]=20&sortlist[]=22&sortlist[]=23&sortlist[]=24&sortlist[]=21&sortlist[]=25
mais cela ne résoud pas mon soucis qu'il enregistre rien
RE : Soucis
14 Jeudi, 05 Mars 2009 12:31
w@k
Bonjour,
Attention le serial = $.SortSerialize ( 'sortlist' ); ainsi que le serial.hash est très important.
Essai de mettre une alert (serial.hash);
Normalement la requête Ajax envoi à un tableau au fichier php.
Tu peut aussi utiliser la ligne complete: function(data){alert(data);} pour vérifier les données que tu as transmis.
réctification
13 Jeudi, 05 Mars 2009 12:18
kickoff
désolé petite erreur en tapant c'est [object Object] qui s'affiche dans ma boite de dialogue
soucis object[object]
12 Jeudi, 05 Mars 2009 12:15
kickoff
Bonjour,
j'ai appliqué votre script à la lettre et il ne fonctionne pas le drag n drop fonctionne mais pas l'enregistrement j'ai mis un alert (serial); et il m'affiche object[object] je ne comprends pas le probléme pourtant il appel bien les 2 scripts et tout est bien placé

A noter j'ai mis un tableau dans mes c'est juste un détails de présentation
Erreur
11 Samedi, 24 Janvier 2009 17:17
wak
Je suis désolé je n'ai jamais vu ce type d'erreur...
Essayez d'isoler le problème en désactivant les autres scripts que vous utilisez sur votre page, Sinon une petite remarque : vérifier que vous n'utilisé bien qu'un seul framework js. car l'utilisation de Jquery et Scriptaculous (par exemple) est incompatible.
Version de JQuery
10 Samedi, 24 Janvier 2009 11:56
christophe
Bonjour,
Merci de votre rapidité de réaction.
La version de JQuery est celle que j'ai téléchargé depuis le fichier zip que vous proposé sur cette page
Merci
re : erreur
9 Samedi, 24 Janvier 2009 09:39
wak
Regardez au niveau de votre version de JQuery.
erreur
8 Samedi, 24 Janvier 2009 00:31
christophe
Bonjour
J'ai essayé d'utiliser votre script
mais lorsque je déplace un li ca marche, j'ai bien le tableau avec les bonnes positions des li, mais j'ai cette erreur dans FireBug :

this.options.curAnim is undefined
yeah !
7 Lundi, 22 Décembre 2008 18:52
w@k
Oui je connais Firebug, je l'utilise tout les jours,
c'est vraiment un outils indispensable.
Content que tu ai trouvé ton erreur.
La plupart du temps c'est ce genre de chose, erreur de frappe etc...
[Suite]
6 Lundi, 22 Décembre 2008 18:05
Nimo
J'ai trouvé !!
en faite j'avais ecris ceci :
data : "serial="serial.hash etc...

als qu'il faut écrire data : serial.hash
du coup j'ai bien tout les éléments de ma liste alors qu'avant le 1er n'y était pas. Ca parait quand meme bizard :/
[suite]
5 Lundi, 22 Décembre 2008 17:43
Nimo
Dans le onChange le alert m'affiche "[object Object]"
Sinon j'utilise Firebud si tu connais, c'est un plugin pour mozilla. Il permet entre autre de vérifié les variables envoyés en post et leurs contenus. Et j'ai bien ma liste renvoyé en post, seulement toujours pas le 1er élément compris à l'intérieur :/
sortSerialize
4 Lundi, 22 Décembre 2008 17:29
w@k
Bonjour,

Dans ta fontion "onchange" essaie de mettre un alert
pour vérifier si tu as bien toutes tes données qui sont transmis.

onchange : function ( sorted ) {
serial = $.SortSerialize('sortlist');
alert (serial);
... etc

Ensuite dans ta page PHP vérifie que tu commence bien à l'élément 0 du tableau et pas 1 ;-) ... on sait jamais.

Sinon je ne vois pas d'où cela pourrai venir,
car je n'ai jamais rencontré ce genre de problème.

En tout cas j'espère que tu trouvera la solution.
Tu ne doit pas être très loin je pense ...
SortSerialize ne renvoie pas le 1er élément
3 Lundi, 22 Décembre 2008 17:13
Nimo
Bonjour,

J'ai un soucis avec le sortSerialize. En effet, en post je récupère bien un tableau contenant l'id de tous les li, sauf le 1er li. Et j'aimerais vraiment pouvoir tous les récupérés.
D'où viendrais ce problème ?

Merci

Cordialement, Nimo
Problème JavaScript
2 Samedi, 13 Décembre 2008 18:01
wak
Bonjour,

Je pense que ton problème vient directement du code javascript.
La requête Ajax permet d'envoyer des données qui te permettera d'enregistrer par exemple la position des éléments.

Essai dans un premier temps d'optenir le drag and drop sans la requête Ajax.

Comme noté plus haut dans le tutorial :



$(document).ready (
function() {
$( "#sortlist" ).Sortable( {
accept : 'sortable_item',
axis : 'vertically',
opacity : 0.6,
onchange : function ( sorted ) {
serial = $.SortSerialize( 'sortlist' );
}
});
});



Pense bien à intégrer le frameworks JQuery et le plugin interface dans ton header.
Puis il faut que tu regarde si tu as des erreurs javascript via firebug (plugin firefox). Cela peut te donner des messages d'erreur qui vont te permettre de débugger ton code facilement.

Tu peut aussi télécharger les fichiers exemples, il devrait être fontionnels.

Voilà, j'espère t'avoir aidé et que tu trouvera la solution facilement.
Probleme
1 Samedi, 13 Décembre 2008 15:09
didier
bonjour,

il a l'air super ton code , mais chez moi ca na marche pas.

Si je met que la requette :
$.ajax ( {
url : "set_position.php",
type : "post",
data : serial.hash,

le drag ne marche pas.

Y a t il une soluce

Merci

Ajouter votre commentaire

Votre nom:
Sujet:
Commentaire:
  Code de vérification. Lettres minuscules seulement et sans espace.
Code de vérification: