Dynamisk legge til sider Zend_Navigation container under kjøring
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.


















































Det er akkurat det jeg var ute etter - takk for en veldig tydelig eksempel. Skål. G
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.
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.
Kontroller at modulen modellen har riktig navn _News (For eksempel), og det bør plukke opp ved hjelp autoloading.
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.