Dynamisch pagina's toevoegen aan Zend_Navigation container tijdens runtime
In een vervolg op mijn vorige post over Zend_Navigation, Route verzoeken om sitemap.xml om aangepaste controller / actie , dit bericht gaat over dymnamically het toevoegen van pagina's naar een Zend_Navigation container op runtime / script uitvoering.
Zijn allemaal goed en wel met vermelding van uw pagina's in een ini-of xml -bestand, maar op een gegeven moment zul je moeten veranderen van pagina's in uw site die u wilt als onderdeel van een menu, sitemap, of worden opgenomen in uw breadcrumb trail. Daarom wat we moeten doen is pagina's toevoegen aan onze Zend_Navigation container tijdens runtime. Voorbeelden hiervan zou zijn het toevoegen van nieuws, blog posts, of pagina opmerkingen, etc.
In dit voorbeeld ga ik wat nieuws berichten toevoegen aan mijn statisch gedefinieerd ini config. Om mijn nieuwsbericht pagina configuraties heb ik gebruik gemaakt van een klasse die een array keert terug in de volgende indeling:
$ PagesToAdd = array ( 0 => array ( 'Label' => 'Fake nieuwsbericht # 5 ...', 'Module' => 'www', 'Route' => 'www-index', 'Actie' => 'view', 'Controller' => 'nieuws', 'Params' => array ( 'Id' => '5-Fake-nieuws-verhaal - 5 ') ), 1 => array (/ * Meer details pagina * /), );
Zoals je zult merken dat de functie een array waarin zijn opgenomen arrays die het config arrays voor Zend_Navigation_Page_Mvc terug. Daarom kan door een lus over de array nieuwe Zend_Navigation pagina's worden gecreëerd uit de config array. Het volgende wat je moet doen als onderdeel van de loop is om toe te voegen de pagina's in de juiste positie (als alternatief pagina's kunnen worden toegevoegd in bulk door gebruik te maken -> addPages ()-methode).
Om dit te doen, zoekt u de pagina die u wilt de sub-pagina's toe te voegen aan en voegt u de pagina's. In dit geval heb ik gebruik de volgende code om mijn pagina te vinden:
$ Container-> findOneBy ('label', 'Laatste Nieuws') -> addPage ($ pagina); Mijn algemene navigatie initialisatie in de bootstrap ziet er daarom als volgt uit:
/ ** * Gebruikt voor de behandeling van top-level navigatie * * @ Return Zend_Navigation * / beschermde functie _initNavigation () { $ This-> bootstrap ('lay-out'); $ Layout = $ this-> getResource ('lay-out'); $ View = $ layout-> getView (); $ Config = new Zend_Config_Ini ( APPLICATION_PATH. '/ Configs / navigation.ini', APPLICATION_ENV); $ Container = new Zend_Navigation ($ config-> standaard); / / Voeg nu de laatste 25 nieuwsberichten $ Nieuws = new Nieuws (); $ Pagina = $ news-> getNavigationEntries (); foreach ($ pagina's als $ pagina) { $ Page = nieuwe Zend_Navigation_Page_Mvc ($ pagina); $ Container-> findOneBy ('label', 'Laatste Nieuws') -> addPage ($ pagina); } $ View-> navigatie ($ container); }
Op ding dat moet worden toegevoegd, is een vorm van caching (met behulp van Zend_Cache vermoedelijk;)) anders is dit gaat vrij duur te zijn met elke pagina te laden.


















































Dat is precies wat ik zocht - bedankt voor een heel duidelijk voorbeeld. Cheers. G
Leuk bericht! Ik heb wat problemen opzetten van een model klasse in de bootstrap. Enig idee waarom de toepassing / model classes zijn niet beschikbaar vanaf de bootstrap? Je klas heet 'nieuw News ()', in plaats daarvan wil ik de navigatie-pagina's toevoegen door het verkrijgen van een navigatiestructuur van een model klasse. Als je een idee, laat het me weten! ;)
Mijn model is bewerkt voor de post, de juiste naam in de code is Pro_News en wordt opgepikt door de autoloader.
Raden u niet met behulp van modules? Maar als dat uw model zou moeten heten _Nieuws voor ZF op te pikken standaard (Ik maak geen gebruik van dit systeem zelf).
Ik stel voor het controleren van de include path van uw bootstrap methode om te zien of het bevat "application / models" of handmatig onder het bestand.
Nou ik gebruik modules, mijn slecht. Maar je suggereert autoloading zou moeten werken? Nou, ik heb te spitten in het een beetje dieper. Op het moment gebruik ik de addPage functie in de BaseControllers, die niet echt de prestaties vriendelijk ... hehe. Bedankt voor uw antwoord.
Zorg ervoor dat uw module model juistheid van de naam _Nieuws (Bijvoorbeeld) en het moet oppakken met behulp van autoloading.
Mijn model is bewerkt voor de post, de juiste naam in de code is Pro_News en wordt opgepikt door de autoloader.
Raden u niet met behulp van modules? Maar als dat uw model genoemd moet worden _Nieuws Voor ZF op te pikken standaard (Ik maak geen gebruik van dit systeem zelf).
Ik stel voor het controleren van de include path van uw bootstrap methode om te zien of het bevat "application / models" of handmatig onder het bestand.