Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonsoir à tous,
J'utilise le framework depuis sa RC1 et depuis je ne le quitte plus pour développer !!
Par j'ai un léger soucis pour envoyer une valeur sur une vue depuis mon plugin auth.php.
Voici le code de mon auth.php
Je n'arrive pas à voir comment envoyer mon menu sur la vue correspondante !!
<?php class My_Plugin_Auth extends Zend_Controller_Plugin_Abstract { private $_auth; private $_acl; private $_view; private $_noauth = array('module' => 'admin', 'controller' => 'auth', 'action' => 'login'); private $_noacl = array('module' => 'default', 'controller' => 'index', 'action' => 'noagreement'); public function __construct($auth, $acl) { $this->_auth = $auth; $this->_acl = $acl; } public function preDispatch(Zend_Controller_Request_Abstract $request) { Zend_Loader::loadClass('Menu'); if ($this->_auth->hasIdentity()) { $roleUser = $this->_auth->getIdentity()->role_user; $roleGroup = $this->_auth->getIdentity()->role_group; $menu = new Menu(true); } else { $roleUser = 'guest'; $roleGroup = 'groupGuest'; $menu = new Menu(false); //********ICI COMMENT JE RENVOIE CETTE VALEUR SUR CHAQUE VUE PUISQUE CELLE CI N'EST PAS INSTANCIEE DANS CE PLUGIN*****************// $this->view->menu = $menu->getMenu(); } $controller = $request->controller; $action = $request->action; $module = $request->module; //$resource = $module; $resource = $module.'_'.$controller; //Zend_Debug::dump($resource, $label='Variable $Resource', $echo=true); if (!$this->_acl->has($resource)) { $resource = null; } if (!$this->_acl->isAllowed($roleUser, $resource, $action)) { if (!$this->_auth->hasIdentity()) { $module = $this->_noauth['module']; $controller = $this->_noauth['controller']; $action = $this->_noauth['action']; } else { $module = $this->_noacl['module']; $controller = $this->_noacl['controller']; $action = $this->_noacl['action']; } } $request->setModuleName($module); $request->setControllerName($controller); $request->setActionName($action); } } ?>
De plus, je récupère mon menu comme ça dans mon header :
<?php echo $this->menu; ?>
Si quelqu'un a une petite réponse ???!!!
Merci bonne soirée
Allfab
Hors ligne
Bonjour,
Le problème c'est que dans le preDispatch de ton plugin, ton controlleur n'est pas encore instancié. Si tu utilises la vue par défaut, elle n'est pas instanciée non plus (parce qu'elle est créée au moment de l'instanciation du controlleur). (... ok, je viens de voir que tu dis la même chose dans ton message...)
Tu peux :
- la passer avec $request->setParam("menu",$menu->getMenu()); et dans ton controlleur tu la récupères avec $this->_getParam(...); (ou dans un helper)
- la mettre dans la registry et la récupérer dans la régistry avec ton controlleur (ou un helper)
- tu peux instancier ta vue dans le bootstrap, l'envoyer à ta vue comme tu voulais le faire et dans un helper, associer ta vue au controlleur appelé
A+, Philippe
Hors ligne
Merci pour cette réponse !
Du coup, j'aimerais mieux faire l'affichage du menu en utilisant un autre plugin. En attendant une réponse à ma question, j'ai bidouillé mon code et me suis rendu compte que ça m'arrangeais que le test du menu se fasse dans chaque function init() de mes vues.
Du coup, dans chaque vue il me faut mettre ce code :
<?php class IndexController extends Zend_Controller_Action { function init() { $this->initView(); $this->view->baseUrl = $this->_request->getBaseUrl(); $this->view->user = Zend_Auth::getInstance()->getIdentity(); if($this->view->user->role_user == "admin") { $menu = new Menu(true); } else { $menu = new Menu(false); } $this->view->menu = $menu->getMenu(); } function indexAction() {.... la suite du code
J'en arrive a ma question....
J'ai créé un autre module (initialize.php)
<?php class My_Plugin_Initialize extends Zend_Controller_Plugin_Abstract { private $_auth; public function __construct($auth) { $this->_auth = $auth; } public function init() { $this->initView(); $this->view->baseUrl = $this->_request->getBaseUrl(); $this->view->user = $this->_auth->getIdentity(); //$this->view->user = Zend_Auth::getInstance()->getIdentity(); if ($this->_auth->hasIdentity()) { $roleUser = $this->_auth->getIdentity()->role_user; if ($roleUser == "admin") { $menu = new Menu(true); } else { $menu = new Menu(false); } $this->view->menu = $menu->getMenu(); } } } ?>
Ce code ne marche pas, a priori, je dois me craquer quelque part mais je n'arrive pas à déterminer où !!
Merci
Allfab
Dernière modification par allfab (30-10-2007 10:46:06)
Hors ligne
Personne n'a réalisé un plugin d'initialisation !
Je tourne en rond depuis hier, si quelqu'un a une p'tite idée.
Merci
Bon aprèm
Hors ligne
allfab a écrit:
Personne n'a réalisé un plugin d'initialisation !
Bonjour,
La vue est généralement instanciée dans le bootstrap avec quelque chose du genre:
$view = new Zend_View(); $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->setView($view);
On peut alors après obtenir la vue de n'importe où (predispatch des plugins compris):
$view = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view;
Voici un exemple avec un plugin:
class App_Plugin_Auth extends Zend_Controller_Plugin_Abstract { public function preDispatch() { $view = Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view; $auth = Zend_Auth::getInstance(); $view->userIsAuthenticated = false; if ($auth->hasIdentity()) { $view->userIsAuthenticated = true; $view->userId = $auth->getIdentity()->id; $view->userEmail = $auth->getIdentity()->email; $view->userNickname = $auth->getIdentity()->nickname; } } }
Dernière modification par Laurent (03-11-2007 21:45:37)
Hors ligne
bonne idée ça le plugin d'init pour l'authentification
peut être pa à charger au démarrage car l'init n'est pas toujours nécessaire mais c'est une bonne idée.
de plus on peu en mettre plusieurs ce qui permet une certaine modulatirté
A+JYT
Hors ligne
Pages: 1