Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > MVC
MVC Forum de support sur le développement d'applications de type modèle-vue-contrôleur avec Zend Framework ainsi que vos questions sur les plugins, les helpers etc. Avant de poster -> Cours MVC, FAQ ZF Controller
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2007, 11h42   #1
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 46
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : mars 2003
Messages : 46
Points : 32
Points : 32
Par défaut Redirection dans un plugin

Bonjour,

Je débute avec le zend framework, et je rencontre un probleme avec l'utilisation des plugins.

Pour detailler:

Je developpe pour mon site un systeme de gestion des ACL (ce systeme fonctionne correctement)

pour effectuer le controle je developpe un plugin, le controle s'effectue correctement, mais au moment de faire la redirection vers la page de login (quand pas les droits par exemple), le script boucle et appel la requete initiale.

Je vous donne le code de mon plugin

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
class Auth_AuthPlugin extends Zend_Controller_Plugin_Abstract
{
  private $_acl;
  private $_auth;
 
  private $_noauth = array('module' => 'default',
                           'controller' => 'login',
                           'action' => 'index');
 
  private $_noacl = array('module' => 'default',
                          'controller' => 'error',
                          'action' => 'privileges');
 
  public function __construct($acl,$auth)
  {
    $this->_acl = $acl;
    $this->_auth = $auth;
  }
 
  public function preDispatch($request)
  {
    if($this->_auth->hasIdentity())
    {
      $identity = $this->_auth->getIdentity();
      $role = $identity["role"];
    }
    else
    {
      $role = 'guest';
    }
 
    $controller = $request->controller;
    $module = $request->module;
    $action = $request->action;
 
    $resource = $controller;
 
 
    if(!$this->_acl->has($resource))
    {
      $resource = null;
    }
 
    if (!$this->_acl->isAllowed($role, $resource, $action)) {
            if (!$this->_auth->hasIdentity()) {
                $module = $this->_noauth['module'];
                $controller = $this->_noauth['controller'];
                $action = $this->_noauth['action'];
                echo "pas d'identite</br>";
                }
            else
            {
                $module = $this->_noacl['module'];
                $controller = $this->_noacl['controller'];
                $action = $this->_noacl['action'];
                echo $controller."</br>";
                echo $module."</br>";
                echo $action."</br>";
                echo "pas d'acl</br>";
                $request->setModuleName($module);
                $request->setControllerName($controller); 
                $request->setActionName($action); 
                $request->setDispatched( false );
            }    
    }
  }
}
Merci de m'expliquer comment effectuer la bonne redirection a partir du module.

Cereal59
cereal59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 16h01   #2
vvm
Invité régulier
 
Inscription : mars 2004
Messages : 7
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2004
Messages : 7
Points : 5
Points : 5
as tu mis des d'accès sur le controller Login ??
Je pense que le controller Login est soumis à une limitation d'accès (où plutôt tu ne l'a pas autorisé pour les profils "guest". vérifie.

Si ce n'est pas ça. peut on voir les attributions d'accès que tu as pu faire ?

bonne chance.
vvm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 22h39   #3
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Quand tu es dans le cas du "if (!$this->_auth->hasIdentity())", il faut que tu définisses le nouveau module/controller/action avec $request->setModuleName() etc.
Mais il ne faut pas déclarer $request->setDispatched(false);

Pourquoi ? En fait, dans les sources du Front Controller, lors du dispatch, on a cette portion de code (zf 0.8.0) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
do {
    $request->setDispatched(true);
 
    /**
     * Notify plugins of dispatch startup
     */
    $this->_plugins->preDispatch($request); // Appel ton plugin::preDispatch()
 
    /**
     * Skip requested action if preDispatch() has reset it
     */
    if (!$request->isDispatched()) {
        continue; // Loop Ad Vitam Aeternam!!
    }
 
    /**
     * Dispatch request
     */
    $dispatcher->dispatch($request, $response);
 
    /**
     * Notify plugins of dispatch completion
     */
    $this->_plugins->postDispatch($request);
} while (!$request->isDispatched());
Donc on comprend aussi pourquoi dans le cas du "if ($this->_auth->hasIdentity())" c'est à dire le "else", il y a une boucle sans fin.

Bien sûr, comme l'a dit vvm, assure toi que les guests ont les droits pour accéder au controller de login
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2007, 16h00   #4
Nouveau Membre du Club
 
Inscription : mars 2003
Messages : 46
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : mars 2003
Messages : 46
Points : 32
Points : 32
Bonjour

Merci pour vos réponses,

J'avais effectivement un probleme sur les ACL en fait du fait de l'organisation en modules de mon application, mes ACL sont declarées de la maniere suivante:
Code :
1
2
 
$acl->allow(role,nom_du_module,action);
et lors du test dans le plugin j'utilisai le controlleur.

Ensuite j'ai enlevé les
Code :
1
2
 
$request->setDispatched(false);
Et ca fonctionne !!!

Merci
cereal59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h15.


 
 
 
 
Partenaires

Hébergement Web