Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-11-2010 11:32:59

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

[RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Bonjour à tous,


Voilà, dans mon application développée en MVC, je suis en train d'utiliser la fonction Jquery droppable :
http://jqueryui.com/demos/droppable/#photo-manager

Cela fonctionne bien.

Sauf que, je voudrais récupérer la liste des vignettes que j'aurais mises dans la poubelle.
Ou mieux, que, dès qu'une vignette est mise dans la poubelle, je puisse appeler une action de mon contrôleur pour faire le traitement que je désire (changer le statut dans la BD par exemple).

Je commence à maîtriser la partie MVC : j'utilise bien mes modèles, je ne fais pas de traitement dans mes vues, je garde mes contrôleurs relativement propres ; et j'utilise même des aides de vue et aides d'action.
Mais dès qu'il s'agit de javascript, ajax et jquery, je nage.

En fait, mon problème est très certainement tout simple et concerne l'interaction entre Jquery et PHP : comment récupérer l'évènement de glisser-déposer pour le traiter.

Cela a peut-être un rapport avec le JSON ? Je ne sais pas ce que c'est bien que je l'ai croisé dans la doc du Zend framework.


Merci.

Dernière modification par gmifsud (19-11-2010 11:38:40)

Hors ligne

 

#2 09-11-2010 18:43:08

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Il te faut utiliser le AJAX. En gros lorsque tu vas ajouter une vignettes à ta poubelle, tu dois envoyer une requête AJAX vers une action de ton contrôleur qui lui va te répondre en JSON ou XML.

Regarde les fonctions AJAX de jQuery.

Le JSON est un format léger d'échange de données, un peu comme le XML (se dernier est plus lourd).

Hors ligne

 

#3 10-11-2010 12:10:20

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Je te remercie, j'ai commencé à parcourir la doc.


J'utilise finalement SORTABLE au lieu de DROPPABLE, mais mon problème reste le même.

Voilà comment j'ai l'impression qu'il me faut procéder :
- j'ai une première liste <ul> qui contient les objets de la poubelle.
- j'ai une seconde liste <ul> qui contient les autres objets.

J'ai donc deux choses à faire à chaque fois qu'un changement a lieu dans la première liste :
- récupérer la liste des objets dans les <li> lorsqu'il y a un
    * ajout d'un élément.
    * changement dans l'ordonnancement des éléments.
    * enlèvement d'un élément de la liste.
- appeler une action pour traiter cette liste (sauver en BD dans le cas présent).


Débutant en javascript, je me fais un peu de soucis j'avoue...

Dernière modification par gmifsud (10-11-2010 13:17:53)

Hors ligne

 

#4 10-11-2010 18:42:22

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Dans ton cas, l’évènement "receive" est intéressant.

Par exemple, lorsque ta liste Poubelle reçoit l’évènement ça veut dire que tu doit ajouter l'objet dans la poubelle, donc t'envoies une requêtes AJAX pour changer le statut de ton objet pour le mettre à IN_TRASH.
Lorsque ton autre liste reçoit l'évènement, ça veut dire que tu veux remettre ton objet dans la liste, donc tu envoies une requêtes AJAX pour changer le statut de ton objet pour le mettre à IN_LIST.

Il ne reste qu'à savoir comment tu veux gérer les statut ^^

Hors ligne

 

#5 15-11-2010 14:25:40

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Effectivement, je voulais faire quelque chose comme ça, 3uclide.
Lors d'un changement de statut d'un objet => lancer un appel à une url avec l'id de l'objet ou que sais-je me permettant de l'identifier, l'action liée à cette url fait ce qu'il faut dans la BD, puis on retourne sur la page.

Mais, à moins qu'il n'y ait moyen d'exécuter une action sans partir de la page et sans provoquer de rafraichissement, je préfère faire différemment.

J'avais pensé faire ainsi :
- avoir un bouton dont les paramètres de l'url contiendrait les ids des objets dans la poubelle.
- récupérer tous les enfants de la poubelle.
- récupérer les Id en analysant les enfants.
- changer l'url du bouton en javascript.

=> pour valider son drag'n drop, la personne clique le bouton, et l'action liée à ce bouton analyse la liste d'Id qui lui sera passée en paramètre.


Mon problème actuel, c'est que les enfants sont des < li > et que l'id est perdu au milieu.
<li nb="$i" class="ui-widget-content ui-corner-tr">
    <img width="48px" title="Mathématiques&lt;br /&gt;
     Par Pythagorelt;br /&gt;Tags : Enseignements , La Recherche , Mathématiques" alt="Mathématiques" src="http://serveur/vignettes/pythagore.jpg" class="classe">
    <a class="ui-icon ui-icon-wrench" href="/videos/edition/id/1"></a>
</li>


Va me falloir écrire une expreg en javascript pour le récupérer, mais je pense que ça va être faisable.



Je vous tiens au courant en tous les cas.

Hors ligne

 

#6 15-11-2010 18:21:39

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Mais, à moins qu'il n'y ait moyen d'exécuter une action sans partir de la page et sans provoquer de rafraichissement, je préfère faire différemment.

C'est justement la définition du AJAX.

Hors ligne

 

#7 15-11-2010 20:31:18

omega2
Membre
Lieu: Boisbriand, quebec, canada
Date d'inscription: 01-04-2009
Messages: 85
Site web

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Ton id, c'est ton fameux 'nb="$i"' ?

Si c'est le cas, je te conseille plusieurs choses :
- laisse tomber les regexp pour ça, tu te compliques la vie pour rien.
- utilise la méthode javascript "getAttribute" pour récupérer le contenu du "nb"
- utilise les fonctions tels que getElementById, getElementsByClassName et autres ChildsNode, FirstChild, ..., si tu as besoin de chercher un élément dans la page.
- remplace "nb" par "data-nb" (par exemple) pour être compatible html5 et éviter tout conflit pouvant survenir avec les prochaines versions des normes html (qui sait, peut être qu'il y aura un paramètre "nb" sur les "ul" ou les "li" en html6)

Hors ligne

 

#8 16-11-2010 09:38:54

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Ok. Merci à vous deux.

J'avais un doute sur mon idée d'utiliser un attribut "personnel", mais je vais quand-même creuser la chose, en utilisant les fonctions AJAX, et en le renommant comme il se doit.

Hors ligne

 

#9 19-11-2010 11:35:03

gmifsud
Membre
Date d'inscription: 29-04-2010
Messages: 75

Re: [RÉSOLU] Jquery sortable : comment récupérer l'information en PHP ?

Drag'n drop fonctionnel !  :)

Merci à vous, vous m'avez bien aiguillé et permis de mieux comprendre le fonctionnement Ajax.
J'avoue que la programmation événementielle n'est pas mon fort.


Pour la postérité, et pour aider les prochains, j'indique ici comment j'ai fait.

Je m'inspire très fortement du tuto sur le site officiel de JQuery :
http://jqueryui.com/demos/droppable/#photo-manager

Il s'agissait de gérer le contenu du carrousel 3D, dont je parle déjà dans le sujet suivant :
http://www.z-f.fr/forum/viewtopic.php?id=5651


Désormais, le contenu du carrousel est modifié lorsque l'on dépose une vignette dedans, et lorsque l'on change l'ordre des vignettes à l'intérieur.



Dans ma vue, les deux conteneurs :

Code:

// Les vignettes dans le carrousel
<ul id="carrouselvideos" class='carrouselvideos connectedSortable ui-widget-content ui-state-default'>
<?php
    foreach ($this->videocarr as $vid)
    { /* @var $vid Model_DbTable_Video */
        ?><li class="ui-widget-content ui-corner-tr" data-id=<?php echo $vid["idvideo"]; ?>>
            <img class="cloudcarousel" src="<?php echo $vid[$i]["imagevideo"]; ?>"
            width="48px" alt="<?php echo $vid["intitule"]; ?>"
            title="<?php echo $vid["intitule"]; ?>" />
        </li>
<?php } ?>
</ul>

// Les vignettes hors du carrousel
<ul id="gallery" class='gallery connectedSortable ui-helper-reset ui-helper-clearfix'>
<?php
    foreach ($this->listeVideos as $vid)
    { /* @var $vid Model_DbTable_Video */
        ?><li class="ui-widget-content ui-corner-tr" data-id=<?php echo $vid["idvideo"]; ?>>
            <img class="cloudcarousel" src="<?php echo $vid["imagevideo"]; ?>"
            width="48px" alt="<?php echo $vid["intitule"]; ?>"
            title="<?php echo $vid["intitule"]; ?>" />
        </li>
<?php } ?>

// Si on veut récupérer le retour de l'action qui gère le contenu du carrousel
<div id="result"></div>

En bref, on affiche toutes les vignettes récupérées et surtout on leur donne l'attribut data-id que l'on va récupérer ensuite en Ajax !



Dans mon contrôleur.
Je récupère la liste des vidéos dans le carrousel.
Je récupère la liste des vidéos hors du carrousel.
J'initialise les fonction Jquery pour gérer le drag'n drop

Code:

    public function init()
    {
        // Si requete ajax on désactive les layouts
        if($this->_request->isXmlHttpRequest()){
            $this->_helper->layout->disableLayout();    //disable layout for ajax
        }
    }


 public function indexAction()
    {

        // On crée les instances des objets dont on va se servir
        $videomodel    = new Model_DbTable_Video();
        $carrouselvideos = new Model_DbTable_Carrousel();

        // On récupère les vidéos qui ne sont pas dans le carrousel :
        $this->view->listeVideos = $videomodel->getVideosHorsCarrousel();

        // On récupère la liste des vidéos qui doivent se trouver dans le carrousel
        $this->view->videocarr = $carrouselvideos->getVideos();


        // Ci-dessous : Javascript, source, ini et librairie
        
        // On active l'utilisation de la librairie jQuery
        $this->view->jQuery()->enable();
        $this->view->jQuery()->uiEnable();
        
        // La fonction de glisser-déposer
    //    $this->view->headScript()->appendFile($this->view->baseUrl().'/js/droppable.js');
        
                
        // Gestion du contenu du carrousel 3D
        $this->view->headScript('script','
        $(document).ready(function(){
            
        // Le conteneur des vignettes qui ne sont pas dans le carrousel
        $( "#gallery" ).sortable({
            connectWith: ".connectedSortable",
            cancel: "a.ui-icon",                    // cliquer sur une icône empêche le déplacement
            revert: "invalid",                        // Si relaché, l_objet retourne à sa position initiale
            helper: "clone",
            cursor: "move"
        });

        // Le conteneur des vignettes qui sont dans le carrousel
        $( "#carrouselvideos" ).sortable({
            connectWith: ".connectedSortable",
            cancel: "a.ui-icon",                    // cliquer sur une icône empêche le déplacement
            revert: "invalid",                        // Si relaché, l_objet retourne à sa position initiale
            helper: "clone",
            cursor: "move",
            update: function( event, ui ) {            // lorsque le contenu du carrousel change
                actualisecarrousel( "#remplace");    // On appelle une fonction qui met la BD à jour
            }
        });

        // Actualisation du contenu du caroussel dans la BD en appelant l_action adéquate
        function actualisecarrousel( $item ) {
            var $enfants = $( "#carrouselvideos" ).children();
            var $idvideos = new Array();
            // On crée un tableau contenant les IDs des vidéos dans le carrousel
            $enfants.each(function(index) {
                $idvideos.push($(this).attr("data-id"));
            });
            url = "videos/carrouselremplace/";
            // On met dans le conteneur "result" le résultat de l_action appelée
            $("#result").load(url, { "idvideos" : $idvideos});
        }
        });
        ');
        
    }

    /**
     * Remplace toutes les vidéos dans le carrousel 3D
     * Cette action est appelée par un script JQuery après tout drag'n drop vers ou depuis le carrousel
     * Elle est aussi appelée lors de tout déplacement d'une vignette à l'intérieur du carrousel.
     */
    public function carrouselremplaceAction()
    {
        // Récupération des ID des vidéos dans le carrousel après le drag'n drop
        $idvideos        = $this->_getParam('idvideos', 0);

    //     Zend_Debug::dump($idvideos);
         
         $carrouselmodel = new Model_DbTable_Carrousel();
         
         // On vide le carrousel
         $carrouselmodel->vide();
         
         // On lui ajoute les vidéos dont les IDs sont passées en paramètre
         if ($idvideos) {
             foreach ($idvideos as $idvideo) {
                 $carrouselmodel->ajoute($idvideo);
             }
         }
    }

Je conseille d'utiliser le zend_debug dump pour vos essais.
Vous récupérerez l'info dans le conteneur de votre page, vous prouvant que l'appel d'action par Ajax fonctionne.

Il faut bien entendu avoir écrit les méthode adéquates dans vos modèles pour récupérer les vidéos et enregistrer le contenu du carrousel dans la BD.

Normalement, ça fonctionne. :)


REMARQUE : de temps en temps, les vidéos se retrouvent rangées d'une façon étrange dans la galerie (pas le carrousel). Je ne sais pas d'où ça vient. Si quelqu'un trouve comment être sûr que les vignettes soient toujours bien rangées en ligne, je suis preneur.

REMARQUE 2 : je ne suis pas sûr de ce que définissent les classes commençant par ui- . J'ai juste recopié l'exemple sur le site officiel de JQuery qui les utilise.


Merci encore à 3uclide et omega2. Vous m'avez fait gagner beaucoup de temps.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages