Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/01/2012, 14h55   #1
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 27
Points : 17
Points : 17
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 :
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
Njörd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 10h24   #2
Membre actif
 
Homme Ahmed Benlahsen
Ingenieur BI - Dev Web Senior
Inscription : décembre 2009
Messages : 118
Détails du profil
Informations personnelles :
Nom : Homme Ahmed Benlahsen
Localisation : Maroc

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

Informations forums :
Inscription : décembre 2009
Messages : 118
Points : 157
Points : 157
Envoyer un message via MSN à abenlahsen Envoyer un message via Skype™ à abenlahsen
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!
abenlahsen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 08h50   #3
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 27
Points : 17
Points : 17
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
Njörd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 09h45   #4
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 27
Points : 17
Points : 17
Par défaut Partage

Rebonjour,

Je viens partager les modifications :

La BDD
Code :
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 :
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 :
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 :
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 :
1
2
3
<ul id="jMenu">
    <?php echo $this->rubriques ?>
</ul>
Cela affichera le menu partout.

Le model Boîte à outils (tools) :
Code :
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
Njörd est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h55.


 
 
 
 
Partenaires

Hébergement Web