Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
J'ai mis en place Zend_Acl et Zend_Auth pour la gestion d'un site d'une association.
tout est plus au moins ok sauf :
1°) j'ai des lien plus ou moins partout du style : ajouter - modifier - supprimer.
donc j'ai pas envie de faire un peu partout sur mes vues :
$auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { echo '<a href ....'>; }
et je ne vois pas comment mettre en place ça avec un système de plugin et de view helper.
j'ai pas envie de mettre mon instance dans le registre, car ça peut être assez lourd.
il y avait ce topic : http://www.z-f.fr/forum/viewtopic.php?id=1838 mais il ne ma pas plus aidé.
2°) sinon j'ai vu le système assertions sur ce topic : http://www.z-f.fr/forum/viewtopic.php?id=555
j'ai pas encore réussi à le mettre en place. j'ai pas tout comprit la fonction isAllowed()
par exemple :
Zend_Loader::loadClass("Kitpages_Validate_Pk"); $valid = new Kitpages_Validate_Pk(); if (!$valid->isValid($this->itemId)) { return false; }
j'ai pas réussi a l'interpréter pour mes class
la doc zend sur les assertions est encore peu détaillé.
j'ai fait pas mal de recherche et j'ai peu trouver de topic ou de tuto sur c'est 2 sujet
PS: ce forum est une mine d'information, sans lui je passerait pas mon temps sur zend.
Hors ligne
Pour l'instant j'ai fait ça :
j'ai ajouter un action helper
Bootstrap :
// Action Helpers Zend_Controller_Action_HelperBroker::addPath( './application/helpers'); $hooks = Zend_Controller_Action_HelperBroker::getStaticHelper('Show'); Zend_Controller_Action_HelperBroker::addHelper($hooks);
mon action helper Show.php
class Zend_Controller_Action_Helper_Show extends Zend_Controller_Action_Helper_Abstract { function preDispatch() { $view = $this->getActionController()->view; $module = $this->getRequest()->getModuleName(); $controller = $this->getRequest()->getControllerName(); $action = $this->getRequest()->getActionName(); $user = Zend_Auth::getInstance(); $view->userIsAuthenticated = false; $view->afficher = false; $view->lien = ''; if ($user->hasIdentity()) { $view->userIsAuthenticated = true; $view->userId = $user->getIdentity()->id; $view->userName = $user->getIdentity()->real_name; $view->userRole = $user->getIdentity()->role_acl; if ($view->userRole == "admin") { $view->afficher = true; $view->lien = '<p><a href="' . $view->url(array('module'=>$module, 'controller'=>$controller, 'action'=>'ajouter'),'default', $reset=true ) . '">Ajouter</a></p>'; } if ($module == 'association' && $controller == 'index' && $action == 'index' && $user->getIdentity()->role_acl == "member") { $view->afficher = true; $view->lien = '<p><a href="' . $view->url(array('module'=>$module, 'controller'=>$controller, 'action'=>'ajouter'),'default', $reset=true ) . '">Ajouter</a></p>'; } } } }
et les vues de mes actions :
// Pour le lien ajouter juste echo $this->lien; // En revanche pour ajouter supprimer je doit toujours faire une condition a cause du param. $id <?php if ($this->afficher) { echo '<a href="' . $this->url(array('module'=>'association', 'controller'=>'index', 'action'=>'modifier', 'id'=>$associations->id),'default', $reset=true ) . '">Modifier</a>'; echo '- <a href="' . $this->url(array('module'=>'association', 'controller'=>'index', 'action'=>'supprimer', 'id'=>$associations->id),'default', $reset=true ).'">Supprimer</a>'; }?>
et pour le layout par exemple pour afficher le nom par exemple
<?php if ($this->userIsAuthenticated) { echo '<p>' . $this->userName . '</p>'; } else { echo '<a href="' . $this->url(array('module'=>'login', 'controller'=>'index', 'action'=>'login'),'default', $reset=true) . '">Connexion</a>'; } ?>
et concernant l'assertions, j'ai enfin comprit :
pour mettre à jour leur messages ou autres
si ca peut aider d'autre personne mon assertion la plus simple possible
class ActuAssertion implements Zend_Acl_Assert_Interface { private $itemId = null; public function __construct($param) { $this->itemUser = $param; } public function isAllowed() { // Vérifie posterMemberId and currentMemberId $auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { //username est le nom des utilisateurs dans la bd if ($this->itemUser == $auth->getIdentity()->username) { return true; } //role_acl est le privilege des utilisateur dans la bd ex: admin, menbre, root ... if ($auth->getIdentity()->role_acl == "admin") { return true; } } return false; } public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null) { return $this->isAllowed(); } }
je sais pas si c'est la meilleur solution, mais elle fonctionne pour l'instant a voir en ligne si elle n'est pas trop lourde.
Pour l'action helper, il vaut mieux faire ça dans le 'preDispatch' ou dans 'DispatchLoopStartup'
je voit pas trop la différence sauf que c'est avant ('DispatchLoopStartup').
Ps : si quelqu'un a une idée concernant le paramètre id pour pouvoir le récuperer ou l'envoyer dans l'action helper, je cherche encore.
Dernière modification par baboune (30-11-2008 18:01:48)
Hors ligne
je fait remonter ce message car j'ai encore le même problème, j'ai un action_helper qui en fonction de l'utilisateur (admin ou anonyme) affiche des liens avec des actions :
function preDispatch() { ..... $view->link = '<p><a href="' . $view->url(array('action'=>'ajouter'), 'default') . '">Ajouter</a> | ' . '<a href="' . $view->url(array('action'=>'editer', 'id_actu' => $id), 'default') . '">Modifier</a> | ' . '<a href="' . $view->url(array('action'=>'supprimer'), 'default') . '">Supprimer</a> | ' . '<a href="' . $view->url(array('action'=>'lister'), 'default') . '">Lister</a></p>';
le problème c'est que dans ma vue je liste les id d'un objet, sur certaine vue je peut récupérer l'id dans l'url, par une méthode get_param, mais pas tout le temps :
foreach($this->actualites as $actualite) : ?> <h2><a href="<?php echo $this->url(array('module'=>'actualite', 'controller'=>'index', 'action'=>'lire', 'id_actu'=>$actualite->id_actualite), 'default'); ?>"><?php echo $this->escape($actualite->titre) ?></a></h2> <p class="authorinfo">Posté le <?php echo $this->escape($actualite->creer) ?><br /> Catégorie : <a href=""><?php echo $this->escape($actualite->nom) ?></a></p> <div class="actu"><?php echo $actualite->resume ?></div> <p><a href="<?php echo $this->url(array('module'=>'actualite', 'controller'=>'index', 'action'=>'lire', 'id_actu'=>$actualite->id_actualite), 'default'); ?>">Lire la suite ...</a></p> <hr/> <?php echo $this->link; => Mon Helper endforeach; ?>
j'ai penser a appeler une action, mais le problème c'est que je doit vérifier l'authentification de mon utilisateur dans le preDispatch.
je voit pas comment faire, sauf peut être vérifier mon utilisateur dans mon helper et ensuite appeler mon action d'affichage des liens, mais ça parrait assez lourd (tout ça dans une boucle foreach, je suis obliger en fonction des ACL et des assertions).
Dernière modification par baboune (14-01-2009 18:45:17)
Hors ligne
Puis émettre une suggestion ?
Il semblre que vous utilisez des actions helper spécifique (qui contiennent tous vos liens)
Ne serait-il pas intéressant de faire un actions helper générique pour les réutiliser dans d'autres applications ?
Hors ligne
si tout a fait c'est l'objectif, mais je fait plusieurs test pour l'instant.
le problème c'est que je ne veut pas écrire mes liens directement dans ma vue.
if($acl->isAllowed($this->user->role, 'index', 'ajouter')) { //J'afffiche les boutons }
sinon il y a cette méthode la
class Zend_View_Helper_Link { function Link($request,$name) { $auth = Zend_Auth::getInstance(); $acl = Zend_Registry::get('ACL'); $url_helper = new Zend_View_Helper_Url(); if ($auth->hasIdentity() && $acl->isAllowed($auth->getIdentity()->role, $request['controller'], $request['action'])) { return '<span class="links"><a href="'.$url_helper->url($request).'" >'.$name.'</a></span>'; } } }
et la vue
} echo $this->Link(array('action'=>'ajouter', 'controller'=>'actualite'), "Ajouter une actualité"); ?>
sauf que l'on est plus en predispatch.
Hors ligne
Pages: 1