Dynamic magdagdag pahina sa Zend_Navigation lalagyan sa runtime
Sa isang pagpapatuloy sa aking huling post tungkol Zend_Navigation, Route kahilingan para sitemap.xml sa pasadyang controller / action , ang post na ito ay tungkol sa pagdagdag ng dymnamically mga pahina sa isang lalagyan Zend_Navigation sa runtime / script pagpapatupad.
Its lahat ng maayos at mabuti na tumutukoy sa iyong mga pahina sa isang ini o xml file ngunit sa ilang mga punto kayo ay pagpunta sa magkaroon ng pagbabago ng mga pahina sa iyong site na nais mo bilang bahagi ng isang, sitemap menu, o upang maisama sa iyong breadcrumb tugaygayan. Kaya't kung ano ang kailangan naming gawin ay ang magdagdag ng mga pahina sa aming Zend_Navigation lalagyan sa runtime. Mga halimbawa para sa mga ito ay magiging sa pagdagdag ng mga item ng balita, mga post sa blog, o pahina ng comments, atbp
Sa halimbawa na ito ko na pagpunta sa magdagdag ng ilang mga posts na balita sa aking statically tinukoy ini config. Upang makakuha ng aking mga balita kumpigurasyon post page ko na ginagamit sa isang klase na nagbabalik ng isang array sa sumusunod na format:
$ PagesToAdd = array ( 0 => array ( 'Label' baklas balita => 'kuwento # 5 ...', 'Module' = 'www'>, 'Ruta' => 'www-index', 'Action' => 'view', 'Controller' => 'news', 'Params' => array ( 'Id' => '5-baklas-news-kuwento - 5 ') ), 1 => array (/ * More pahina ng mga detalye * /), );
Bilang mapapansin mo na ang function ay nabalik isang array na kung saan ay nakapaloob arrays na gumawa ng up ang config arrays para Zend_Navigation_Page_Mvc. Samakatuwid, sa pamamagitan ng looping sa array bagong pahina Zend_Navigation ay maaaring maging nilikha mula sa config array. Ang susunod na bagay na gawin bilang bahagi ng loop ay upang idagdag ang mga pahina sa tamang posisyon (Bilang kahalili mga pahina ay maaaring idinagdag sa mga bulk sa pamamagitan ng paggamit -> addPages () method).
Upang gawin ito, hanapin ang pahina na nais mong idagdag ang mga sub-pahina na at idagdag lamang ang mga pahina. Sa kasong ito ako ay may ginamit ang sumusunod na code upang mahanap ang aking pahina:
$ Lalagyan-> findOneBy ('label', 'Latest News') -> addPage ($ pahina); Ang aking mga kabuuang nabigasyon initialisation sa bootstrap kaya't ganito ang hitsura:
/ ** * Ginagamit para sa paghawak ng top-level nabigasyon * * @ Bumalik Zend_Navigation * / protektado function _initNavigation () { $ Na ito-> bootstrap ('layout'); $ Layout = $ ito-> getResource ('layout'); $ View = $ layout-> getView (); $ Config = bagong Zend_Config_Ini ( APPLICATION_PATH. '/ Configs / navigation.ini', APPLICATION_ENV); $ Lalagyan = bagong Zend_Navigation ($ config-> default); / / Ngayon idagdag sa huling 25 mga ulat ng balita $ Balita = bagong News (); $ Pahina = $ balita-> getNavigationEntries (); foreach ($ pahina AS $ page) { $ Page = bagong Zend_Navigation_Page_Mvc ($ pahina); $ Lalagyan-> findOneBy ('label', 'Latest News') -> addPage ($ pahina); } $ View-> nabigasyon ($ lalagyan); }
Sa bagay na pangangailangan upang maging idinagdag ay ilang form ng caching (gamit Zend_Cache siguro;)) sa kabilang banda ito ay pagpunta sa maging lubos na mahal sa bawat pahina ng load.


















































Iyan na lamang kung ano ako ay naghahanap para sa - thanks para sa isang tunay na malinaw na halimbawa. Cheers. G
Nice post! na ako ng ilang mga problema sa pagpapasimula ng modelo klase sa bootstrap. Anumang bakas kung bakit ang application / modelo ng mga klase ay hindi magagamit mula sa bootstrap? Ang iyong klase ay tinatawag na 'bagong News ()', sa halip Gusto kong idagdag ang mga pahina ng nabigasyon sa pamamagitan ng pagkuha ng isang puno nabigasyon mula sa isang klase ng modelo. Kung ikaw ay may isang ideya, mangyaring ipagbigay-alam sa akin! ;)
My modelo ay na-edit para sa post, ang kanyang tamang pangalan sa mga code ay Pro_News at ay matutunan sa pamamagitan ng autoloader.
Guessing hindi mo ginagamit modules? Pero kung kaya ang iyong mga modelo ay dapat na tinatawag na _News para ZF sa pick up sa pamamagitan ng default (hindi ko gamitin ang sistemang ito ang aking sarili).
Gusto iminumungkahi checking ang isama landas mula sa iyong bootstrap paraan upang makita kung ito ay naglalaman ng "application / modelo" o isama ang file manually.
Well gamitin ko modules, ang aking masama. Ngunit ikaw iminumungkahi autoloading dapat magtrabaho? Well, na ko na maghukay sa mga ito ng isang piraso ng mas malalim. Sa ngayon gamit ko ang addPage function sa BaseControllers, na kung saan ay hindi tunay na pagganap friendly ... hehe. Salamat sa iyong reply.
Tiyakin ang iyong mga module na modelo ay pinangalanan ng tama _News (Halimbawa) at ito ay dapat na pick up gamit autoloading.