JeuWeb - Crée ton jeu par navigateur
[Réglé] Scriptaculous Sortable List - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Réglé] Scriptaculous Sortable List (/showthread.php?tid=1480)

Pages : 1 2


[Réglé] Scriptaculous Sortable List - Nessper - 17-07-2007

Bonjour tout le monde ^^

Sans plus tarder je vous énonce mon problème. J'ai une 1ere liste contenant 8 li à la base et une 2eme en contenant 5 (on s'en fout en fait). Le but c'est que je déplace des li de la 2eme liste vers la 1ere mais que celle-ci ne puisse pas en contenir plus de 10. Jusque là ça va. Mais le truc c'est que lorsque j'approche le 10eme li, je ne sais pas comment le faire "repartir" tant que la liste est pleine. C'est pas clair hein ?
Bon voilà le code.
dans la page php
Code PHP :
<?php 
<div>
<
div id="gamb_act" class="bloc1">
<
h3>Gambits actifs</h3>
<
ul class="sortabledemo" id="firstlist">
<
li class="green" id="firstlist_firstlist1">Gambit n°14</li>
<
li class="green" id="firstlist_firstlist2">Gambit n°1</li>
<
li class="green" id="firstlist_firstlist3">Gambit n°11</li>
<
li class="green" id="firstlist_firstlist4">Gambit n°10</li>
<
li class="green" id="firstlist_firstlist5">Gambit n°15</li>
<
li class="green" id="firstlist_firstlist6">Gambit n°7</li>
<
li class="green" id="firstlist_firstlist7">Gambit n°21</li>
<
li class="green" id="firstlist_firstlist8">Gambit n°12</li>
</
ul>
</
div>
<
div id="gamb_pass" class="bloc1">
<
h3>Gambits de réserve</h3>
<
ul class="sortabledemo" id="secondlist">
<
li class="orange" id="secondlist_secondlist1">
<
span class="handle">Gambit n°9</span>
</
li>
<
li class="orange" id="secondlist_secondlist2">
<
span class="handle">Gambit n°8</span>
</
li>
<
li class="orange" id="secondlist_secondlist3">
<
span class="handle">Gambit n°0</span>
</
li>
<
li class="orange" id="secondlist_secondlist4">
<
span class="handle" >Gambit n°13</span>
<
li class="orange" id="secondlist_secondlist5">
<
span class="handle">Gambit n°2</span>
<
li class="orange" id="secondlist_secondlist6">
<
span class="handle">Gambit n°3</span>
</
li>
</
ul>
</
div>
</
div>

<
div style="clear:both;"> </div>

{
literal}
<
script type="text/javascript">
// <![CDATA[
Sortable.create("firstlist",
{
dropOnEmpty:true,containment:["firstlist","secondlist"], constraint:false,
onChange:function(){calculnbGambits('firstlist', 'gamb_act');}});

Sortable.create("secondlist",
{
dropOnEmpty:true,handle:'handle',containment:["firstlist","secondlist"],constraint:false});
// ]]>
</script>
{/
literal}

ma fonction calculnbGambits
Code PHP :
<?php 
function calculnbGambits(id_entree, id_container)
{
var
e=$(id_entree).immediateDescendants();
if (
e.size() > 10)
{
//C'est ici que je dois faire en sorte que mes éléments repartent d'où ils viennent
}
}


Voilà. N'hésitez pas à me demander si y'a des trucs obscurs

Merci d'avance

Nessper


Edit(naholyr) : Editition du code pour ne pas casser la mise en page


RE: Scriptaculous Sortable List - Loetheri - 17-07-2007

N'est-ce pas plus facile d'autoriser le changement de colonne que s'il y a moins de 10 composants ? -_-'


RE: Scriptaculous Sortable List - Nessper - 17-07-2007

Je suis ouvert à toute proposition ^^. Dis moi comment faire dans ce cas là. Le truc c'est d'arriver à bloquer quand la liste de gauche est pleine mais à réautoriser lorsque elle a de la place de libre et c'est là que je bloque. Je ne peux pas agir directement sur le script (en bas de ma page php) j'ai l'impression.
Pour l'arreter au bout de 10 j'avais tenté comme ça :
Code PHP :
<?php 
function calculnbGambits(id_entree, id_container)
{
var
e=$(id_entree).immediateDescendants();
if (
e.size() > 10)
{
Sortable.destroy('seconlist');
Sortable.create("secondlist",
{
dropOnEmpty:true,handle:'handle',containment:["firstlist","secondlist"],constraint:false, only='actif'});

}
}
Ca autorise a sortir seulement les élément dont la classe est actif. Donc aucun de la droite.


RE: Scriptaculous Sortable List - naholyr - 17-07-2007

[edit] Tu n'étais pas loin Nessper Wink Tu as failli me griller le temps que j'écrive mon post :O En fait il ne te manquait pas grand-chose, le truc c'est que ce sont les deux Sortable qu'il faut détruire et recréer, car sinon les objets Droppable et Draggable ne sont pas correctement réinitialisés. [/edit]

Ce n'est pas aussi simple Loetheri, le composant Sortable n'est que peu manipulable au runtime, et «n'autoriser le changement que si…» n'est pas aussi facile à faire qu'à dire Smile La question est loin d'être triviale comme tu sembles le sous-entendre…

