Dynamisch pagina's toevoegen aan Zend_Navigation container tijdens runtime

Door Steven Lloyd Watkin , donderdag 7 januari 2010 22:50

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.

6 Responses to "Dynamisch pagina's toe te voegen aan Zend_Navigation container at runtime"

  1. De heer Man zegt:

    Dat is precies wat ik zocht - bedankt voor een heel duidelijk voorbeeld. Cheers. G

  2. A387 zegt:

    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.

      • A387 zegt:

        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.

  3. 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.

Laat een reactie achter













Panorama Thema door Themocracy

5 bezoekers nu online
2 gasten, 3 bots, 0 leden
Max bezoekers vandaag: 13 om 12:21 am UTC
Deze maand: 22 op 08-06-2011 0:30 GMT
Dit jaar: 130 op 28-03-2011 22:40 GMT
All time: 130 op 28-03-2011 22:40 GMT