Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-09-2011 10:59:48

manuzed78
Membre
Date d'inscription: 13-12-2009
Messages: 86
Site web

[1.11.9] Mise en Place Zend_Session

Bonjour à Tous

J'ai actuellement un système complet avec authentification par Zend_Auth + acl (dans un fichier ini) qui fonctionne. big_smile

Par contre comme je n'ai pas de session le seul moyen que j'ai de faire appel à mes variables de session est ce genre de code dans mon header.phtml :

Code:

<?php
// Affecte les données de session de l'utilisateur à la variable tableau $connectedUser
$connectedUser = Zend_Auth::getInstance()->getStorage()->read();
?>>

Puis d'y faire appel tout simplement :

Code:

<h3>Vous etes connectés en tant que <?php echo $connectedUser['prenom'] . ' ' . $connectedUser['nom']; ?>
   (<a href="<?php echo $this->url( array( 'controller' => 'auth', 'action' => 'logout' ) ); ?>">Déconnexion</a>)</h3>

1 ere question : j'ai lu que faire appel aux variables de session $_SESSION était déprécié, cette méthode l'est elle également ? est ce propre ?
2 eme question : sur les forums, ceux qui n'utilisent pas les sessions avec Zend_Session sont ensuites limités car s'il n'y a pas de namespace, on ne peut pas rajouter des données ( pour des sites d'achat par exemple?)

Je me suis dit que mettre un Zend_Session ne devait pas etre sorcier.
Dans mon bootstrap.php j'y ai donc ajouté :

Code:

protected function _initSession()
   {
      Zend_Session::start();
      $storage = new Zend_Auth_Storage_Session();
        $sessionNamespace = new Zend_Session_Namespace($storage->getNamespace());  // génére un identifiant unique ?
        $auth = Zend_Auth::getInstance();
        $auth->setStorage($storage);
   }

Ce code est il correct selon vous ?
Si oui : comment faire appel au nom prénom et toute autre donnée contenue dans la variable de session gérée par Zend_Session
car je ne trouve rien d'autre qui fonctionne que mon code d'origine qui consiste à lire mon array généré par Zend_Auth :

Code:

<?php
// Affecte les données de session de l'utilisateur à la variable tableau $connectedUser
$connectedUser = Zend_Auth::getInstance()->getStorage()->read();
?>

Alors que je devrai pouvoir le faire avec Zend_Session normalement.

Merci d'avance

Hors ligne

 

#2 06-09-2011 14:23:33

Alcide_
Membre
Lieu: Brest
Date d'inscription: 20-03-2010
Messages: 31
Site web

Re: [1.11.9] Mise en Place Zend_Session

