Dynamisch Seiten hinzufügen Zend_Navigation Container zur Laufzeit

Von Steven Lloyd Watkin , Donnerstag 7. Januar 2010 22.50 Uhr

In einer Fortsetzung zu meinem letzten Post über Zend_Navigation, Route Anfragen für sitemap.xml, um benutzerdefinierte controller / action , Post geht es um dymnamically Hinzufügen von Seiten zu einer Zend_Navigation Container zur Laufzeit / Skriptausführung.

Sein alles schön und gut Angabe Ihrer Seiten in einer ini-oder XML- Datei, aber irgendwann wirst du site Sie haben wechselnden Seiten in die Sie wünschen Weg als Teil eines Menüs, Sitemap oder Ihre Brotkrümel zu sein, die in. Deshalb, was wir tun ist, um unsere Seiten Zend_Navigation Container zur Laufzeit hinzufügen müssen. Beispiele hierfür wären in Hinzufügen Nachrichten, Blog-Posts, oder die Seite Kommentare, etc. werden

In diesem Beispiel werde ich einige Neuigkeiten Beiträge zu meiner statisch definierten ini config hinzuzufügen. Um meine News zu posten Seite Konfigurationen Ich habe eine Klasse, die ein Array in dem folgenden Format zurück verwendet:

  $ PagesToAdd = array (
   0 =>
     array (
       'Label' => 'Fake Nachrichten Geschichte # 5 ...',
       'Modul' => 'www',
       'Route' => 'www-Index',
       'Action' => 'Ansicht',
       'Controller' => 'Nachrichten',
       'Params' => Array (
           'Id' => '5-Fake-Nachrichten-Geschichte - 5 ')
     ),
   1 =>
     array (/ * Mehr Details Seite * /)
  ); 

Wie Sie feststellen, dass die Funktion ein Array, in dem Arrays aus denen sich die config-Arrays für Zend_Navigation_Page_Mvc enthalten sind zurückgekehrt. Daher kann durch Durchlaufen des Arrays neue Zend_Navigation Seiten aus dem Array config erstellt werden. Das nächste, was zu tun ist als Teil der Schleife zu den Seiten in der richtigen Position hinzufügen (alternativ Seiten in der Masse zugesetzt werden können, mit Hilfe von -> addPages ()-Methode).

Um dies zu tun, suchen Sie die Seite, die Sie möchten die Sub-Seiten hinzufügen und fügen Sie einfach die Seiten. In diesem Fall habe ich den folgenden Code auf meiner Seite finden verwendet:

  $ Container-> findOneBy ('label', 'Aktuell') -> addPage ($ page); 

Mein Gesamteindruck Navigation Initialisierung in der Bootstrap daher wie folgt aussieht:

  / **
      * Für den Umgang mit Top-Level-Navigation verwendet
      *
      * @ Return Zend_Navigation
      * /
     geschützten Funktion _initNavigation ()
     {
         $ This-> bootstrap ("Layout");
         $ Layout = $ this-> getResource ("Layout");
         $ View = $ layout-> getView ();
         $ Config = new Zend_Config_Ini (
             APPLICATION_PATH.  "/ Configs / navigation.ini ', APPLICATION_ENV);

         $ Container = new Zend_Navigation ($ config-> Standard);
         / / Jetzt fügen Sie die letzten 25 Nachrichten Berichte
         $ News = new News ();
         $ Pages = $ news-> getNavigationEntries ();
         foreach ($ Seiten als $ page) {
        	 $ Page = new Zend_Navigation_Page_Mvc ($ page);
        	 $ Container-> findOneBy ('label', 'Aktuell') -> addPage ($ page);
         }
         $ View-> Navigation ($ container);
     } 

Auf was muss hinzugefügt werden, um irgendeine Form von Caching (mit Zend_Cache vermutlich;)) ansonsten das wird sehr teuer sein, wobei jede Seite zu laden.

6 Responses to "Dynamisch Seiten hinzufügen Zend_Navigation Container zur Laufzeit"

  1. Herr Mann sagt:

    Das ist genau das, was ich gesucht habe - Danke für ein wirklich gutes Beispiel. Cheers. G

  2. A387 sagt:

    Nizza Beitrag! Ich habe einige Schwierigkeiten Einleitung einer Model-Klasse in der Bootstrap. Jede Ahnung, warum application / Model-Klassen sind nicht verfügbar, aus der Bootstrap? Ihre Klasse wird als "neue News () ', sondern ich möchte die Navigation Seiten, indem sie eine Navigationsstruktur aus einem Modell-Klasse hinzufügen. Wenn Sie eine Idee haben, lassen Sie es mich wissen! ;)

    • Mein Modell war für die Post bearbeitet, ist die korrekte Bezeichnung in den Code Pro_News und wird von den Autoloader abgeholt.

      Erraten Sie nicht mit Modulen? Aber wenn so Ihr Modell sollte genannt _Aktuelles für ZF abholen standardmäßig (ich nicht verwenden dieses System selbst) sein.

      Ich würde vorschlagen, die Überprüfung der Include-Pfad von der Bootstrap-Methode, um festzustellen, ob es "application / models" enthält oder enthalten die Datei manuell.

      • A387 sagt:

        Nun verwende ich Module, mein schlechtes. Aber Sie legen nahe, Autoloading funktionieren sollte? Nun, ich habe zu graben sie ein wenig tiefer. Im Moment verwende ich die Funktion in der addPage BaseControllers, die nicht wirklich Leistung freundlich ... hehe. Vielen Dank für Ihre Antwort.

  3. Mein Modell war für die Post bearbeitet, ist die korrekte Bezeichnung in den Code Pro_News und wird von den Autoloader abgeholt.

    Erraten Sie nicht mit Modulen? Aber wenn Sie Ihr Modell so genannt werden sollte _Aktuelles Für ZF abholen standardmäßig (ich nicht verwenden dieses System selbst).

    Ich würde vorschlagen, die Überprüfung der Include-Pfad von der Bootstrap-Methode, um festzustellen, ob es "application / models" enthält oder enthalten die Datei manuell.

Lassen Sie eine Antwort













Panorama Thema von Themocracy

5 Besucher jetzt online
3 Gäste, 2 Bots, 0 Mitglieder
Max Besucher heute: 12 um 07:57 Uhr UTC
Diesen Monat: 22 am 2011.08.06 12.30 UTC
Dieses Jahr: 130 an 28-03-2011 10.40 UTC
Insgesamt: 130 an 28-03-2011 22.40 UTC