Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je rencontre un problème en essayant de construire un gabarit.
J'effectue sur mes pages un contrôle d'authentification (Zend_Auth). Je veux donc pouvoir rediriger les visiteurs vers l'action 'login' du controlleur AuthController pour que ces derniers s'identifient. Seulement je veux inclure l'écran de connexion dans mon gabarit (template). Je voulais ainsi exlure les actions 'gauche', 'droite', 'header' et 'footer' du contrôle, pour que tout s'affiche correctement. Cependant, cela ne fonctionne pas du tout. J'ai une petite idée sur la question, en effet, j'ai l'impression que les actions appellées par l'actionStack conservent la même valeur pour la variable $this->_request->getParam('action'). Du coup je n'arrive pas à exclure ces actions du comportement par défaut, elles ne sont donc jamais rendues.
Le coupable : l'action 'preDispatch' du indexController
function preDispatch()
{
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity() && $this->_request->getParam('action')!='header' && $this->request->getParam('action')!='footer' && $this->_request->getParam('action')!='gauche' && $this->_request->getParam('action')!='droite') {
$this->_redirect('auth/login?error='.$this->_request->getParam('action'));
}
}
Si je met :
echo($this->_request->getParam('action'));
J'obtiens : "loginloginloginlogin"
Mon url d'appel :
http://localhost/tuto/index/modifier/id/2
Mon actionStack :
$actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack');
$actionStack->actionToStack('footer','index');
$actionStack->actionToStack('header','index');
$actionStack->actionToStack('gauche','index');
$actionStack->actionToStack('droite','index');
Est-ce un comportement normal ? Je suis bloqué.
Merci d'avance pour votre aide .
Dernière modification par Candy (22-04-2008 17:05:30)
Hors ligne
Est-ce que c'est la bonne approche ??
Perso, je n'utilise pas action stack mais le layout et un plugin Auth
Le plugin vérifie si l'utilisateur est connecté ou non ($auth->hasIdentity()) si non, il change la requete demandé en fesant pointé vers le controlleur d'identification.
Les header, footer, .... sont donc gérer dans le layout et "s'auto-gère". Selon les cas, ce sont des partials, des actions...
Hors ligne
nORKy a écrit:
Est-ce que c'est la bonne approche ??
Perso, je n'utilise pas action stack mais le layout et un plugin Auth
Le plugin vérifie si l'utilisateur est connecté ou non ($auth->hasIdentity()) si non, il change la requete demandé en fesant pointé vers le controlleur d'identification.
Les header, footer, .... sont donc gérer dans le layout et "s'auto-gère". Selon les cas, ce sont des partials, des actions...
Je suis d'accord avec toi pour dire que ce n'est pas la meilleure façon de faire. Ceci est uniquement pour l'exemple, je suis en train d'apprendre à manipuler le framework. Cependant, je ne vois pas comment tu fais pour contruire ton gabarit sans l'aide de l'actionStack ou même de helper 'action' ... Sinon je suis d'accord sur le principe du plugin, c'est beaucoup plus propre et DRY. Mais désolé pour mon retard mental, je ne vois pas comment tu gère les header, footer ... dans le layout sans que ceux-ci ne passe par la règle de gestion d'authentification. Peux-tu m'éclairer s'il te plait ?
@Mr.MoOx : la redirection fonctionne bien sans ça, mais je vais essayer ce soir et je te tiens au courant .
Merci à vous deux.
Hors ligne
Tu peux générer les vues de plusieurs facon avec le layout grace aux helper
notamment :
'partials' : rien de spécial, elles seront toujours rendues (si tu veux un header partout par exemple)
'action' : tu executes une action précise ; cette action peut alors décider de ne rien rendre si tu le veux (par exemple, une action nav/sidebar.php qui test hasIdentidy et decide ou non de faire un rendu en fonction du résultat)
mon layout ressemble à ca :
<?php $this->headLink()->prependStylesheet('/style/default.css') ?> <?php echo $this->doctype('XHTML1_STRICT') ?> <html> <head> <?php echo $this->headTitle() ?> <?php echo $this->headLink() ?> <?php echo $this->headScript() ?> <?php echo $this->headStyle() ?> </head> <body id="<?php echo $this->moduleName; ?>"> <?php echo $this->partial('header.phtml') ?> <?php echo $this->action('menu','index', 'nav'); ?> <div id="containerCols"> <div id="left"> <?php echo $this->action('status','index', 'nav'); ?> <?php echo $this->action('sidebar','index', 'nav'); ?> </div> <div id="content"> <?php echo $this->layout()->content; ?> </div> <div class="clear"> </div> </div> </div> <?php echo $this->partial('footer.phtml') ?> </body> </html>
Dernière modification par nORKy (22-04-2008 12:12:58)
Hors ligne
Merci pour la réponse nORKy, cependant je ne comprend pas :
- si tu as un plugin pour l'authentification et que tu n'es pas logué, ton plugin te redirige vers le contrôleur d'identification, comment fais-tu pour "accéder" à tes différentes actions nécessaires à l'affichage de ton template ?
Hors ligne
Mon plugin, dit juste
"si tu n'es pas identitié, utiliser le module auth, controller index, action login plutot que celui demandé"
Il ne fait rien de plus mon plugin. L'accès des actions dans le layout est automatique.
voici le cheminement :
- Passage dans le plugin (cas ou je ne suis pas identifié
- auth/index/login lui, génère son formulaire, etc... Il ne fait que son boulot d'identification.
Automatiquement, le rendu est fait par le viewrenderer et est stocké dans le layout()->content
- si c'est un post et que tout va bien, il fait une redirection vers la page "par défaut" pour laisser l'utilisateur travaillé
- le rendu de layout se lance (automatiquement) dans layout.html, il rencontre des $this->action('menu','index', 'nav')
-- les $this->action() son traité automatiquement comme n'importe qu'elle action et leur rendu est placé à l'endroit appelé dans le layout. Le framework sait ou trouvé la fonction Nav_IndexController->menu();
-----
Lorsque tu es logué, le plugin ne modifie rien dans la requète et donc c'est l'action demandé qui est exécuté et les action dans le layout sont toujours exécuter.
-----
Dans mon menu, je test $auth->getIdentity() ($auth est dans un registry) et si il n'est pas logué, je fait un $this->_helper->viewRenderer->setNoRender(); et la, rien ne sera affiché, donc, pas de menu.
Hors ligne
Ok je vois, mais c'est dommage de faire plusieurs fois la même chose non ?
Ici tu vérifie deux fois si l'utilisateur est identifié ou non ... ?
Hors ligne
plusieurs la meme chose ?
je ne fais pas plusieurs fois la même chose.
J'ai une tache qui gère l'identification, une tache qui gère un menu, une tache qui gere autre chose, etc...
Tu devrais regardé ce tuto :
http://julien-pauli.developpez.com/tuto … nd-layout/
Hors ligne
J'ai suivi ce tutoriel. C'est d'ailleurs pour cela que je suis ici . J'ai simplement essayé de le coupler avec l'authentification. Lorsque je dis que tu fais plusieurs fois la même chose je parle :
1 - ton plugin vérifie l'identité et propose de se loguer
2 - lors du rendu de ton layout, dans l'action menu tu vas encore vérifier l'identité
C'est cela que j'entendais par là. Mais je te prie de m'excuser, je ne suis pas encore familiarisé avec le framework ...
Hors ligne
beh oui, car, j'ai pas envi que mon menu s'affiche si personne n'est identifié, c'est tout
Hors ligne
Excuse moi . En tout cas je te remercie pour toute ton aide
, j'apprécie beaucoup.
Hors ligne