Si les champs que tu veux récupérer sont issus de la base de données (lors de l'identification), tu peux faire :

Code:

[lang=php]
Zend_Auth::getInstance()->getIdentity()->prenom;

Hors ligne

 

#3 06-09-2011 14:42:11

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [1.11.9] Mise en Place Zend_Session

Dans le bootstrap :

Code:

    protected function _initSession() {
        // initialise la session
        Zend_Session::setOptions(array(
        /*  stockage          */     'save_path'         => 'repertoire_de_stockage',
        /* protection XSS */       'cookie_httponly'   => true,
        /* durée vie    */            'gc_maxlifetime'    => 60  // 60 secondes
        ));


        // namespace après démarrage de la session
        $session = new Zend_Session_Namespace('vivier');
        Zend_Registry::set('session', $session);
        return $session;
    }

Il faudrait que tu vérifies que Zend_Auth stocke directement les données d'utilisateur dans la session.

Sinon, pour conserver des données dans la session :

Code:

        $ns = new Zend_Session_Namespace('vivier');
            $ns->_valeursaconserver = $_valeurs;   // $_valeurs est un array

Hors ligne

 

#4 06-09-2011 15:44:13

manuzed78
Membre
Date d'inscription: 13-12-2009
Messages: 86
Site web

Re: [1.11.9] Mise en Place Zend_Session

Pour Alcide :
Le Zend_Auth::getInstance()->getIdentity()->prenom; ne fonctionne pas.
Pas d'erreur mais il ne ressort pas le prenom ...
Mais de toutes façons, sans Zend_Session (à supposer que ce ne soit pas déprécié) j'arrive à prendre mes valeurs.


Pour Jean :
je résume mon bootstrap :

Code:

protected function _initSession()
     {
        Zend_Session::start();
        $storage = new Zend_Auth_Storage_Session();
       
        $auth = Zend_Auth::getInstance();
        $auth->setStorage($storage);
        
        // initialise la session
        Zend_Session::setOptions(array(
            'save_path'         => 'repertoire_de_stockage',  /*  stockage          */
            'cookie_httponly'   => true,   /* protection XSS */  
            'gc_maxlifetime'    => 60  // 60 secondes  /* durée vie    */ 
        ));

        //namespace après démarrage de la session
        $session = new Zend_Session_Namespace('vivier');
        Zend_Registry::set('session', $session);
        return $session;

    }

j'ai repris les Zend_Session::start();    ... car j'imagine que c'est indispensable ?

"Il faudrait que tu vérifies que Zend_Auth stocke directement les données d'utilisateur dans la session."
Oui j'en suis bien conscient : c'est la partie difficile ;-)
Mais impossible de trouver sur la doc officielle que je ne comprends absolument pas ! (Y'a rarement un code potable et que de la théorie pour Bac +8 que je ne suis pas)
Il manque un truc qui dit que Zend_Session fait appel à $auth ( et donc ce qui est stocké dans mon authentification car j'ai tout dedans)

Enfin,
Ou puis je placer le code qui permet de mettre dans un tableau mes variables intéressantes ?
$ns = new Zend_Session_Namespace('vivier');
$ns->_valeursaconserver = $_valeurs;   // $_valeurs est un array


Merki

Hors ligne

 

#5 07-09-2011 11:44:50

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [1.11.9] Mise en Place Zend_Session

Le plus simple est de commencer ici : http://framework.zend.com/manual/fr/zen … usage.html

Tu verras dans les exemples que tu n'as pas besoin de faire de "session start".

L'instance   $session = new Zend_Session_Namespace('vivier');  a pour effet de créer la session et de lui donner un identifiant. Tu peux ainsi avoir plusieurs "noms" dans ton application, par exemple pour contenir les variables d'identification, et un autre pour des données de l'appli.

Enfin, regarde http://akrabat.com/zend-auth-tutorial   il est excellent

Jean

Hors ligne

 

#6 07-09-2011 14:21:54

manuzed78
Membre
Date d'inscription: 13-12-2009
Messages: 86
Site web

Re: [1.11.9] Mise en Place Zend_Session

jean a écrit:

Le plus simple est de commencer ici : http://framework.zend.com/manual/fr/zen … usage.html

Tu verras dans les exemples que tu n'as pas besoin de faire de "session start".

Effectivement, la seule chose claire est que session start n'est pas obligatoire big_smile

jean a écrit:

Enfin, regarde http://akrabat.com/zend-auth-tutorial   il est excellent

Jean

Tres bien cet article effectivement. Si je l'avais eu  pour Zend_Auth  ça aurait été cool !
Mais ma question reste la meme : comment entrer mes données de Zend_Auth dans une instance Zend_Session ?
Et y faire appel dans mes pages bien sur big_smile

En fait la logique voudrai que l'on fasse un triptyque Zend_Auth, Zend_Session et les Zend_Acl
J'ai Zend_Auth + acl mais pas de Zend_Session et franchement, impossible de trouver un code meme basique qui fonctionne avec ces 3 composants. Incredible ! sad

Et vous, vous n'utilisez pas ces 3 composants ensemble?

Hors ligne

 

#7 08-09-2011 14:14:36

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [1.11.9] Mise en Place Zend_Session

Bonjour,

J'utilise effectivement Zend Auth, Acl et les sessions.

Le fonctionnement général :
-les sessions (via un namespace) sont déclarées dans le bootstrap
-les autorisations sont contrôlées via un plugin.
- dans le plugin, j'instancie une classe pour vérifier les ACL
- enfin le paramétrage des ACL est fait dans un fichier .ini (pas besoin de toucher au code lors de l'ajout d'un controller, d'une action, ressource... Super!)

... un peu compliqué, mais c'est souple !

... je ne suis pas un cador, j'ai beaucoup lu, testé et trouvé la quasi totalité de ces ressources sur internet ! (Désolé, je n'ai pas les auteurs !!!)

Quelques explications :

App_Globals::getConfig()->title     
App_Globals est une classe. La méthode getConfig, suivie d'un paramètre me permet de récupérer la valeur du paramètre stocké dans dans application.ini
C'est très pratique : je reste attaché aux fichiers configuration !!!
Tu verras ce code plusieurs fois, alors je te passe comment l'implémenter.
Son code (extrait de la class App_Globals) :

Code:

public static function getConfig() {
        /*
         * Chargement de la configuration de l'application.
         * La configuration est paramétrée dans le fichier "application.ini".
         *
         * getConfig() vérifie :
         * 1) si la configuration a déjà été chargée
         * 2) si elle n'a pas été chargée, elle la charge dans la Registry
         *
         * Appel :
         * à l'extérieur de la classe App_Globals : App_Globals::getConfig()
         * à l'interieur de la classe App_Globals : self::getConfig()
         *
         * @return void
         *
         */

        // si la configuration existe, elle est retournée
        if (self::$_config != null) {
            return self::$_config;
        }

        // Fichier de configuration
        $fichierConfig = APPLICATION_PATH .
                DIRECTORY_SEPARATOR . 'configs' .
                DIRECTORY_SEPARATOR . 'application.ini';

        self::$_config = new Zend_Config_Ini($fichierConfig, APPLICATION_ENV, true);
        // Enregistre l'emplacement et le nom du fichier de config dans la registry
        Zend_Registry::set('config',$fichierConfig);
        // ajouter ici une exception

        return self::$_config; // retour de l'instance de configuration

    } // public static function getConfig()

Un court extrait du fichier application.ini

Code:

[production]
/***************************
Parametrage du framework
***************************/
; Setting PHP -- silencieux en production
phpSettings.display_startup_errors  = 0
phpSettings.display_errors          = 0
phpSettings.date.timezone           = "Europe/Paris"

; Mode debug : 0 / 1 (mettre 0 en production)
debug = 1

; Répertoire des sessions
dirs.tmp = "c:\travail\www\vivier\tmp"

; Repertoire des logs Apache. UNIQUEMENT SI VOTRE ADMINISTRATEUR SYSTEME L'AUTORISE.
dirs.logapache = "C:\dev\tools\Apache-2.2\logs\vivier-error.log"

; Chemins d'accès
bootstrap.path     = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
; j'indique l'emplacement du fichier acl.ini en paramètre....
acl.ini         = APPLICATION_PATH "/configs/acl.ini"  

; Namespace pour l'auto-loading des classes library/App
autoloaderNamespaces[] = "App_"

; Emplacement des View Helpers (les helpers sont recherchés dans l'ordre !)
resources.view.helperPath.App_View_Helper       = "App/View/Helper"
;resources.view.helperPath.Zend_Dojo_View_Helper = "Zend/Dojo/View/Helper" 
;resources.view.helperPath.{Module}_View_Helper =  APPLICATION_PATH "/modules/{module}/views/helpers"

; Initialisation des modules
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

; Controller et action par défaut
resources.frontController.defaultModule         = "public"
resources.frontController.defaultControllerName = "index"
resources.frontController.defaultAction         = "index"
; obligatoire pour que le module "public" soit "namespaced"
resources.frontController.prefixDefaultModule   = true

==================
[b]; Initialisation des plugins
==================
resources.frontController.plugins.auth = "Plugin_Auth"[/b]

; Paramétrage des Layouts
resources.layout.dirs           = APPLICATION_PATH "/layouts"
resources.layout.layoutpath1    = APPLICATION_PATH "/layouts"
resources.layout.layoutpath2    = APPLICATION_PATH "/modules"
resources.layout.layout         = "public"
default.resources.layout.layout = "public"

; Paramétrage du Translate (VOIR BOOTSTRAP)
;resources.translate.registry_key   = "Zend_Translate"
;resources.translate.adapter        = "array"
;resources.translate.options.scan   = "directory"
;resources.translate.data           = APPLICATION_PATH "/languages"

; Paramétrage de la base de données
; pour Zend_Db_Table::getDefaultAdapter()
resources.db.adapter         = "PDO_MYSQL"
resources.db.params.host     = "xxxxx"
resources.db.params.username     = "im"
resources.db.params.password     = "xxxxx"
resources.db.params.dbname     = "im"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.params.charset     = "UTF8"
resources.db.isDefaultTableAdapter = true

; Paramétrage des emails
;resources.mail.transport.type = smtp
;resources.mail.transport.host = "smtp.example.com"
;resources.mail.transport.auth = login
;resources.mail.transport.username = myUsername
;resources.mail.transport.password = myPassword
;resources.mail.transport.register = true ; True by default
;resources.mail.defaultFrom.email = john@example.com
;resources.mail.defaultFrom.name = "John Doe"
;resources.mail.defaultReplyTo.email = Jane@example.com
;resources.mail.defaultReplyTo.name = "Jane Doe"

; View
resources.view[]=""

/***************************
Paramétrage de l'application
***************************/
title = "Le titre de mon application"
version = "bla bla bla"

; Choix du fichier CSS de l'application
; Ne pas modifier le fichier CSS d'origine : "/styles/vivier.css"
css.file = "/styles/vivier.css"

etc....

Le bootstrap :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function _initAutoload() {
        $moduleloader = new Zend_Application_Module_Autoloader(array(
                        'namespace' => '',
                        'basePath'  => APPLICATION_PATH));
        return $moduleloader;
    }

    protected function _initView() {
        // Instancie et Initialise les vues
        $view = new Zend_View();
        $view->setEncoding('UTF-8'); //ou resources.view.encoding = "UTF-8"
        $view->doctype('XHTML1_STRICT');
        $view->env = APPLICATION_ENV;
 
        // Helper DOJO
        // Le dojo view helpers n'est pas situé au même endroit que les view helpers standards
        $view->addHelperPath('Zend/Dojo/View/Helper/','Zend_Dojo_View_Helper');
        
        $view->headMeta('mes balises meta','keywords')
                ->headMeta('Content-Type','text/html; charset=utf-8') //indispensable pour les accents...
                ->headMeta()->appendHttpEquiv('Content-Language', 'fr');

        // Titre de l'application repris dans tous les écrans
        $view->headTitle(App_Globals::getConfig()->title);
        // Fichier CSS utilisé pour screen, projection, print
        $view->headLink()->appendStylesheet(
                App_Globals::getConfig()->css->file,
                'screen, projection, print');

        // Pour Google Map
        // Modifier : ne charger la classe JS que pour le modèle default
        // CONSERVER LES 3 LIGNES SUIVANTES
        //       $this->view->headScript()->appendFile(Globals::getConfig()->googlemap->file);
        //       $valeur = Globals::getConfig()->googlemap->uri . Globals::getConfig()->googlemap->key ;
        //       $this->view->headScript()->appendFile($valeur ,$type = 'text/javascript');

        // Add it to the ViewRenderer
        // The first instantiates the view renderer, but does not attach it to the
        // helper broker. The second grabs if from the helper broker, optionally
        // instantiating it if it does not exist.

        //$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
                'ViewRenderer');
        $viewRenderer->setView($view);

        return $view;
    }

    protected function _initTranslate() {
        // récupère la session (inutile pour ce site mono langue)
        //$session = Zend_Registry::get('session');

        // défini la langue par défaut du site
        $locale = new Zend_Locale('fr_FR');
        Zend_Registry::set('Zend_Locale',$locale);
        //idem pour l'option currency
        $currency = new Zend_Currency('fr_FR');
        Zend_Registry::set('Zend_Currency',$currency);

        // Si la langue existe en session, on récupère la session,
        // sinon, on prend la valeur par défaut
        //$langlocale = isset($session->lang) ? $session->lang : $locale ;
        $langlocale = $locale;

        // instancie l'objet de traduction et lui passe le fichier de langue
        $translate = new Zend_Translate('array', APPLICATION_PATH.'/configs/translate.php','fr');
        //$translate->addTranslation(APPLICATION_PATH.'/configs/translateEN.php','en');

        // on passe la langue courante du site
        $translate->setLocale($langlocale);

        // important pour utiliser le helper
        // le translator est utilisé par Zend_Form, Zend_Validate, Zend_View_Helper...
        Zend_Registry::set('Zend_Translate', $translate);
    }

    protected function _initSession() {
        // initialise la session
        // la session est utilisée par _initTranslate (cas d'un site multi langues)
        // stockage des sessions


        Zend_Session::setOptions(array(
        /* si serveur SSL */    // 'cookie_secure'     => true,
        /* nom de la session*/  // 'name'              => 'maSession',
        /* lieu de stockage */     'save_path'         => App_Globals::getConfig()->dirs->tmp ,
        /* protection XSS */       'cookie_httponly'   => true,
        /* durée vie */            'gc_maxlifetime'    => 60  // 60 secondes
        ));


        /*
        // modif
        // Fichier de configuration
        $fichierConfig = APPLICATION_PATH .
                DIRECTORY_SEPARATOR . 'configs' .
                DIRECTORY_SEPARATOR . 'application.ini';

        $configuration = new Zend_Config_Ini($fichierConfig, APPLICATION_ENV, true);
        // Charge la configuration dans les options de session
        Zend_Session::setOptions($configuration->sessions->toArray());
        // fin modif
        */
        
        // namespace après démarrage de la session
        $session = new Zend_Session_Namespace('vivier');
        //$session->setExpirationSeconds(App_Globals::getConfig()->session->ExpirationSeconds);

        // ***************************************      
        // enregistre la session dans la Registry 
        // lire les variables de la session revient à lire le registre....
        // ***************************************      
        Zend_Registry::set('session', $session);

        return $session;
    }

}

Le plugin qui vérifie les autorisations puis les ACL :

Code:

<?php
/**
 * Plugin d'authentification
 **/

class Plugin_Auth extends Zend_Controller_Plugin_Abstract {
    /**
     * @var Zend_Auth instance
     */
    private $_auth;

    /**
     * @var Zend_Acl instance
     */
    private $_acl;

    //private $_redirector = null;

    /**
     * Chemin de redirection lors de l'échec d'authentification
     */
    const FAIL_AUTH_MODULE     = 'public';
    const FAIL_AUTH_ACTION     = 'login';
    const FAIL_AUTH_CONTROLLER = 'login';

    /**
     * Chemin de redirection lors de l'échec de contrôle des privilèges
     */
    const FAIL_ACL_MODULE     = 'public';
    const FAIL_ACL_ACTION     = 'index';
    const FAIL_ACL_CONTROLLER = 'index';

    /**
     * Constructeur
     */
    public function __construct() {
        $acl_ini = App_Globals::getConfig()->acl->ini;  // paramètre indiquant le nom du fichier acl.ini
        $this->_acl  = new App_Acl_Ini($acl_ini);
        $this->_auth = Zend_Auth::getInstance() ;
    }

    /**
     * Vérifie les autorisations
     * Utilise _request et _response hérités et injectés par le front controller
     **/
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        //echo "Début de Plugin_Auth <br>";

        // l'utilisateur est-il authentifié ?
        if ($this->_auth->hasIdentity()) {
            // yes ! on récupère son role
            $user = $this->_auth->getStorage()->read() ;
            $role = $this->_auth->getStorage()->read()->role;

            //echo "role =" . $role ."<br>";

        } else {
            // no = role "public"
            $role = 'public';
        }

        $module     = $request->getModuleName() ;
        $controller = $request->getControllerName() ;
        $action     = $request->getActionName() ;

        $front = Zend_Controller_Front::getInstance() ;
        $default = $front->getDefaultModule() ;
        // echo "default controller=" . $default . "<br>";

        // compose le nom de la ressource
        $resource = $module.'_'.$controller ;
        // echo "resource cible=".$resource."<br>";

        // est-ce que la ressource existe ?
        if (!$this->_acl->has($resource)) {
            // echo "pas de resource <br>";
            $resource = null;
        }

        // contrôle si l'utilisateur est autorisé
        if (!$this->_acl->isAllowed($role, $resource, $action)) {
            // echo "l'utilisateur n'est pas autorisé à accéder à cette ressource <br>";
            // l'utilisateur n'est pas autorisé à accéder à cette ressource
            // on va le rediriger
            if (!$this->_auth->hasIdentity()) {
                //echo " il n'est pas identifié -> module de login <br>";
                // il n'est pas identifié -> module de login
                $module     = self::FAIL_AUTH_MODULE ;
                $controller = self::FAIL_AUTH_CONTROLLER ;
                $action     = self::FAIL_AUTH_ACTION ;

                // Le bloc suivant est inutile : affiche le message devant le login : bof...
                /*if (!Zend_Registry::isRegistered('erreur')) {
                    $message = 'Vous devez vous identifier';
                    Zend_Registry::set('erreur',$message);
                }*/
            } else {
                // il est identifié -> error de privilèges
                //echo " il est identifié -> erreur de privilèges <br>";
                $module     = self::FAIL_ACL_MODULE ;
                $controller = self::FAIL_ACL_CONTROLLER ;
                $action     = self::FAIL_ACL_ACTION ;

                if (!Zend_Registry::isRegistered('erreur')) {
                    $message = 'La demande a été redirigée car les droits sont insuffisants pour accéder à cette partie du site.';
                    Zend_Registry::set('erreur',$message);
                }
            }
        }
        //echo " GO ! <br>";

        // je fais des "bidouilles" pour enregistrer le nom du module / controller / action 
        // en effet j'utilise le nom du module pour adapter le Layout (layout admin, public....)

        $request->setModuleName($module) ;
        $request->setControllerName($controller) ;
        $request->setActionName($action) ;

        // Path du Layout
        $_path = App_Globals::getConfig()->resources->layout->layoutpath2 ;
        Zend_Layout::getMvcInstance()->setLayoutPath($_path .'/'. $module . '/views/layouts');
        // Affecte un Layout du même nom que le Module Cible (layout différent public, gestion, admin...)
        Zend_Layout::getMvcInstance()->setLayout($module);

        // initialisation des variables APRES modification de la destination cible
        $this->_initVariablesLayouts($module,$controller, $action);

        //echo Zend_Debug::dump($request);
        //echo "Fin de Plugin_Auth <br>";
    }

    /*
 * Récupère le module, controller et action courant et l'affecte à toutes les vues et tous les layouts
    */
    public function _initVariablesLayouts($module, $controller, $action) {
        // La propriété view n'est pas disponible dans les plugins.
        // il faut pour cela aller chercher le viewrenderer et la vue (qui doit être initialisée dedans).
        // S'il elle n'y est pas, on l'initialise
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');

        if (null === $viewRenderer->view) {
            $viewRenderer->init();
        }

// je voulais récupérer le nom du module pour gérer les onglets (public, gestion, admin...) et les 
//positionner "actifs" dans la vue ou le layout 
        // Valiables utilisables dans les VUES
        // ex : appel par $this->moduleactif
        $viewRenderer->view->moduleactif        = $module;
        $viewRenderer->view->controlleractif    = $controller;
        $viewRenderer->view->actionactif        = $action;

        // Valiables utilisables dans les LAYOUTS
        // ex: appel par $this->layout()->moduleactif
        $layout = Zend_Layout::getMvcInstance();
        $layout->moduleactif      = $module;
        $layout->controlleractif = $controller;
        $layout->actionactif      = $action;
    }
}

