Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-06-2009 15:23:43

Diaoul
Membre
Date d'inscription: 28-06-2009
Messages: 13
Site web

[1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

Salut à tous,

Mon site se décompose en plusieurs parties :
- Le menu (à gauche)
- Une barre centrale (sous le header)
- Un autre menu (à droite)
- Le contenu (au centre)

Le problème est que pour rendre cela, je passe 3 fois dans la boucle de distribution.
Que j'utilise ActionStack, Action, ou Forward, il me semble que l'on refait un tour de boucle non ?

Mes éléments de layout (cités ci-dessus) ne nécessitent pas de traitement particulier.
Pour la majorité des cas, il me suffit de savoir si l'utilisateur est authentifié (hasIdentity) et une ou deux préférences (situées dans le Zend_Auth_Storage, persistant donc) afin d'afficher un item ou un autre.

Par exemple :
- Si l'utilisateur est identifié, alors le menu contiendra un lien de plus, sinon on affiche le classique.
- Si préférence_A alors "display: block;" d'une div de la barre central, sinon "display: none;"

Bref, le controller ne fait pas grand chose.

Je voudrais optimiser tout ça :
- Est-ce vraiment utile de passer par un controller et de faire 3 fois la boucle dans mon cas ?
- Comment faire en sorte que mes variables (hasIdentity, préférence_A, etc..) qui sont en stockage persistant, soient accessibles dans la vue (sans que ce soit une entorse au MVC) ?

Merci beaucoup smile

Hors ligne

 

#2 29-06-2009 08:24:32

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

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

C'est à toi de juger de la méthode à employé :
- plugin
- *Dispatch de controller
- helper (soit ton propre helper, soit via le helper d'action, ou helper navigation)
- partial (rien ne t'empeche de faire un  if($this->user->hasIdentity(): dans ta vue)

Dernière modification par nORKy (29-06-2009 08:25:36)


----
Gruiiik !

Hors ligne

 

#3 29-06-2009 09:16:17

Diaoul
Membre
Date d'inscription: 28-06-2009
Messages: 13
Site web

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

if($this->user->hasIdentity()): est "compatible" avec MVC ?

Tant mieux :p

Par ailleurs, si j'ai un utilisateur (model) en session (Zend_Auth_Storage) et que je souhaite le rendre disponible dans toutes les vues et layouts, comment faudrait-il que je fasse ?
Est-ce correct de mettre ça en preDispatch par exemple ou quelque chose comme ça, ou alors vaudrait-il mieux un View Helper dédié ?

Code:

$this->user()->etc...

Merci

Hors ligne

 

#4 29-06-2009 19:20:22

phpman
Membre
Date d'inscription: 20-03-2008
Messages: 138

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

Idée à la con peut être mais pourquoi ne pas utiliser un view helper et instancier ton model dedans?
Ca peut paraitre bizarre mais pour certains car on on veut par exemple afficher la liste des derniers utilisateurs sur telle ou telle page, ça permet d'avoir un composant completement indépendant qui se charge lui même de récupérer les données. Ca évite le traitement lourd que peut être un actionHelper.

Enfin je dis ça, je donne qu'un avis, d'autres me contrediront peut etre big_smile

Hors ligne

 

#5 29-06-2009 22:35:32

Diaoul
Membre
Date d'inscription: 28-06-2009
Messages: 13
Site web

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

J'avoue ne pas trop connaitre les helpers de navigation. Par contre il me semble que le helper d'action relance une boucle de distribution et c'est ce que je souhaiterai éviter sad

Donc je retiendrai plutôt la solution :
- partial (rien ne t'empeche de faire un  if($this->user->hasIdentity(): dans ta vue)

Le souci c'est : Comment mettre "user" dans cette vue ? Pour pouvoir faire ça il faut bien que je mette quelque part que $this->view->user = Zend_Auth::getInstance()->getIdentity(); non ?
La question c'est : où ? ^^

Je débute avec le Framework, tout n'est pas encore très clair dans me tête :s

Merci

Hors ligne

 

#6 29-06-2009 23:14:13

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

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

Si tu n'as pas l'object View sous la main, tu récupères le helper viewrenderer, puis tu accèdes à la propriété public 'view' du helper

Ou alors, directement en faisant Zend_Auth::getInstance()->hasIdentity() / Zend_Auth::getInstance()->getIdentity()

Dernière modification par nORKy (29-06-2009 23:16:40)


----
Gruiiik !

Hors ligne

 

#7 29-06-2009 23:30:28

Diaoul
Membre
Date d'inscription: 28-06-2009
Messages: 13
Site web

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

nORKy a écrit:

Ou alors, directement en faisant Zend_Auth::getInstance()->hasIdentity() / Zend_Auth::getInstance()->getIdentity()

Dans la vue et rendu avec partial j'imagine ?

Pour une div de login toujours affichée c'est le même principe mais un petit peu plus corsé :
On affiche une instance de Form_Login si on est pas identifié, Form_Logout sinon.
-> Ça peut passer l'instanciation d'un formulaire dans une vue en fonction de si on est authentifié ? C'est pousser le bouchon un peu loin non ? Je peux déporter ce petit traitement dans un ViewHelper ?

Il y a du traitement mais seulement après l'appui sur le bouton "login" (ou "logout") qui renvoi au controller "auth", action "login" (ou "logout") qui fait le "authenticate" et renvoie à la page précédant l'appui sur le bouton.

Comment faire au mieux dans ce cas là ?

Merci encore, je progresse smile

Dernière modification par Diaoul (29-06-2009 23:44:44)

Hors ligne

 

#8 30-06-2009 11:06:04

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

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

Oui, un viewHelper, c'est très bien, c'est le plus facile et logique à faire.

Un viewHelper est cencé retourné du code html, donc, tu codes ton viewHelper pour qu'il retourné un formulaire rendu, ou bien un lien http pour la déconnection.

A toi de sentir ce qui te convient le mieux.

Code:

if (Zend_Auth::getInstance()->hasIdentity()) {
  $form = new My_Form_Login();
  return $form->render();
}
return '<a href="/logout">Déconnexion</a>';

----
Gruiiik !

Hors ligne

 

#9 01-07-2009 22:22:00

Diaoul
Membre
Date d'inscription: 28-06-2009
Messages: 13
Site web

Re: [1.8] Eviter ActionStack pour les choses simples (menu, sidebar, etc.)

Merci, ça marche nikel.

Par contre pour le Logout, c'était pas aussi simple parce que j'affichais des informations supplémentaires.
Du coup j'ai fait un partial à part.

Dans le layout :

Code:

 <div id="auth">
    <?php
    if (Zend_Auth::getInstance()->hasIdentity()) {
        echo $this->partial('partials/logout.phtml'); 
    } else {
        echo $this->printLoginForm();
    }
    ?>
</div>

et bien sur, le helper :

Code:

<?php
class Zend_View_Helper_PrintLoginForm
{
    public function printLoginForm()
    {
        $form = new Form_Login();
        return $form->render();
    }
}
?>

Si jamais vous souhaitez faire passer des variables dans toutes les vues et/ou tous les layouts, je vous conseil de regarder par ici : http://www.z-f.fr/forum/viewtopic.php?id=2502
Ça m'a bien aidé wink

Ciao et merci encore

Dernière modification par Diaoul (01-07-2009 22:23:38)

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