Enfin, ceci mis à part j'ai une solution à te proposer Nessper :

Code PHP :
<?php 
var sortablesState = 0;
function
initSortables() {
// state = 0 => interdit
// state = 1 => autorisé
var nbActive = $('firstlist').immediateDescendants().size();
// si interdit et moins de 10 éléments, alors autoriser
if (sortablesState == 0 && nbActive < 10) {
// supprimer les Sortables s'il y en a
if (Sortable.options("firstlist")) {
Sortable.destroy("firstlist");
}
if (
Sortable.options("secondlist")) {
Sortable.destroy("secondlist");
}
// Créer les sortables en autorisant les mouvements des deux côtés
Sortable.create("firstlist",
{
dropOnEmpty:true,containment:["firstlist","secondlist"], constraint:false, onUpdate:initSortables});
Sortable.create("secondlist",
{
dropOnEmpty:true,handle:'handle',containment:["firstlist","secondlist"],constraint:false});
// Passer l'état à "autorisé"
sortablesState = 1;
}
// si autorisé et au moins 10 éléments, alors interdire
else if (sortablesState == 1 && nbActive >= 10) {
// Supprimer les Sortable
Sortable.destroy("firstlist");
Sortable.destroy("secondlist");
// Créer les Sortable en limitant les mouvements
Sortable.create("firstlist",
{
dropOnEmpty:true, containment:["firstlist"], constraint:false, onUpdate:initSortables});
Sortable.create("secondlist",
{
dropOnEmpty:true, containment:["firstlist","secondlist"], constraint:false});
// Passer à l'état "interdit"
sortablesState = 0;
}
}
// Initialisation des sortables : on appelle la fonction générique
initSortables();

Si tu as besoin d'explications, l'idée c'est :
- Une fonction d'initialisation générique.
- Une variable pour connaître l'état des «Sortable» (qui signifie en gros «a-t'on le droit d'en ajouter vers la première liste ?»).

Si autorisé, et que liste1 a 10 éléments ou plus : interdire.
Si interdit, et que liste1 a moins de 10 éléments : autoriser.

«interdire» =
- Supprimer les «Sortable» actuels.
- Créer les «Sortable» en n'autorisant que le mouvement de liste1 vers liste1 ou liste2 (pas de liste2 vers liste1).
- Passer l'état à «autorisé»

«autoriser» =
- Supprimer les «Sortable» actuels s'il y en a déjà.
- Créer les «Sortable» en autorisant tous les mouvements.
- Passer l'état à «interdit».


RE: Scriptaculous Sortable List - elazard - 17-07-2007

J'ai une question qui peut paraitre débile (j'ai souvent l'impression de me répéter) mais il sert à quoi ce script, j'ai beau le lire et le relire, je vois pas : / (étant donné que je le lis quand même depuis 20 minutes, j'ose poser la question)


RE: Scriptaculous Sortable List - naholyr - 17-07-2007

Ça implique l'utilisation de la librairie Scriptaculous.
Démo : http://wiki.script.aculo.us/scriptaculous/page/print/SortableListsDemo


RE: Scriptaculous Sortable List - elazard - 17-07-2007

Nice! ca permetrait de faire un système "d'équiper les objets" comme sur les mmo en 3D non? enfin c'est la première chose qui m'a sauté aux yeux (et puis bon y'a pas non plus 10000 applications de ce genre de truc dans notre domaine de prédiléction^^) enfin encore merci naho comme d'hab quoi


RE: Scriptaculous Sortable List - Nessper - 18-07-2007

Ben ouais Naholyr merci, comme d'hab' ^^. Je teste ta solution demain et je te dirais si ça marche.
Elazard => Dans mon cas ça va servir à classer des gambits (dixit FFXII) dans n ordre de priorité (la liste de gauche limitée à 10). La liste de droite contient les gambits inactifs, que le joueur possède mais qu'il n'utilisera pas. Ainsi le classement est très intuitif


RE: Scriptaculous Sortable List - naholyr - 18-07-2007

Au fait, utilise des tags OL c'est fait pour Wink [ Allez l'OL ! ]


RE: Scriptaculous Sortable List - Nessper - 18-07-2007

J'hallucine. Je fais copier/coller de ton code et ça marche du premier coup ^^.
En + le code est super accessible, on le comprend du premier coup d'oeil.
Je ne voulais pas détruire et recréer les sortables à chaque fois car j'avais peur que ce soit un peu lent mais non, pas du tout en fait.
Encore merci à toi Naholyr.

Si il y en a que ça intéresse il vous faut prototype.js et scriptaculous.js (le premier est dans la sign de Naholyr et le 2ème dans son post précédent.
Le truc qui est bien mis à part l'interactivité c'est qu'ensuite avec un simple POST pour valider (ou même à chaque fois qu'on fait un changement via Ajax) il n'y a plus qu'à mettre ça à jour dans la base données et le tour est joué. Comme disait Elazard on peut également utiliser ce système pour de l'équipement mais aussi les achats/ventes et je ne sais quoi encore. Par contre dans les cas cités il vaudra mieux utiliser des drag&drop simples. Voilà un petit exemple qui va finir de vous convaincre. Shop Sriptaculous