La classe de vérification des ACL. 
Elle est appelée (instanciée) depuis le plugin. Elle vérifie les droits d'accès qui sont inscrits dans un fichier de paramétrage, acl.ini

Code:

<?php
/**
 * Classe de création des ACL via un fichier de configuration INI
**/

class App_Acl_Ini extends Zend_Acl    {
    public function __construct($file)    {
        
        $roles = new Zend_Config_Ini($file, 'roles') ;
        $this->_setRoles($roles) ;
        
        $ressources = new Zend_Config_Ini($file, 'ressources') ;
        $this->_setRessources($ressources) ;
        
        foreach ($roles->toArray() as $role => $parents)    {
            $privileges = new Zend_Config_Ini($file, $role) ;
            $this->_setPrivileges($role, $privileges) ;
        }
    }
    
    protected function _setRoles($roles)    {
        foreach ($roles as $role => $parents)    {
            if (empty($parents))    {
                $parents = null ;
            } else {
                $parents = explode(',', $parents) ;
            }

            $this->addRole(new Zend_Acl_Role($role), $parents);
        }
        
        return $this ;
    }

    protected function _setRessources($ressources)    {
        foreach ($ressources as $ressource => $parents)    {
            if (empty($parents))    {
                $parents = null ;
            } else {
                $parents = explode(',', $parents) ;
            }

            $this->add(new Zend_Acl_Resource($ressource), $parents);
        }
        
        return $this ;
    }

