Dynamisk tilføje sider til Zend_Navigation container ved runtime
I en fortsættelse på mit sidste indlæg om Zend_Navigation, Route anmodninger om sitemap.xml til brugerdefineret controller / action , er dette indlæg om dymnamically tilføje sider til en Zend_Navigation container ved runtime / script eksekvering.
Dens alt sammen meget godt angiver dine sider i en ini-eller xml -fil, men på et tidspunkt er du nødt til at ændre sider på dit websted, du vil som en del af en menu, sitemap, eller til at blive inkluderet i din brødkrumme spor. Derfor, hvad vi skal gøre, er at tilføje sider til vores Zend_Navigation container ved runtime. Eksempler på dette ville være i at tilføje nyheder, blog indlæg, eller side kommentarer, etc.
I dette eksempel vil jeg tilføje nogle nyheder indlæg til min statisk definerede ini config. At få min news indlæg side konfigurationer Jeg har brugt en klasse, som returnerer et array i følgende format:
$ PagesToAdd = array ( 0 => array ( 'Label' => 'Fake nyhedshistorie # 5 ...', 'Modul' => 'www', 'Rute' => 'www-indeks ", 'Handling' => 'Vis', 'Controller' => 'nyheder', 'Params' => array ( 'Id' => '5-Fake-news-historie - 5 ') ), 1 => array (/ * Mere sidedetaljer * /), );
Som du vil opdage, at funktionen har returneret et array i, som er indeholdt arrays, der udgør config arrays for Zend_Navigation_Page_Mvc. Derfor kan ved at loope over den række nye Zend_Navigation sider skabes fra config array. Den næste ting at gøre, som en del af sløjfen er at tilføje siderne i den korrekte position (alternativt sider kan tilføjes i bulk ved hjælp -> addPages ()-metoden).
For at gøre dette ved at finde den side, du ønsker at tilføje sub-sider, og blot tilføje sider. I dette tilfælde har jeg brugt følgende kode til at finde min side:
$ Container-> findOneBy ('label', 'Sidste nyt') -> addPage ($ side); Min overordnede navigation initialiseringen i bootstrap ser derfor således ud:
/ ** * Bruges til håndtering af top-niveau navigation * * @ Return Zend_Navigation * / beskyttet funktion _initNavigation () { $ This-> bootstrap ('Layout'); $ Layout = $ this-> getResource ('Layout'); $ View = $ layout-> getView (); $ Config = nye Zend_Config_Ini ( APPLICATION_PATH. '/ Configs / navigation.ini', APPLICATION_ENV); $ Container = new Zend_Navigation ($ config-> standard); / / Nu tilføje de sidste 25 reportager $ News = new Nyheder (); $ Sider = $ news-> getNavigationEntries (); foreach ($ sider som $ side) { $ Page = nye Zend_Navigation_Page_Mvc ($ side); $ Container-> findOneBy ('label', 'Sidste nyt') -> addPage ($ side); } $ Vis-> navigation ($ beholder); }
Om ting, der skal tilføjes, er en form for caching (ved hjælp af Zend_Cache formentlig;)) ellers vil være ganske dyrt med hver side belastning.


















































Det er bare hvad jeg ledte efter - tak for et rigtig godt eksempel. Cheers. G
Nice indlæg! Jeg har nogle problemer med at indlede en model klasse i bootstrap. Enhver anelse hvorfor ansøgningen / model klasser er ikke tilgængelige fra bootstrap? Din klasse kaldes 'nye News () ", i stedet jeg vil gerne tilføje de navigeringssider ved at få en navigationstræ fra en model klasse. Hvis du har en idé, så lad mig det vide! ;)
Min model var redigeret til stillingen, dens korrekte navn i koden er Pro_News og er samlet op af autoloader.
Gætter du ikke bruger moduler? Men hvis så din model skal kaldes _News for ZF at afhente som standard (jeg bruger ikke dette system mig selv).
Jeg vil foreslå, at kontrollere inkludere stien fra din bootstrap metode til at se, om den indeholder "application / modeller" eller indeholde filen manuelt.
Nå jeg bruge moduler, min dårlige. Men du antyder automatisk indlæsning bør arbejde? Nå, jeg har at grave ind i det lidt dybere. I øjeblikket bruger jeg addPage funktion i BaseControllers, som egentlig ikke er performance venlige ... hehe. Tak for dit svar.
Sørg for at din modul model er navngivet korrekt _News (For eksempel), og det bør samle op ved hjælp af automatisk indlæsning.
Min model var redigeret til stillingen, dens korrekte navn i koden er Pro_News og er samlet op af autoloader.
Gætter du ikke bruger moduler? Men hvis så din model skal hedde _News For ZF at afhente som standard (jeg bruger ikke dette system mig selv).
Jeg vil foreslå, at kontrollere inkludere stien fra din bootstrap metode til at se, om den indeholder "application / modeller" eller indeholde filen manuelt.