Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 17-09-2010 14:03:51

faldo1
Membre
Date d'inscription: 15-05-2010
Messages: 25

Zend_acl pour montrer / cacher liens dans une vue, 3 questions en une

Bonjour à tous,

Question 1.

J'ai beau parcourir les forums en français et en anglais, je ne parviens pas à trouver la solution idéale pour une action pourtant bien simple et fréquente: à partir des droits dans Zend_Acl, j'aimerais qu'un label deviennent un lien vers un controller/action ou reste à l'état de label sans lien dessus si Zend_Acl refuse l'accès à ce couple controller/action à l'utilisateur courant.

Cela marche très bien pour le navigator, le menu principal de mon site n'affiche que les menus auxquels l'utilisateur à le droit.

Mais ici, ce serait dans les pages-mêmes, dans les listes, les textes affichés. Un exemple ?

Si un utilisateur est sur une liste de commandes, la première colonne affiche le client. Si l'utilisateur courant a le droit Zend_Acl sur Client/voirfiche, ce serait bien de mettre un lien sur le client dans la liste permettant d'aller voir la fiche du client en question. Sinon, le nom du client est affiché sans aucun lien.

Quelle est la meilleure façon de procéder ?

Question 2.

Tout cela sent le view_helper, non ? Un view_helper qui prend un controller, une action, un label, des options (clef primaire, etc.) et construit le code html avec le lien ou non.

Mais là, j'ai un autre problème: comment utiliser le Zend_Acl comme variable d'instance du view_helper. Et plus généralement, comment passer des variables d'instance à un view_helper ?

Je trouverais moche de devoir passer par Zend_Registry depuis le code du view_helper, je n'aime pas les variables globales.

Question 3.

Pour essayer de répondre à ma question 2, j'aimerais initialiser la variable d'instance $_acl de mon view_helper dans le Bootstrap via un $view->monViewHelperAcl()->setAcl($monAcl) mais là, c'est la classe qui n'est pas retrouvée dans la fonction dédiée du bootstrap car je l'ai placée dans Application/views/helpers/ et ce répertoire n'est manifestement pas encore connu à ce moment du Bootsrap. Il sera pourtant connu une fois l'application lancée (mon view_helper de test fonctionne et il est dans le même répertoire) alors que je n'ai défini nulle part ce chemin ni dans mon Bootsrap ni dans le config.ini. Pourquoi ? Par quel mécanisme ? Comment faire pour initialiser mon view_helper dans le bootstrap sans risquer une redondance de chemins de view_helpers ?

Merci d'avance pour tout, j'espère ne pas avoir été trop tordu  !!!

Hors ligne

 

#2 18-09-2010 09:34:28

Alexandre_T
Nouveau membre
Date d'inscription: 17-09-2010
Messages: 4

Re: Zend_acl pour montrer / cacher liens dans une vue, 3 questions en une

Non, ta question n'est pas trop tordue smile

La solution que je préconise est de se recentrer vers les design-patterns. Dans la plupart des applications, nous avons besoin un peu partout de notre connexion à notre base de données (Zend_Db), nos informations d'utilisateur connecté (Zend_Auth) et nos informations de sécurité et d'accès (Zend_Acl) ou de notre Front_Controller (Zend_Controller_Front).

Donc pour cela, l'idéal est de se tourner vers le singleton. Effectue un héritage de Zend_Acl. Ta classe My_Acl doit etre modélisée comme un Singleton. (Constructeur privé, méthode clone interdite, attribut statique contenant l'objet lui-même et une méthode static getInstance qui initialise l'attribut s'il n'existe pas puis qui te retourne cet attribut.)

Ainsi, dans ton aide de vue, comme ailleurs, si tu désires faire appel à cet objet, il te suffit de l'instancier ainsi :

Code:

$acl = My_Acl::getInstance();

Voici un exemple tiré d'une de nos applications :

Code:

<?php
require_once ('Zend/Acl.php');

class Vdi_Acl extends Zend_Acl{
    
    const INVITE = 'invite';

    /**
     * Rôle par défaut
     * 
     * @var string
     */
    protected static $_defaultRole = self::INVITE;
    
    /**
     * Instance singleton
     * 
     * @var Vdi_Acl
     */
    protected static $_instance;
    
    /**
     * Retourne une instance sans regarder dans les espace de noms
     * @return Vdi_Acl
     */
    public static function getInstance() {
        if (self::$_instance == null) {
            self::$_instance = new self ( );
        }
        return self::$_instance;
    }
    
    
    /**
     * Injection de paramètres
     * 
     * @var array $params
     */
    public static function setParams(array $params) {
        if (isset ( $params ['defaultRole'] )) {
            self::$_defaultRole = $params ['defaultRole'];
        }
    }
    
    /**
     * Constructeur
     * 
     * final : ne peut être redéfinie, le rôle par défaut doit exister
     */
    final protected function __construct() {
        $this->addRole ( new Zend_Acl_Role ( $this->getDefaultRole () ) );
        $this->_init ();
    }
        
    /**
     * Récupère le rôle par défaut
     * 
     * @return string
     */
    public static function getDefaultRole() {
        return self::$_defaultRole;
    }
    /**
     * Initialise l'Acl depuis la base de données, ou autre... 
     *
     * @return Vdi_Acl
     */
    protected function _init() {        
        //INITIALISER AVEC VOS VALEURS
    }
    /**
     * Le clonage est interdit
     *
     * @throws Zend_Exception
     */
    public function __clone(){
        throw new Zend_Exception ('Il est interdit de cloner ce singleton');
    }
}

?>

Hors ligne

 

#3 22-09-2010 13:25:04

faldo1
Membre
Date d'inscription: 15-05-2010
Messages: 25

Re: Zend_acl pour montrer / cacher liens dans une vue, 3 questions en une

Un tout grand merci pour cette réponse de passionné smile

Je vais essayer !!!

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