Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-10-2010 18:28:11

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Acl & requêtes Ajax(jQuery)

Bonjour,
Je suis sur un petit projet qui comprend plusieurs modules et dans chaque module je crée les contrôleurs nécessaire et un contrôleur dédié aux requêtes Ajax.
Tous fonctionne super sauf quand la session de l'utilisateur expire et qu'il fait un appel Ajax.

Dans ce cas précis la requête n'aboutis mais peut créer une erreur selon le type de donnée renvoyé.
J'aimerais pouvoir annuler la requête Ajax et mette l'utilisateur sur la page de connexion.

Existe t il une solution simple que je pourrais mettre dans le script de contrôle d'accès type :

Code:

if(!$this->_acl->isAllowed(Zend_Registry::get('role'), $module.':'.$resource, $action)) {
    if($request->isXmlHttpRequest()){
        // kill xmlHttpRequest
        // diriger l'utilisateur vers /default/index/index
    }else{
        $request->setModuleName('default')
                     ->setControllerName('index')
                     ->setActionName('index');
        }
}

Merci,
Dede

Dernière modification par Dede (20-10-2010 18:29:05)


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

Hors ligne

 

#2 20-10-2010 18:51:21

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

Re: Acl & requêtes Ajax(jQuery)

Il faut que tu gères ça au niveau de ton javascript.
L'idéal c'est d'avoir un petit protocole de communication ajax.
Par exemple, a chaque requête erronée (peux importe la raison), t'envoie un code d'erreur avec un message et lorsque tu reçois ta réponse au niveau du javascript, tu regarde s'il y a eu une erreur, si oui tu l'affiches ou dans ton cas tu redirige vers le login, sinon tu fais le traitement normal.

Hors ligne

 

#3 21-10-2010 11:47:02

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Re: Acl & requêtes Ajax(jQuery)

L'idée me parait séduisante,
mais je ne comprend pas l'histoire du protocole ?
J'ai une utilisation d'Ajax assez rudimentaire (je pense),
je fais mes requêtes de cette manière :

Code:

$.post(url,data,function(response){
    //traite la réponse
},'type')
// ou $.get...

Comment mettre en place un protocole de communication?
Si tu as des liens de doc ou tuto je suis preneur.
Merci,
Dede


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

Hors ligne

 

#4 21-10-2010 12:04:20

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: Acl & requêtes Ajax(jQuery)

Hello,

Je vois que tu utilises jQuery.

Tu peux spécifier un handler (une fonction) pour les erreurs serveur sur les requêtes ajax : http://api.jquery.com/ajaxError/

Ensuite il suffit de gérer les erreurs dans ta fonction, exemple vite fait :

Code:

var ajaxErrorHandler = function (event, XMLHttpRequest, settings, exception) {    
    var response = jQuery.parseJSON(XMLHttpRequest.responseText);
    switch (XMLHttpRequest.status.toString()) {
        case '400':                
            
            break;
        case '500':
    
            break;
                // ...
    }
};

Il faut donc bien spécifier le code de la réponse côté serveur. De mon côté je passe l'objet réponse à mes vues JSON et dans les vues :

Code:

$this->response->setHeader('Content-Type', 'application/json'); 
if ($this->monObjet->getNotification()->hasErrors()) :
    $this->response->setHttpResponseCode(400); // bad request       
    echo $this->json(array(
        'data' => $this->monObjet,
        'errors' => $this->monObjet->getNotification()->getErrors()
    ));
else :
    $this->response->setHttpResponseCode(201); // ok created
    echo $this->json(array(
        'data' => $this->monObjet,
        'redirect' => $this->url(array(
            'controller' => 'mon-controller',
            'action' => 'mon-action'
        ), 'default', true) 
    )); 
endif;

A toi de manipuler tout ça comme tu en as besoin.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 21-10-2010 14:21:25

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Re: Acl & requêtes Ajax(jQuery)

Ça commence à rentrer...
Je vais me pencher sur cette méthode, c'est pas encore très clair mais ca devrais venir.
Merci,
Dede


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

Hors ligne

 

#6 19-11-2010 09:58:57

Dede
Membre
Date d'inscription: 26-06-2009
Messages: 99

Re: Acl & requêtes Ajax(jQuery)

Alors après avoir été forcé de gratter ce sujet en "urgence",
j'ai finalement opté pour cette solution (que je poste, ça peut servir...):

Je ne gère que l'erreur ou le succès de la requête Ajax.
Dans le contrôleur de la page de connexion(/index/login):

Code:

...
// Seul une erreur appel cette page de cette manière
if($this->_request->isXmlHttpRequest()){
       $this->_response->setHttpResponseCode('401');
}
...

et dans le script JS (accessible dans toute l'appli)

Code:

$.ajaxSetup({
     complete:function(e, xhr) {
            if(xhr == 'error') {
                alert('Votre session à expiré.\nVeuillez vous reconnecter.')
                document.location.href = "/login";
            }
            }
        });

Une chose que je ne comprend pas c'est que malgré le "setHttpResponseCode('401');" il me renvoit e.status = 500?
En tous cas cela fonctionne pour toutes les requêtes Ajax $.get, $.post, ...

Dede


« Il ne faut pas lier un navire à une seule ancre, ni une vie à un seul espoir. »
Epictète
http://www.noumcreation.com

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