    protected function _setPrivileges($role, $privileges)    {
        foreach ($privileges as $do => $ressources)    {
            foreach ($ressources as $ressource => $actions)    {
                if (empty($actions))    {
                    $actions = null ;
                } else {
                    $actions = explode(',', $actions) ;
                }
                
                $this->{$do}($role, $ressource, $actions);
            }
        }
        
        return $this ;
    }
}

Pour être plus explicite, le contenu du fichier acl.ini

Code:

; *******************************
; Droits d'accès de l'application
; *******************************

[roles]
public          = null
gestion         = null
administrateur  = null

[ressources]
; définition des ressources du module public (Le module public a donc 5 controllers : index, error, etc)
public_index    = null
public_error    = null
public_login    = null
public_im       = null
public_pdf      = null

; définition des ressources du module gestion
gestion_index    = null;

; définition des ressources du module admin
admin_index      = null
admin_im          = null
admin_periode     = null
admin_technique      = null
admin_utilisateur = null
 

; *********************************
; droits donnés aux roles 
; allow / deny suivi de module_controller
; après le signe = figure la liste des actions 
; (si null, toutes actions permises)
; *********************************
[public]
allow.public_index    = null
allow.public_error    = null
allow.public_login    = null
allow.public_im         = null
allow.public_pdf        = null
;allow.admin_utilisateur = null

