Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 29-11-2008 17:01:48

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

[Zend_auth][1.7] stratégie afficher ou masquer un lien ?

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 :

Code:

$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 :

Code:

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

 

#2 30-11-2008 17:55:20

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_auth][1.7] stratégie afficher ou masquer un lien ?

Pour l'instant j'ai fait ça :

j'ai ajouter un action helper
Bootstrap :

Code:

// 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

Code:

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 :

Code:

// 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

Code:

<?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

Code:

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

 

#3 14-01-2009 18:43:24

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_auth][1.7] stratégie afficher ou masquer un lien ?

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 :

Code:

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 :

Code:

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

 

#4 16-01-2009 09:53:56

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Zend_auth][1.7] stratégie afficher ou masquer un lien ?

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 ?


----
Gruiiik !

Hors ligne

 

#5 16-01-2009 12:09:15

baboune
Membre
Date d'inscription: 29-11-2008
Messages: 103

Re: [Zend_auth][1.7] stratégie afficher ou masquer un lien ?

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.

Code:

if($acl->isAllowed($this->user->role, 'index', 'ajouter'))
{
    //J'afffiche les boutons
}

sinon il y a cette méthode la

Code:

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

Code:

}
echo $this->Link(array('action'=>'ajouter', 'controller'=>'actualite'), "Ajouter une actualité");
?>

sauf que l'on est plus en predispatch.

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