Bonjour
je désire ajouter une action pour pouvoir passer des variables a mon layout de mon application, car suivant le profile d'utilisateur connecté a mon site je desire lui permettre de personalisé son menu
any idea !!!?
Bonjour
je désire ajouter une action pour pouvoir passer des variables a mon layout de mon application, car suivant le profile d'utilisateur connecté a mon site je desire lui permettre de personalisé son menu
any idea !!!?
Utiliser des slots ?
http://www.symfony-project.org/jobee..._04_les_slot_s
Il n'est pas possible de mettre une classe d'action sur le layout.
Mais ...
Il existe un petit outil très pratique qui est le "compoment" une sorte de partiel mais avec un accès à la couche contrôleur et modèle.
Il convient donc de créer dans un module générique (qui ne sert qu'à cela ou à mettre tous les componements et partiel commun) le componement menu. Il aura la possibilité d'accéder aux donnée du user connecté, et, de là, de récupérer les options du menus qui lui conviennent.
Un exemple ?
le shema de la table du menu (peut largement être amélioré)
A noter qu'il n'y a aucune liaison directe avec utilisateur. C'est en fonction des groupes de l'utilisateur que le menu s'affiche ou non. Il est donc compatible avec sfGuard;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 Menus: actAs: I18n: fields: [ nom, aide ] columns: position: #position d'affichage type: integer nom: #nom du menu type: string(20) aide: #aide sur l'option de menu type: string(200) indexes: idx_position: fields: [ position ] options: type: INNODB charset: utf8 MenuDetails: #option des menus actAs: I18n: fields: [ nom, aide ] columns: menu_id: #menu parent type: integer position: #position d'affichage type: integer nom: #nom de l'option de menu type: string(20) aide: #aide sur l'option de menu type: string(200) destination: #adresse de destination pour ce menu type: string(250) groupe: #groupe qui doit voir l'affichage de l'option du menu (guest, all, ...) type: string(10) default: guest admin: #vrai si visible pour les administeurs type: boolean default: false user: #vrai si visible pour les utilisateurs type: boolean default: false invite: #vrai si visible pour les invit�s type: boolean default: false indexes: idx_menu: fields: [ menu_id ] idx_position: fields: [ menu_id, position ] relations: Menus: onDelete: CASCADE local: menu_id foreign: id foreignAlias: MenuDetails options: type: INNODB charset: utf8
Le componment.
dans : apps/<nomApplication>/modules/generic/actions/components.class.php
Cela mériterait d'être amélioré, toute la partie création de la requête devrait être virée dans la couche modèle, mais c'est un de mes premier code...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 class genericComponents extends sfComponents { /* * Affichage du menu de l'application */ public function executeMenu() { $country = $this->getUser()->getCulture(); $q = Doctrine_Query::create()-> from('Menus m')-> leftJoin('m.MenuDetails d')-> leftJoin('m.Translation tm WITH tm.lang = ?', $country)-> leftJoin('d.Translation td WITH td.lang = ?', $country); /* * Sélectione les entrées en fonction des groupes */ // ********** Préparation de la chaine de recherche pour les groupes de l'utilisateur $grpComp = $this->getUser()->isAuthenticated() ? $this->getUser()->getCredentials() : array('guest'); // ********** Ajoute dans tous les cas le "groupe" 'all' // ********** et effectue la recherche $q->whereIn('groupe', array_merge($grpComp, array('all'))); $this->menus = $q->execute(); }
la partie template
dans : apps/<nomApplication>/modules/generic/templates/_menu.php
Il ne reste plus qu'à l'intégrer dans le layout
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <h2>Menu</h2> <ul> <?php foreach ($menus as $menu): ?> <li><?php echo $menu->getNom() ?> <ul> <?php foreach($menu->getMenuDetails() as $detail): ?> <li><?php echo link_to($detail->getNom(), $detail->getDestination(), array('title' => $detail->getAide())) ?></li> <?php endforeach; ?> </ul></li> <?php endforeach; ?> </ul>
Il est prévu pour fonctionner en multi-langue avec la traduction dans les tables, je ne suis pas sur que cela soit une bonne idée et j'hésite régulièrement entre ça et une traduction avec la fonction __(). L'avantage ici est que l'on peut envisager un module dans le backend qui permet à l'administrateur du site de gérer le menu lui même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4<div id="navigation"><!-- Barre de gauche de la page --> <?php include_component('generic', 'menu') ?> </div><!-- End div:left -->
A prendre tel quel, sans plus, il fonctionne chez moi sur deux applications, il faudra un jour que j'en fasse un plugin, mais pour l'instant, j'en ai un autre pour créer des listes en gestation et il me prend beaucoup de temps.
Bonne chance
Partager