[gestion : public]
; gestion hérite de public
; on interdit le login (identification effectuée)
deny.public_login     = login
allow.public_login    = logout
allow.gestion_index    = null

[administrateur : gestion]
; administrateur hérite de gestion
; administrateur peut tout faire
allow.admin_index    = null
allow.admin_im          = null
allow.admin_periode     = null
allow.admin_technique     = null
allow.admin_utilisateur = null

Ensuite, pour ajouter (ou lire...) des variables dans la session, il suffit de faire depuis un controller :

Code:

            // Ajouter les messages à $_valeurs (array...)
            $_valeurs["variable1"]             =  "variable1 blabla"
            $_valeurs["variable2"]            =  "variable2 blabla"
            
            // placer $_valeurs dans la session
            // pour le récupérer ultérieurement dans un autre controller, classe...
            $ns = new Zend_Session_Namespace('vivier');
            $ns->_valeurs = $_valeurs;

Dernière modification par jean (08-09-2011 14:38:45)

Hors ligne

 

#8 07-10-2011 16:17:13

jean
Membre
Date d'inscription: 25-08-2008
Messages: 107

Re: [1.11.9] Mise en Place Zend_Session

Un excellent tutorial pour ceux qui débutent avec Zend_Session :

http://www.zendcasts.com/managing-sessi … e/2009/01/

Jean

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