IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Ajouter une action.class sur un layout pour personalisé le menu [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2008
    Messages : 176
    Points : 106
    Points
    106
    Par défaut Ajouter une action.class sur un layout pour personalisé le menu
    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 !!!?

  2. #2
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933

  3. #3
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    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é)
    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
    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;

    Le componment.
    dans : apps/<nomApplication>/modules/generic/actions/components.class.php
    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();
        }
    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...

    la partie template
    dans : apps/<nomApplication>/modules/generic/templates/_menu.php
    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 ne reste plus qu'à l'intégrer dans le layout
    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 -->
    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.

    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
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2008
    Messages : 176
    Points : 106
    Points
    106
    Par défaut
    waw chapeau a mimi
    MErci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter une action aux blocs avec la meme Classe
    Par thebarbarius dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/04/2010, 18h58
  2. Ajouter une action sur une barre de menu
    Par alex2746 dans le forum Qt
    Réponses: 2
    Dernier message: 01/04/2010, 15h39
  3. Réponses: 3
    Dernier message: 29/12/2009, 12h00
  4. Réponses: 6
    Dernier message: 24/12/2008, 13h17
  5. Liens html pour un éditeur (ajouter une action javascript à un lien html)
    Par psychoBob dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 25/05/2006, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo