Dynamiskt lägga till sidor Zend_Navigation container vid körning

Genom Steven Lloyd Watkin , Torsdag 7Januari 2010 22:50

I en fortsättning på mitt senaste inlägg om Zend_Navigation, Route begäran om sitemap.xml till anpassade controller / action , detta inlägg om dymnamically lägga till sidor till en Zend_Navigation container vid körning / script utförande.

Dess ju bra att ange dina sidor i en ini-eller XML -fil men någon gång du kommer att få ändra sidor på din webbplats som du vill som en del av en meny, webbplatskarta, eller som skall ingå i sökvägen. Därför vad vi behöver göra är att lägga till sidor till vårt Zend_Navigation container vid körning. Exempel på detta skulle vara att lägga till nyheter, blogginlägg eller kommentarer sida, etc.

I detta exempel kommer jag att lägga till några nyheter inlägg till mina statiskt definierad ini config. För att få mina nyheter konfigurationer inlägg sida har jag använt en klass som returnerar en matris i följande format:

 $ PagesToAdd = array (0 => array ('label' => 'Fake nyhet # 5 ...',' modul '=>' www ',' väg '=>' www-index ", 'action' = > 'Visa', 'controller' => 'nyheter', 'Params' => array ('id' => '5-Fake-news-historia - 5 ')), 1 => array (/ * Fler sida detaljer * /),); 

Som du kommer att märka att funktionen har återvänt en array där finns matriser som bildar config arrayer för Zend_Navigation_Page_Mvc. Därför kan genom att loopa över arrayen nya Zend_Navigation sidor skapas från config matrisen. Nästa sak att göra som en del av slingan är att lägga sidorna i rätt läge (alternativt sidor kan läggas till i bulk genom -> addPages ()-metod).

För att göra detta, leta upp den sida du vill lägga till undersidor till och helt enkelt lägga till sidor. I det här fallet har jag använt följande kod för att hitta min sida:

  $ Container-> findOneBy ("etikett", "Senaste nytt") -> addPage ($ sida); 

Min övergripande navigering initialisering i bootstrap ser därför ut så här:

  / **
      * Används för att hantera högsta nivå navigering
      *
      * @ Return Zend_Navigation
      * /
     skyddad funktion _initNavigation ()
     {
         $ This-> bootstrap ('layout');
         $ Layout = $ this-> getResource ('layout');
         $ Se = $ layout-> getView ();
         $ Config = new Zend_Config_Ini (
             APPLICATION_PATH.  "/ Configs / navigation.ini", APPLICATION_ENV);

         $ Container = new Zend_Navigation ($ config-> standard);
         / / Nu lägger de sista 25 nyhetsrapporterna
         $ Nyhet = new Nyheter ();
         $ Sidor = $ news-> getNavigationEntries ();
         foreach ($ sidor som $ sida) {
        	 $ Page = new Zend_Navigation_Page_Mvc ($ sida);
        	 $ Container-> findOneBy ("etikett", "Senaste nytt") -> addPage ($ sida);
         }
         $ Visa-> navigering ($ behållare);
     } 

På sak som behöver läggas till är någon form av caching (med Zend_Cache förmodligen;)) annars kommer att bli ganska dyrt med varje sida laddas.

6 Responses to "dynamiskt lägga till sidor Zend_Navigation container vid körning"

  1. Mr Man säger:

    Det är precis vad jag letade efter - tack för ett riktigt tydligt exempel. Skål. G

  2. A387 säger:

    Nice inlägg! Jag har lite problem med att inleda en modell klass i bootstrap. Varje ledtråd till varför ansökan / modell klasser inte finns tillgängliga från bootstrap? Din klass kallas "nya nyheter ()" i stället skulle jag vilja lägga navigeringssidor genom att få ett navigeringsträd från en modell klass. Om du har en idé, låt mig veta! ;)

    • Min modell har redigerats för tjänsten, är dess riktiga namn i koden Pro_News och plockas upp av Autoloader.

      Gissar du inte använder moduler? Men om så att din modell ska kallas _News för ZF att plocka upp som standard (jag använder inte detta system själv).

      Jag skulle föreslå att kontrollera bland annat vägen från din bootstrap-metoden för att se om den innehåller "application / modeller" eller inkludera filen manuellt.

      • A387 säger:

        Jo jag använder moduler, mina dåliga. Men du föreslår automatisk laddning ska arbeta? Jo, jag gräva i det lite djupare. Just nu använder jag addPage funktion i BaseControllers, som egentligen inte är prestanda vänlig ... hehe. Tack för ditt svar.

  3. Min modell har redigerats för tjänsten, är dess riktiga namn i koden Pro_News och plockas upp av Autoloader.

    Gissar du inte använder moduler? Men om så att din modell ska heta _News För ZF att plocka upp som standard (jag använder inte detta system själv).

    Jag skulle föreslå att kontrollera bland annat vägen från din bootstrap-metoden för att se om den innehåller "application / modeller" eller inkludera filen manuellt.

Lämna ett svar













Panorama Tema av Themocracy

7 besökare online nu
2 gäster, 5 bots, 0 medlemmar
Max besökare idag: 22 kl 07:58 UTC
Denna månad: 52 på 18-06-2011 03:11 UTC
I år: 130 på 28-03-2011 22:40 UTC
Tiderna: 130 på 28-03-2011 10:40 UTC