Dynamisk legge til sider Zend_Navigation container under kjøring

Ved Steven Lloyd Watkin , torsdag 7 januar 2010 22:50

I en fortsettelse på mitt siste innlegg om Zend_Navigation, Route forespørsler om sitemap.xml å egendefinerte kontroller / action , innlegget handler dette om dymnamically legge til sider til en Zend_Navigation container under kjøring / script kjøring.

Dens vel og bra spesifisere dine sider i en ini-eller xml -fil, men på et tidspunkt er du nødt til å endre sider på nettstedet ditt som du ønsker som en del av en meny, sitemap, eller å bli inkludert i brødsmule sti. Derfor hva vi trenger å gjøre er å legge til sider i vår Zend_Navigation container under kjøring. Eksempler på dette ville være å legge til nyheter, blogginnlegg, eller side kommentarer, etc.

I dette eksempelet jeg kommer til å legge noen nyheter innlegg til min statisk definerte ini config. For å få mine nyheter innlegg siden konfigurasjoner Jeg har brukt en klasse som returnerer en matrise i følgende format:

 $ PagesToAdd = array (0 => array ('label' => 'Fake nyhetsartikkelen # 5 ...',' modul '=>' www ',' rute '=>' www-indeks ',' action '= > 'syn', 'controller' => 'news', 'params' => array ('id' => '5-Fake-news-historien - 5 ')), 1 => array (/ * Mer siden details * /),); 

Som du vil legge merke til at funksjonen har returnert en matrise der er inneholdt arrays som utgjør config arrays for Zend_Navigation_Page_Mvc. Derfor kan av looping over array nye Zend_Navigation sider opprettes fra config array. Den neste tingen å gjøre som en del av loopen er å legge til sidene i riktig posisjon (alternativt sider kan legges i bulk ved hjelp -> addPages ()-metoden).

For å gjøre dette, finn siden du ønsker å legge til sub-sidene og enkelt legge til sider. I dette tilfellet har jeg brukt følgende kode for å finne min side:

  $ Container-> findOneBy ('label', 'Siste nytt') -> addPage ($ side); 

Mitt overordnede navigasjon initialisation i bootstrap ser derfor slik ut:

  / **
      * Brukes til håndtering toppnivå navigasjon
      *
      * @ Return Zend_Navigation
      * /
     beskyttet funksjon _initNavigation ()
     {
         $ This-> bootstrap ('layout');
         $ Layout = $ this-> getResource ('layout');
         $ View = $ layout-> getView ();
         $ Config = nye Zend_Config_Ini (
             APPLICATION_PATH.  '/ Configs / navigation.ini', APPLICATION_ENV);

         $ Container = nye Zend_Navigation ($ config-> default);
         / / Nå legger de siste 25 nyheter
         $ News = ny News ();
         $ Sider = $ news-> getNavigationEntries ();
         foreach ($ sider AS $ side) {
        	 $ Side = nye Zend_Navigation_Page_Mvc ($ side);
        	 $ Container-> findOneBy ('label', 'Siste nytt') -> addPage ($ side);
         }
         $ Vise-> navigasjon ($ container);
     } 

På ting som må legges er en form for caching (bruker Zend_Cache formodentlig;)) ellers dette kommer til å være ganske dyrt med hver side lastes.

6 Svar å "dynamisk legge til sider Zend_Navigation container under kjøring"

  1. Mr Man sier:

    Det er akkurat det jeg var ute etter - takk for en veldig tydelig eksempel. Skål. G

  2. A387 sier:

    Fint innlegg! Jeg har litt problemer med å initiere en modell klasse i bootstrap. Noen anelse hvorfor application / modell klasser er ikke tilgjengelig fra bootstrap? Klassen heter "ny News () ', i stedet jeg vil gjerne legge til navigasjonen sidene ved å få en navigasjonstreet fra en modell klasse. Hvis du har en idé, kan du gi meg beskjed! ;)

    • Min modell ble redigert for innlegget, er dens riktige navn i koden Pro_News og plukkes opp av autoloader.

      Gjetter du ikke bruker moduler? Men hvis så modellen bør kalles _News for ZF å plukke opp som standard (jeg bruker ikke dette systemet selv).

      Jeg vil foreslå å sjekke med stien fra din bootstrap metoden for å se om det inneholder "application / modeller" eller inkludere filen manuelt.

      • A387 sier:

        Vel jeg bruker moduler, meg dårlig. Men du foreslår autoloading skal fungere? Vel, jeg har til å grave i det litt dypere. For øyeblikket bruker jeg den addPage funksjonen i BaseControllers, som ikke er virkelig ytelse vennlige ... hehe. Takk for svar.

  3. Min modell ble redigert for innlegget, er dens riktige navn i koden Pro_News og plukkes opp av autoloader.

    Gjetter du ikke bruker moduler? Men hvis så modellen bør hete _News For ZF å plukke opp som standard (jeg bruker ikke dette systemet selv).

    Jeg vil foreslå å sjekke med stien fra din bootstrap metoden for å se om det inneholder "application / modeller" eller inkludere filen manuelt.

Legg igjen en kommentar













Panorama Theme av Themocracy

5 besøkende online nå
3 gjester, 2 roboter, 0 medlemmer
Maks besøkende i dag: 12 kl 07:57 UTC
Denne måneden: 22 ved 08-06-2011 12:30 UTC
I år: 130 på 28-03-2011 22:40 UTC
All time: 130 på 28-03-2011 10:40 UTC