IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Acl & Zend_Auth PHP Discussion :

ACL et jQuery ajax


Sujet :

Zend_Acl & Zend_Auth PHP

  1. #1
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut ACL et jQuery ajax
    Bonjour à tous,
    j'ai une liste de dossiers que j'affiche et je voulais y mettre un peu de jQuery pour cloturer un dossier.
    en gros un simple click sur un cadenas qui effectue un update id_etat="2" where id_dossier = mon id récupéré .

    Mon problème consite à faire ceci en MVC ...
    voila comment j'ai procédé :

    Dans ma vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="#" class="cloture" title="<?php echo $this->escape( $dossier['id_dossier'] ); ?>"><img src="<?php echo $this->baseUrl(); ?>/images/cad1.png" alt="Ouvert" title="Cloturer ce Dossier " /></a>


    l'image est bien la avec la bonne propriete.

    Le click sur l'image déclenche ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    $(document).ready(function(){
        $('.cloture').click(
            function() {
            $.ajax({
                url : 'cloture_dossier.php',
                type: 'POST',
                data: 'id_dossier='+ $(this).attr('title'),
                dataType : 'json',
                success: function(data) {
                    alert('Dossier transmis : ' + data);  // cela fonctionne
                    },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    alert(thrownError);
                  }
            })
        })
    });
    mon probleme réside indirectement dans cloture_dossier.php :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $id_dossier=$_POST['id_dossier'];
     
    // $sql=("UPDATE dossiers SET id_etat= 2 WHERE id=$id_dossier");
     
    $dossiers = new Application_Model_DbTable_Dossiers();
    $dossiers->cloturerdossier($id_dossier);  // Modele ligne 62


    Dans mon modèle j'ai ajouté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public function cloturerdossier ($id)
        {
        $data = array('id_etat' => '2');
            $this->update( $data, 'id = ' . (int)$id );
        }
    J'ai systématiquement une erreur 500 car j'utilise un plugin pour les acl :
    <h3>Parametres passés:</h3>
    <pre>array (
    'controller' =&gt; 'cloture_dossier.php',
    'action' =&gt; 'index',
    'module' =&gt; 'default',
    'id_dossier' =&gt; '117',
    ) </pre>

    hors dans mon fichier acl.ini je mets :
    controller.action = liste des profils autorisés séparés par une virgule

    si je ne mets rien, tout le monde y est autorisé, par exemple : index.index =

    Dans mon cas il reconnait cloture_dossier.php comme controller mais ce n'en n'est pas un et plante lamentablement

    Ai je loupé quelque chose ou c'est la logique globale qu'il faut revoir ?

  2. #2
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    Je viens d'essayer autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $(document).ready(function(){
    	$('.cloture').click(
    		function() {
    		$.ajax({
    			url : "/dossiers/cloturerdossier",
    			type: 'POST',
    			data: 'id_dossier='+ $(this).attr('title'),
    			dataType : 'json',
    			success: function(data) {
    				alert('Dossier transmis : ' + data);  // cela fonctionne
    				// $("#titre").html(data["0"]);
    				// $("#news").html(data["1"]);
    				},
    			error: function (xhr, ajaxOptions, thrownError) {
    				alert(xhr.status);
    				// alert(thrownError);
    			  }
    		})
    	})
    });
    et j'ai ajouté cette action dans mon controller dossiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public function cloturerdossierAction()
    	{
    	$dossiers = new Application_Model_DbTable_Dossiers();
    	$dossiers->cloturerdossier($id_dossier);  // Modele ligne 62
    	}
    j'ai bien ajouté ce qu'il faut dans mon acl.ini
    mais j'ai une erreur 404 car je n'ai pas de vue ... donc je ne pense pas que ce soit une solution viable pour de l'ajax ...

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 328
    Points : 823
    Points
    823
    Par défaut
    Il faut bien que ta requête reçoive une réponse, là tu reçoit bien la requête mais tu ne paramètre pas la réponse, il est donc naturel qu'il y ait une erreur 404

    Donc soit tu fais une vue exprès, soit tu paramètre la réponse dans ton contrôleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->getHelper(‘json’)-> sendJson($reponse) ;
    Par exemple vu que tu as dit à ton jquery que la réponse est au format json

    Je te conseille vivement d'aller fouiller la doc pour déterminer exactement ce dont tu as besoin

    http://framework.zend.com/manual/1.1...onhelpers.json

  4. #4
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par v1cent Voir le message

    soit tu paramètre la réponse dans ton contrôleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->getHelper(‘json’)-> sendJson($reponse) ;
    Je n'ai pas encore tout compris dans la doc
    j'ai rajouté dans mon action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public function cloturerdossierAction()
    	{
    	$dossiers = new Application_Model_DbTable_Dossiers();
    	$dossiers->cloturerdossier($id_dossier);  // Modele ligne 62
    	$this->getHelper(‘json’)-> sendJson($dossiers) ;
    	}
    Mais cela ne change rien.
    En fait je ne veux pas une autre vue, je veux juste (dans un premier temps) executer une requete, puis, ce serait le luxe, modifier une image apres execution de cette requete.
    Requete de mon modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public function cloturerdossier ($id)
        {
        $data = array('id_etat' => '2');
            $this->update( $data, 'id = ' . (int)$id );
        }

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 328
    Points : 823
    Points
    823
    Par défaut
    tu peux te contenter de renvoyer "0" ou "1"

    Il faut renvoyer quelque chose de toute façon pour que tu sache que ça a marché, donc soit tu envoi une chaîne de caractère vide, et une erreur HTTP en cas de problème d'enregistrement, soit tu envoie 0 ou 1 et tu traite le résultat

    en effet, le fait que tu n'ai pas d'erreur http (404,500 ou autre) ne signifie pas forcément que ton action a marché (enfin que les traitements associés à ton action ont marché)

  6. #6
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par v1cent Voir le message
    tu peux te contenter de renvoyer "0" ou "1"

    Il faut renvoyer quelque chose de toute façon pour que tu sache que ça a marché, donc soit tu envoi une chaîne de caractère vide, et une erreur HTTP en cas de problème d'enregistrement, soit tu envoie 0 ou 1 et tu traite le résultat

    en effet, le fait que tu n'ai pas d'erreur http (404,500 ou autre) ne signifie pas forcément que ton action a marché (enfin que les traitements associés à ton action ont marché)
    Mon probleme est que je n'arrive pas à executer ma requete ( je le vois bien dans ma base) avant meme de me préocuper du retour utilisateur.

    Je crois que je vais devoir revenir à du traditionnel car l'ajax et le mvc, c'est du chinois pour moi

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 328
    Points : 823
    Points
    823
    Par défaut
    j'ai l'impression que tu ne sais pas trop ce que tu fais ...

    utilise un débugueur peut être

  8. #8
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par v1cent Voir le message
    j'ai l'impression que tu ne sais pas trop ce que tu fais
    Oui, c'est pour ça que je poste
    En fait, je vois tres bien la logique sur une page normale mais pas en mvc.

    En normal, je récupère l'id dossier avec jquery, j'execute un fichier php qui contient ma requete. En cas de succes j’effectue X actions : pop up, mise à jour de mon tableau ...

    En mvc j'arrive à récupérer l'ID de mon item mais pas à executer une simple requete car je ne sais pas quelle methode choisir, ou placer mon fichier php( ou créer une action) ...

    Alors oui, je ne sais pas du tout quoi faire

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 328
    Points : 823
    Points
    823
    Par défaut
    tu utilise firebug, ou l'inspecteur de chrome ?

    dans l'onglet réseau (Network), tu as toutes les actions échangées, tu y verra un peu plus clair.

    Tu te contente d'envoyer une requête http, c'est exactement la même chose que quand tu charge une page. Donc tu arrive via l'url rewriting dans le fichier central, qui va choisir un contrôleur et une action en fonction de ce que tu lui donne comme paramètres et comme adresse. Quand le contrôleur a terminé ses traitements, il génère une vue (plus précisément il la génère en même temps, mais la vue est rendue à la fin). Si pas de vue, il aura rien à renvoyer au client, donc il génère une erreur 404.

    Donc tu créée une action dans un contrôleur (une méthode machinAction). Là il faut trouver une systématique, perso comme mes actions peuvent toutes être utilisées de manière indifférente en ajax ou non, je passe un paramètre quand c'est de l'ajax que je traite avant d'entrer dans mon action (méthode preDispatch). Tu peux aussi faire des contrôleurs spécifiques à l'ajax, ou des actions spécifiques dans tes contrôleurs, là je peux pas trop t'aider je connais ni ton architecture, ni tes habitudes (on a tous nos petites manies).

    Ensuite tu décide de ce que tu veux que ton action fasse, si tu veux juste qu'elle fasse un truc dans ta base, je pense que retourner le résultat de cette requête c'est pas mal (si je comprend bien c'est ça que tu essaie de faire).
    Exemple : tu veux mettre à jour un enregistrement, SQL te renvoie le nombre de lignes modifiées, tu peux retourner la même info qui sera traitée en javascript. Encore une fois, c'est toi qui voit, tu peux aussi décider de renvoyer rien, donc une page vide avec un code 200, et générer une erreur si y'a un problème.

    T'as encore des tas de possibilités, c'est toi qui voit.

    Dans tous les cas, il faut envoyer quelque chose (même si c'est une page pleine de vide). Si tu veux envoyer une page vide, tu doit avoir une fonction qui fait ça, mais je connais pas.

    Si tu n'en est pas encore là, c'est peut être que ton application ne sélectionne même pas la bonne fonction à exécuter. La méthode pour sélectionner est pourtant strictement la même que pour une page HTML.

    Essaie déjà de préciser ce que doit faire exactement ton action (données que tu envoi, traitement attendu, éléments à recevoir en fonction de ce traitement), comme tu doit faire peut-être sans même t'en rendre compte dans le design de chacune de tes pages. Ensuite tu voit où tu en est actuellement dans ton code, par exemple tu remplace ton action courante par un retour de truc basique (coucou ?) et tu regarde dans l'onglet network ce que ça donne, puis quand tu es sur que ton architecture marche, tu essaie de mettre ton traitement dans ton action et d'adapter le retour.

    J'ai essayé d'être complet, j'espère que c'est clair.

Discussions similaires

  1. [JQuery] Ajax et bulle d'aide [ToolTip]
    Par Invité dans le forum jQuery
    Réponses: 1
    Dernier message: 04/07/2008, 11h18
  2. [JQuery] ajax avec Firefox
    Par elvan49 dans le forum jQuery
    Réponses: 2
    Dernier message: 17/12/2007, 13h21
  3. jquery ajax et IE
    Par Sourrisseau dans le forum jQuery
    Réponses: 1
    Dernier message: 01/09/2007, 06h17
  4. [JQuery] Ajax et réécriture d'url
    Par Nicolas N. dans le forum jQuery
    Réponses: 1
    Dernier message: 21/07/2007, 21h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo