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

Zend Framework PHP Discussion :

Lien mvc et génération de menu [ZF 1.11]


Sujet :

Zend Framework PHP

  1. #1
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut Lien mvc et génération de menu
    Bonjour à tous,

    Je suis en train de créer un module permettant d'administrer un menu. L'ajout de page entrainera un enregistrement à la fais d'une page dans une table page et de son lien dans une table menu. Jusqu'ici pas de soucis.

    Ma question porte sur la façon de gérer l'enregistrement et l'affichage de l'URL d'une page du menu. Jusqu'ici, j'ai toujours utiliser l'aide de vue baseUrl() ou url() pour générer des liens MVC dans mes scripts de vue. Or, je génère mon menu avec une fonction récursive qui me renvoi le menu sous forme d'un string.

    Et là, je ne sais pas comment dire à l'application de traduire les données de ma BD (module, controller, action) en un lien avant de retourner le menu sous forme de string.

    Un peu de 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
        function genererRubriquesMenu($parent, $niveau, $tab) {
            $tools = new Application_Model_Tools();
            $menu = '';
    	$niveau_precedent = 0;
    	 
    	foreach ($tab AS $valeur) {
    		if ($parent == $valeur['id_parent_menu']) {
    			if ($niveau_precedent < $niveau) $menu .= "\n<ul><li class=\"arrow\"></li>\n";
    			$menu .= '<li class="' . $valeur["classe_menu"] . '"><a href="'. $this->url(array("module" => "page", "controller" => "index", "action" => "afficher"), "", true) . '">LIEN TEST</a>';
    			$niveau_precedent = $niveau;
    			$menu .= $tools->genererRubriquesMenu($valeur['id_menu'], ($niveau + 1), $tab);
    		}
    	}
    	if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)){
                $menu .= "</ul>\n</li>\n";
            }else{
                $menu .= "</li>\n";
            }
    
    	return $menu;
        }
    La ligne en rouge correspond à ce que je souhaite obtenir.

    Est-il possible d'utiliser une fonction du framework (dans le style de baseURL()) pour générer mes liens MVC à la volée comme dans une fonction récursive classique ? Ou suis-je obligé de passer par l'utilisation des Zend_Navigation_Page_Mvc ?

    Je pourrai bien sur enregistrer en dur le lien, mais il n'y aurai pas la directive $this->url(array([.......])"", true); permettant de spécifier au framework qu'il ne doit pas garder l'url en cours.

    Merci d'avance

  2. #2
    Membre habitué
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Points : 167
    Points
    167
    Par défaut
    Bonjour Njörd,

    Ta fonction genererRubriquesMenu tu l'a placé où ? Dans un controller, model ou view ?

    Si la fonction est dans :
    - Un controller, tu utilises l'aide d'action Zend_Controller_Action_Helper_Url.
    - Une view, tu utilise l'aide de vue Zend_View_Helper_Url.
    - Un model, tu utilise la class Zend_Navigation_Page_Mvc.

    Enjoy!

  3. #3
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Bonjour abenlahsen,
    Citation Envoyé par abenlahsen Voir le message
    Si la fonction est dans :
    - Un controller, tu utilises l'aide d'action Zend_Controller_Action_Helper_Url.
    - Une view, tu utilise l'aide de vue Zend_View_Helper_Url.
    - Un model, tu utilise la class Zend_Navigation_Page_Mvc.
    Merci beaucoup, c'est exactement le genre de réponse que j'étais venu chercher

    Citation Envoyé par abenlahsen Voir le message
    Ta fonction genererRubriquesMenu tu l'a placé où ? Dans un controller, model ou view ?
    Alors, cette fonction se trouve dans une classe Php situé dans le dossier models de l'application (donc Zend_Navigation_Page_Mvc). C'est ma boîte à outils pour les fonctions que j'utilise un peu partout : formats de date, role, menu, ... je trouve ça intéressant car ça permet de diminuer le code à écrire dans les controllers.

    Je n'ai plus qu'à me pencher sur tout ça.

    Enjoy donc

  4. #4
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut Partage
    Rebonjour,

    Je viens partager les modifications :

    La BDD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id_menu | libelle_menu | url_menu | classe_menu | classe_lien_menu | rang_menu |module_menu | controller_menu | action_menu | id_page_menu | est_mvc_menu | est_valide_menu | id_parent_menu
    J'utilise du jquery pour dynamiser l'affichage du menu d'où les classes dans la BD. est_mvc_menu est un peu confuse pour le moment, elle me permet juste de faire la distinction entre un lien module/controller/action et un lien module/controller/action/id/ZZZ. Enfin, url_menu n'est pas utilisé dans la suite du code.

    J'utilise les viewRenderer pour afficher mon layout et donc mon menu.

    Bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    protected function _initActionStack() {
            $actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack');
            $actionStack->actionToStack(new Zend_Controller_Request_Simple('header', 'index', 'default'));
            $actionStack->actionToStack(new Zend_Controller_Request_Simple('menu', 'index', 'default'));
            return $actionStack;
        }
    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
    16
    <body>
            <div id="header">
                <?php echo $this->layout()->header ?>
            </div>
     
            <div id="menu">
                <?php echo $this->layout()->menu ?>
            </div>
     
            <div id="corps">
                <?php echo $this->layout()->content ?>
            </div>
     
            <div id="footer"></div>
     
        </body>
    IndexController (controller par défaut)
    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
    public function init(){
     
        }
     
        public function indexAction(){
     
        }
     
        public function headerAction(){
     
        }
     
        public function menuAction(){
            $tools = new Application_Model_Tools();
            $menu = new Application_Model_DbTable_Menu();
     
            $tab = $menu->recupererToutesLesRubriquesMenu();
            $rubriques = $tools->genererRubriquesMenu(0,0,$tab);
     
            $this->view->rubriques = $rubriques;
            $this->_helper->viewRenderer->setResponseSegment('menu');
        }
    Dans la vue menu liée au controller index par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <ul id="jMenu">
        <?php echo $this->rubriques ?>
    </ul>
    Cela affichera le menu partout.

    Le model Boîte à outils (tools) :
    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
    function genererRubriquesMenu($parent, $niveau, $tab) {
            $tools = new Application_Model_Tools();
            $menu = '';
            $niveau_precedent = 0;
            
            foreach ($tab AS $valeur) {
                if ($parent == $valeur['id_parent_menu']) {
    
                    // Si il y a des rubriques à ce niveau
                    if ($niveau_precedent < $niveau){
                        $menu .= "\n<ul><li class=\"arrow\"></li>\n";
                    }
                    
                    // Préparation de la page MVC
                    if ($valeur['est_mvc_menu'] == 0) {
                        $page = new Zend_Navigation_Page_Mvc(array(
                                    'action' => $valeur['action_menu'],
                                    'controller' => $valeur['controller_menu'],
                                    'module' => $valeur['module_menu']
                                ));
                    } else {
                        $page = new Zend_Navigation_Page_Mvc(array(
                                    'action' => $valeur['action_menu'],
                                    'controller' => $valeur['controller_menu'],
                                    'module' => $valeur['module_menu'],
                                    'params' => array('id' => $valeur['id_page_menu'])
                                ));
                    }
                    
                    // Génération du lien de la page MVC
                    $menu .= '<li class="' . $valeur["classe_menu"] . '"><a href="' . $page->getHref() . '" class="' . $valeur['classe_lien_menu'] . '">' . $valeur["libelle_menu"] . '</a>';
    
                    $niveau_precedent = $niveau;
                    $menu .= $tools->genererRubriquesMenu($valeur['id_menu'], ($niveau + 1), $tab);
                }
            }
            if (($niveau_precedent == $niveau) && ($niveau_precedent != 0)) {
                $menu .= "</ul>\n</li>\n";
            } else {
                $menu .= "</li>\n";
            }
    
            return $menu;
        }
    Voilà Ce code doit être amélioré (variables, nombre d'actions appelées, cache, ...) mais il permet déjà d'avoir une idée pour générer un menu dynamiquement dans zend.

    N'hésitez pas à critiquer

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

Discussions similaires

  1. [AC-2003] lien hypertexe à partir d'un menu déroulant
    Par cabonegro dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/07/2010, 17h25
  2. Lien et cadre pour un menu
    Par djamsdjams dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 13/12/2008, 22h21
  3. génération de menu dvd
    Par robert_trudel dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 31/08/2008, 22h19
  4. [AJAX] Génération de menu déroulant contenant une tableau php
    Par emageren dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/04/2007, 11h46
  5. Liens (x)html dans un menu déroulant en flash
    Par yann745 dans le forum Flash
    Réponses: 13
    Dernier message: 17/04/2007, 10h57

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