Ajouter dynamiquement des pages contenant Zend_Navigation à l'exécution

Par Steven Lloyd Watkin , Jeudi 7 Janvier 2010 22h50

Dans le prolongement de mon dernier billet sur ​​Zend_Navigation, Acheminer les demandes de sitemap.xml au contrôleur personnalisé / action , ce poste est d'environ dymnamically ajouter des pages à un conteneur Zend_Navigation au script d'exécution / exécution.

Son très bien préciser vos pages dans un ini ou xml fichier, mais à un moment donné, vous allez devoir changer pages de votre site que vous voulez dans le cadre d'un menu, plan du site, ou pour être inclus dans votre fil d'Ariane. Par conséquent ce que nous devons faire est d'ajouter à nos pages contenant Zend_Navigation à l'exécution. Exemples de ce qui serait en ajoutant des nouvelles, des messages de blog, ou page de commentaires, etc

Dans cet exemple, je vais ajouter quelques nouvelles à mes messages ini de configuration définie de manière statique. Pour obtenir mes configurations nouvelles après page, j'ai utilisé une classe qui retourne un tableau dans le format suivant:

  $ PagesToAdd = array (
   0 =>
     array (
       'Label' histoire => 'fausses nouvelles # 5 ...',
       'Module' => 'www',
       «Route» => «www-index ',
       'Action' 'view' =>,
       «Contrôleur» des «nouvelles» =>
       'Params' => array (
           'Id' => '5-Fake-nouvelles-histoire - 5 ')
     ),
   1 =>
     array (/ * Plus de détails page /),
  ); 

Comme vous le remarquerez que la fonction a retourné un tableau dans lequel figurent des tableaux qui composent la config des tableaux pour Zend_Navigation_Page_Mvc. Par conséquent, en boucle sur les pages du tableau Zend_Navigation nouveaux peuvent être créés à partir du tableau de configuration. La prochaine chose à faire dans le cadre de la boucle est d'ajouter les pages dans la bonne position (alternativement pages peuvent être ajoutées en vrac à l'aide - addPages> () la méthode).

Pour ce faire, trouver la page que vous souhaitez ajouter des sous-pages et simplement à ajouter les pages. Dans ce cas, j'ai utilisé le code suivant pour trouver ma page:

  $ Container-> findOneBy ('label', 'Dernières Nouvelles ") -> addPage ($ page); 

Mon initialisation de navigation globale dans le bootstrap ressemble donc à ceci:

  / **
      * Utilisé pour le traitement de navigation du haut-niveau
      *
      Zend_Navigation * @ return
      * /
     _initNavigation fonction protégée ()
     {
         $ This-> bootstrap ("layout");
         $ Layout = $ this-getResource> ("layout");
         $ View = $ getView layout-> ();
         $ Config = new Zend_Config_Ini (
             APPLICATION_PATH.  »/ Configs / navigation.ini, APPLICATION_ENV);

         $ Container = Zend_Navigation nouvelles (par défaut $ config->);
         / / Maintenant on ajoute les 25 derniers bulletins de nouvelles
         $ = Nouvelles Nouvelles new ();
         $ Pages = $ getNavigationEntries nouvelles-> ();
         foreach ($ pages AS $ page) {
        	 $ Page = Zend_Navigation_Page_Mvc nouvelles ($ page);
        	 $ Container-> findOneBy ('label', 'Dernières Nouvelles ") -> addPage ($ page);
         }
         $ Navigation view-> ($ container);
     } 

Une chose qui doit être ajoutée est une forme de mise en cache (à l'aide Zend_Cache sans doute;)) sinon cela va être très coûteuse à chaque chargement de page.

6 Responses to "dynamiquement ajouter des pages à conteneurs Zend_Navigation at runtime"

  1. M. homme dit:

    C'est exactement ce que je cherchais - merci pour un exemple très clair. Cheers. G

  2. A387 a écrit:

    Nice post! J'ai quelque peine lancer une classe de modèle dans le bootstrap. Toute idée de pourquoi application classes / modèle ne sont pas disponibles sur le bootstrap? Votre classe est appelée «Nouvelles nouvelles () ', au lieu que je voudrais ajouter les pages de navigation en obtenant une arborescence de navigation à partir d'une classe du modèle. Si vous avez une idée, s'il vous plaît faites le moi savoir! ;)

    • Mon modèle a été édité pour le poste, son nom correct dans le code est Pro_News et est capté par le chargeur automatique.

      Devine que vous n'êtes pas en utilisant des modules? Mais si c'est le cas de votre modèle devrait être appelé _News pour ZF pour ramasser par défaut (je n'utilise pas ce système moi-même).

      Je vous suggère de vérifier le chemin d'inclusion de votre méthode bootstrap pour voir si elle contient "application / models" ou inclure le fichier manuellement.

      • A387 a écrit:

        Eh bien, je utiliser des modules, mon mauvais. Mais vous suggérons chargement automatique devrait fonctionner? Eh bien, j'ai de creuser un peu plus profonde. Pour le moment j'utilise la fonction addPage dans le BaseControllers, qui n'est pas vraiment la performance sympathique ... hehe. Merci pour votre réponse.

  3. Mon modèle a été édité pour le poste, son nom correct dans le code est Pro_News et est capté par le chargeur automatique.

    Devine que vous n'êtes pas en utilisant des modules? Mais si c'est le cas de votre modèle devrait être appelé _News Pour ZF pour ramasser par défaut (je n'utilise pas ce système moi-même).

    Je vous suggère de vérifier le chemin d'inclusion de votre méthode bootstrap pour voir si elle contient "application / models" ou inclure le fichier manuellement.

Laisser un commentaire













Thème par Panorama Themocracy

5 visiteurs en ligne dès maintenant
4 personnes, 1 bots, 0 membres
Maximum de visiteurs aujourd'hui: 12 à 07:57 UTC
Ce mois-ci: 22 au 06/08/2011 00:30 UTC
Cette année: 130 à 28-03-2011 10:40 pm UTC
Tous les temps: 130 à 28-03-2011 10:40 pm UTC