Seiten

Container

Container haben Methoden für das Hinzufügen, Empfangen, Löschen und Durchlaufen von Seiten. Container implementieren die » SPL Interfaces RecursiveIterator und Countable, was bedeutet das ein Container durchlaufen werden kann indem die SPL Klasse RecursiveIteratorIterator verwendet wird.

Erstellen von Containern

Zend_Navigation_Container ist abstrakt, und kann nicht direkt instanziiert werden. Verwende Zend_Navigation wenn ein Container instanziiert werden soll.

Zend_Navigation kann komplett leer erstellt werden, oder indem ein Array genommen wird, oder ein Zend_Config Objekt mit Seiten in den Container gegeben wird. Jede seite in dem gegebenen Array/Config wird eventuell an die addPage() Methode der Container Klasse übergeben, was bedeutet das jedes Element im Array/Config ein Array oder Config Objekt sein kann, oder eine Instanz von Zend_Navigation_Page.

Example #1 Erstellt einen Container indem ein Array verwendet wird

  1. /*
  2. * Erstellt einen Container von einem Array
  3. *
  4. * Jedes Element im Array wird an Zend_Navigation_Page::factory() übergeben
  5. * wenn es erstellt wird.
  6. */'label' => 'Seite 1',
  7.         'id' => 'home-link',
  8.         'uri' => '/''label' => 'Zend',
  9.         'uri' => 'http://www.zend-project.com/',
  10.         'order''label' => 'Seite 2',
  11.         'controller' => 'page2',
  12.         'pages''label' => 'Seite 2.1',
  13.                 'action' => 'page2_1',
  14.                 'controller' => 'page2',
  15.                 'class' => 'special-one',
  16.                 'title' => 'Dieses Element hat eine spezielle Klasse',
  17.                 'active''label' => 'Seite 2.2',
  18.                 'action' => 'page2_2',
  19.                 'controller' => 'page2',
  20.                 'class' => 'special-two',
  21.                 'title' => 'Dieses Element hat auch eine spezielle Klasse''label' => 'Seite 2 mit Parametern',
  22.         'action' => 'index',
  23.         'controller' => 'page2',
  24.         // Spezifiziert einen Parameter oder zwei
  25.         'params''format' => 'json',
  26.             'foo' => 'bar''label' => 'Seite 2 mit Parametern und einer Route',
  27.         'action' => 'index',
  28.         'controller' => 'page2',
  29.         // Spezifiziert einen Routen Namen und einen Parameter für die Route
  30.         'route' => 'nav-route-example',
  31.         'params''format' => 'json''label' => 'Seite 3',
  32.         'action' => 'index',
  33.         'controller' => 'index',
  34.         'module' => 'mymodule',
  35.         'reset_params''label' => 'Seite 4',
  36.         'uri' => '#',
  37.         'pages''label' => 'Seite 4.1',
  38.                 'uri' => '/page4',
  39.                 'title' => 'Seite 4 mit Verwendung von URI',
  40.                 'pages''label' => 'Seite 4.1.1',
  41.                         'title' => 'Seite 4 mit Verwendung von MVC Parametern',
  42.                         'action' => 'index',
  43.                         'controller' => 'page4',
  44.                         // Sagen wir das diese Seite aktiv ist
  45.                         'active' => '1''label' => 'Seite 0?',
  46.         'uri' => '/setting/the/order/option',
  47.         // Setzt die Reihenfolge auf -1, damit Sie als erstes erscheint
  48.         'order''label' => 'Seite 5',
  49.         'uri' => '/',
  50.         // Diese Seite sollte nicht sichtbar sein
  51.         'visible''pages''label' => 'Seite 5.1',
  52.                 'uri' => '#',
  53.                 'pages''label' => 'Seite 5.1.1',
  54.                         'uri' => '#',
  55.                         'pages''label' => 'Seite 5.1.2',
  56.                                 'uri' => '#',
  57.                                 // Sagen wir das die Seite aktiv ist
  58.                                 'active''label' => 'ACL Seite 1 (guest)',
  59.         'uri' => '#acl-guest',
  60.         'resource' => 'nav-guest',
  61.         'pages''label' => 'ACL Seite 1.1 (foo)',
  62.                 'uri' => '#acl-foo',
  63.                 'resource' => 'nav-foo''label' => 'ACL Seite 1.2 (bar)',
  64.                 'uri' => '#acl-bar',
  65.                 'resource' => 'nav-bar''label' => 'ACL Seite 1.3 (baz)',
  66.                 'uri' => '#acl-baz',
  67.                 'resource' => 'nav-baz''label' => 'ACL Seite 1.4 (bat)',
  68.                 'uri' => '#acl-bat',
  69.                 'resource' => 'nav-bat''label' => 'ACL Seite 2 (member)',
  70.         'uri' => '#acl-member',
  71.         'resource' => 'nav-member''label' => 'ACL Seite 3 (admin)',
  72.         'uri' => '#acl-admin',
  73.         'resource' => 'nav-admin',
  74.         'pages''label' => 'ACL Seite 3.1 (nothing)',
  75.                 'uri' => '#acl-nada''label' => 'Zend Framework',
  76.         'route' => 'zf-route'
  77.     )
  78. ));

Example #2 Erstellung eines Containers indem ein Config Objekt erstellt wird

  1. /* INHALT VON /path/to/navigation.xml:
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <config>
  4.     <nav>
  5.  
  6.         <zend>
  7.             <label>Zend</label>
  8.             <uri>http://www.zend-project.com/</uri>
  9.             <order>100</order>
  10.         </zend>
  11.  
  12.         <page1>
  13.             <label>Seite 1</label>
  14.             <uri>page1</uri>
  15.             <pages>
  16.  
  17.                 <page1_1>
  18.                     <label>Seite 1.1</label>
  19.                     <uri>page1/page1_1</uri>
  20.                 </page1_1>
  21.  
  22.             </pages>
  23.         </page1>
  24.  
  25.         <page2>
  26.             <label>Seite 2</label>
  27.             <uri>page2</uri>
  28.             <pages>
  29.  
  30.                 <page2_1>
  31.                     <label>Seite 2.1</label>
  32.                     <uri>page2/page2_1</uri>
  33.                 </page2_1>
  34.  
  35.                 <page2_2>
  36.                     <label>Seite 2.2</label>
  37.                     <uri>page2/page2_2</uri>
  38.                     <pages>
  39.  
  40.                         <page2_2_1>
  41.                             <label>Seite 2.2.1</label>
  42.                             <uri>page2/page2_2/page2_2_1</uri>
  43.                         </page2_2_1>
  44.  
  45.                         <page2_2_2>
  46.                             <label>Seite 2.2.2</label>
  47.                             <uri>page2/page2_2/page2_2_2</uri>
  48.                             <active>1</active>
  49.                         </page2_2_2>
  50.  
  51.                     </pages>
  52.                 </page2_2>
  53.  
  54.                 <page2_3>
  55.                     <label>Seite 2.3</label>
  56.                     <uri>page2/page2_3</uri>
  57.                     <pages>
  58.  
  59.                         <page2_3_1>
  60.                             <label>Seite 2.3.1</label>
  61.                             <uri>page2/page2_3/page2_3_1</uri>
  62.                         </page2_3_1>
  63.  
  64.                         <page2_3_2>
  65.                             <label>Seite 2.3.2</label>
  66.                             <uri>page2/page2_3/page2_3_2</uri>
  67.                             <visible>0</visible>
  68.                             <pages>
  69.  
  70.                                     <page2_3_2_1>
  71.                                         <label>Seite 2.3.2.1</label>
  72.                                         <uri>page2/page2_3/page2_3_2/1</uri>
  73.                                         <active>1</active>
  74.                                     </page2_3_2_1>
  75.  
  76.                                     <page2_3_2_2>
  77.                                         <label>Seite 2.3.2.2</label>
  78.                                         <uri>page2/page2_3/page2_3_2/2</uri>
  79.                                         <active>1</active>
  80.  
  81.                                         <pages>
  82.                                             <page_2_3_2_2_1>
  83.                                                 <label>Ignoriert</label>
  84.                                                 <uri>#</uri>
  85.                                                 <active>1</active>
  86.                                             </page_2_3_2_2_1>
  87.                                         </pages>
  88.                                     </page2_3_2_2>
  89.  
  90.                             </pages>
  91.                         </page2_3_2>
  92.  
  93.                         <page2_3_3>
  94.                             <label>Seite 2.3.3</label>
  95.                             <uri>page2/page2_3/page2_3_3</uri>
  96.                             <resource>admin</resource>
  97.                             <pages>
  98.  
  99.                                     <page2_3_3_1>
  100.                                         <label>Seite 2.3.3.1</label>
  101.                                         <uri>page2/page2_3/page2_3_3/1</uri>
  102.                                         <active>1</active>
  103.                                     </page2_3_3_1>
  104.  
  105.                                     <page2_3_3_2>
  106.                                         <label>Seite 2.3.3.2</label>
  107.                                         <uri>page2/page2_3/page2_3_3/2</uri>
  108.                                         <resource>guest</resource>
  109.                                         <active>1</active>
  110.                                     </page2_3_3_2>
  111.  
  112.                             </pages>
  113.                         </page2_3_3>
  114.  
  115.                     </pages>
  116.                 </page2_3>
  117.  
  118.             </pages>
  119.         </page2>
  120.  
  121.         <page3>
  122.             <label>Seite 3</label>
  123.             <uri>page3</uri>
  124.             <pages>
  125.  
  126.                 <page3_1>
  127.                     <label>Seite 3.1</label>
  128.                     <uri>page3/page3_1</uri>
  129.                     <resource>guest</resource>
  130.                 </page3_1>
  131.  
  132.                 <page3_2>
  133.                     <label>Seite 3.2</label>
  134.                     <uri>page3/page3_2</uri>
  135.                     <resource>member</resource>
  136.                     <pages>
  137.  
  138.                         <page3_2_1>
  139.                             <label>Seite 3.2.1</label>
  140.                             <uri>page3/page3_2/page3_2_1</uri>
  141.                         </page3_2_1>
  142.  
  143.                         <page3_2_2>
  144.                             <label>Seite 3.2.2</label>
  145.                             <uri>page3/page3_2/page3_2_2</uri>
  146.                             <resource>admin</resource>
  147.                         </page3_2_2>
  148.  
  149.                     </pages>
  150.                 </page3_2>
  151.  
  152.                 <page3_3>
  153.                     <label>Seite 3.3</label>
  154.                     <uri>page3/page3_3</uri>
  155.                     <resource>special</resource>
  156.                     <pages>
  157.  
  158.                         <page3_3_1>
  159.                             <label>Seite 3.3.1</label>
  160.                             <uri>page3/page3_3/page3_3_1</uri>
  161.                             <visible>0</visible>
  162.                         </page3_3_1>
  163.  
  164.                         <page3_3_2>
  165.                             <label>Seite 3.3.2</label>
  166.                             <uri>page3/page3_3/page3_3_2</uri>
  167.                             <resource>admin</resource>
  168.                         </page3_3_2>
  169.  
  170.                     </pages>
  171.                 </page3_3>
  172.  
  173.             </pages>
  174.         </page3>
  175.  
  176.         <home>
  177.             <label>Home</label>
  178.             <order>-100</order>
  179.             <module>default</module>
  180.             <controller>index</controller>
  181.             <action>index</action>
  182.         </home>
  183.  
  184.     </nav>
  185. </config>
  186. */'/path/to/navigation.xml', 'nav'

Hinzufügen von Seiten

Das Hinzufügen von Seiten in einen Container kann mit den Methoden addPage(), addPages() oder setPages() durchgeführt werden. Das folgende Beispiel zeigt eine Erklärung des ganzen.

Example #3 Hinzufügen von Seiten zu einem Container

  1. // Container erstellen
  2. // Seite durch die Angabe eine Instanz einer Page hinzufügen
  3. 'uri' => 'http://www.example.com/'
  4. )))
  5.  
  6. // Seite durch die Angabe eines Arrays hinzufügen
  7. 'uri' => 'http://www.example.com/'
  8. )))
  9.  
  10. // Seite durch die Angabe eines Config Objekts hinzufügen
  11. 'uri' => 'http://www.example.com/''label'  => 'Speichern'
  12.         'action' => 'save''label' =>  'Löschen',
  13.         'action' => 'delete'
  14.     )
  15. );
  16.  
  17. // Zwei Seiten hinzufügen
  18. $container->addPages($pages);
  19.  
  20. // Bestehende Seite entfernen und die gegebenen Seiten hinzufügen
  21. $container->setPages($pages);

Seiten löschen

Das Löschen von Seiten kann mit removePage() oder removePages() durchgeführt werden. Die ersten Methode akzeptiert eine Instanz einer Seite, oder ein Integer. Der Integer korrespondiert mit der order welche die Seite hat. Die letztere Methode entfernt alle Seiten vom Container.

Example #4 Seiten von einem Container entfernen

  1. span style="color: #ff0000;">'label'  => 'Seite 1',
  2.         'action' => 'page1''label'  => 'Seite 2',
  3.         'action' => 'page2',
  4.         'order''label'  => 'Seite 3',
  5.         'action' => 'page3'
  6.     )
  7. ));
  8.  
  9. // Entfernt eine Seite implizit durch die Reihenfolge der Seite
  10. $container->removePage(0);      // Entfernt Seite 1
  11.  
  12. // Entfernt eine Seite durch die Instanz
  13. 'page3');
  14. $container->removePage($page3); // Entfernt Seite 3
  15.  
  16. // Entfernt eine Seite durch explizite angabe der Reihenfolge der Seite
  17. $container->removePage(200);    // Entfernt Seite 2
  18.  
  19. // Entfernt alle Seiten
  20. $container->removePages();      // Entfernt alle Seiten

Seiten finden

Container haben Finder Methoden für das Empfangen von Seiten. Es gibt findOneBy($property, $value), findAllBy($property, $value) und findBy($property, $value, $all = false). Diese Methoden durchsuchen rekursiv den Container nach Seiten die dem angegebenen $page->$property == $value entsprechen. Die erste Methode, findOneBy(), gibt eine einzelne Seite zurück die der angegebenen Eigenschaft mit dem angegebenen Wert entspricht, oder NULL wenn Sie nicht gefunden werden kann. Die zweite Methode wird alle Seiten mit einer Eigenschaft zurückgeben die dem angegebenen Wert entspricht. Die dritte Methode wird eine eine der zwei anderen Methoden aufrufen, abhängig vom $all Flag.

Die Finder Methoden können auch magisch verwendet werden indem der Name der Eigenschaft an findBy, findOneBy oder findAllBy angehängt wird, z.B. findOneByLabel('Home') um die erste passende Seite mit dem Label 'Home' zu finden. Andere Kombinationen sind findByLabel(...), findOnyByTitle(...), findAllByController(...), usw. Finder Methoden funktionieren auch mit eigenen Eigenschaften, so wie z.B. findByFoo('bar').

Example #5 Seiten in einem Container finden

  1. span style="color: #ff0000;">'label' => 'Seite 1',
  2.         'uri'   => 'page-1',
  3.         'foo'   => 'bar',
  4.         'pages''label' => 'Seite 1.1',
  5.                 'uri'   => 'page-1.1',
  6.                 'foo'   => 'bar''label' => 'Seite 1.2',
  7.                 'uri'   => 'page-1.2',
  8.                 'class' => 'my-class''type'   => 'uri',
  9.                 'label'  => 'Seite 1.3',
  10.                 'uri'    => 'page-1.3',
  11.                 'action' => 'about''label'      => 'Seite 2',
  12.         'id'         => 'page_2_and_3',
  13.         'class'      => 'my-class',
  14.         'module'     => 'page2',
  15.         'controller' => 'index',
  16.         'action'     => 'page1''label'      => 'Seite 3',
  17.         'id'         => 'page_2_and_3',
  18.         'module'     => 'page3',
  19.         'controller' => 'index'
  20.     )
  21. ));
  22.  
  23. // Die 'id' muß nicht eindeutig sein, aber man sollte darauf achten das wenn
  24. // man zwei Seiten mit der gleichen Id hat, diese die gleichen Id Attribute in
  25. // Menüs und Breadcrumbs darstellen werden
  26. $found = $container->findBy('id',
  27.                             'page_2_and_3');      // Gibt Seite 2 zurück
  28. 'id',
  29.                                'page_2_and_3');   // Gibt Seite 2 zurück
  30. $found = $container->findBy('id',
  31.                             'page_2_and_3'// Gibt Seite 2 und 3 zurück
  32. $found = $container->findById('page_2_and_3');    // Gibt Seite 2 zurück
  33. 'page_2_and_3'); // Gibt Seite 2 zurück
  34. $found = $container->findAllById('page_2_and_3'); // Gibt Seite 2 und 3 zurück
  35.  
  36. // Finde alle zu my-class passenden CSS Klassen
  37. $found = $container->findAllBy('class',
  38.                                'my-class');      // Gibt Seite 1.2 und 2 zurück
  39. 'my-class'); // Gibt Seite 1.2 und 2 zurück
  40.  
  41. // Finde die erste zu my-class passende CSS Klasse
  42. 'my-class'); // Gibt Seite 1.2 zurück
  43.  
  44. // Findet alle zu non-existant passenden CSS Klassen
  45. 'non-existant'); // Gibt array() zurück
  46.  
  47. // Findet die erste zu non-existant passende CSS Klasse
  48. 'non-existant'); // Gibt null zurück
  49.  
  50. // Findet alle Seiten mit den eigenen Eigenschaften 'foo' = 'bar'
  51. $found = $container->findAllBy('foo', 'bar'); // Gibt Seite 1 und 1.1 zurück
  52.  
  53. // Um das gleiche auf Magische Weise zu ermöglichen, muß 'foo' kleingeschrieben
  54. // sein weil 'foo' eine eigene Eigenschaft ist und deshalb der Name der
  55. // Eigenschaft nicht zu 'Foo' normalisiert wird
  56. $found = $container->findAllByfoo('bar');
  57.  
  58. // Findet alle mit controller = 'index'
  59. $found = $container->findAllByController('index'); // Gibt Seite 2 und 3 zurück

Container durchsuchen

Zend_Navigation_Container implementiert RecursiveIteratorIterator, und kann mit jeder Iterator Klasse durchsucht werden. Um einen Container rekursiv zu durchsuchen, kann die RecursiveIteratorIterator Klasse verwendet werden.

Example #6 Einen Container durchsuchen

  1. /*
  2. * Erstellt einen Container von einem Array
  3. */'label' => 'Seite 1',
  4.         'uri'   => '#''label' => 'Seite 2',
  5.         'uri'   => '#',
  6.         'pages''label' => 'Seite 2.1',
  7.                 'uri'   => '#''label' => 'Seite 2.2',
  8.                 'uri'   => '#''label' => 'Seite 3',
  9.         'uri'   => '#'
  10.     )
  11. ));
  12.  
  13. // Durchsucht flach indem ein normales foreach verwendet wird:
  14. // Ausgabe: Seite 1, Seite 2, Seite 3
  15. // Durchsucht rekursiv indem RecursiveIteratorIterator verwendet wird
  16. // Ausgabe: Seite 1, Seite 2, Seite 2.1, Seite 2.2, Seite 3

Andere Operationen

Die Methode hasPage(Zend_Navigation_Page $page) prüft ob der Container die angegebene Seite besitzt. Die Methode hasPages() prüft ob irgendeine Seite im Container existiert, und ist gleich mit count($container) > 1.

Die toArray() Methode konvertiert den Container und die Seiten in Ihm zu einem Array. Das kann für eine Serialisierung und das Debugging nützlich sein.

Example #7 Einen Container in ein Array konvertieren

  1. span style="color: #ff0000;">'label' => 'Seite 1',
  2.         'uri'   => '#''label' => 'Seite 2',
  3.         'uri'   => '#',
  4.         'pages''label' => 'Seite 2.1',
  5.                 'uri'   => '#''label' => 'Seite 2.2',
  6.                'uri'   => '#'/* Ausgabe:
  7. array(2) {
  8.   [0]=> array(15) {
  9.     ["label"]=> string(6) "Seite 1"
  10.     ["id"]=> NULL
  11.     ["class"]=> NULL
  12.     ["title"]=> NULL
  13.     ["target"]=> NULL
  14.     ["rel"]=> array(0) {
  15.     }
  16.     ["rev"]=> array(0) {
  17.     }
  18.     ["order"]=> NULL
  19.     ["resource"]=> NULL
  20.     ["privilege"]=> NULL
  21.     ["active"]=> bool(false)
  22.     ["visible"]=> bool(true)
  23.     ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  24.     ["pages"]=> array(0) {
  25.     }
  26.     ["uri"]=> string(1) "#"
  27.   }
  28.   [1]=> array(15) {
  29.     ["label"]=> string(6) "Seite 2"
  30.     ["id"]=> NULL
  31.     ["class"]=> NULL
  32.     ["title"]=> NULL
  33.     ["target"]=> NULL
  34.     ["rel"]=> array(0) {
  35.     }
  36.     ["rev"]=> array(0) {
  37.     }
  38.     ["order"]=> NULL
  39.     ["resource"]=> NULL
  40.     ["privilege"]=> NULL
  41.     ["active"]=> bool(false)
  42.     ["visible"]=> bool(true)
  43.     ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  44.     ["pages"]=> array(2) {
  45.       [0]=> array(15) {
  46.         ["label"]=> string(8) "Seite 2.1"
  47.         ["id"]=> NULL
  48.         ["class"]=> NULL
  49.         ["title"]=> NULL
  50.         ["target"]=> NULL
  51.         ["rel"]=> array(0) {
  52.         }
  53.         ["rev"]=> array(0) {
  54.         }
  55.         ["order"]=> NULL
  56.         ["resource"]=> NULL
  57.         ["privilege"]=> NULL
  58.         ["active"]=> bool(false)
  59.         ["visible"]=> bool(true)
  60.         ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  61.         ["pages"]=> array(0) {
  62.         }
  63.         ["uri"]=> string(1) "#"
  64.       }
  65.       [1]=>
  66.       array(15) {
  67.         ["label"]=> string(8) "Seite 2.2"
  68.         ["id"]=> NULL
  69.         ["class"]=> NULL
  70.         ["title"]=> NULL
  71.         ["target"]=> NULL
  72.         ["rel"]=> array(0) {
  73.         }
  74.         ["rev"]=> array(0) {
  75.         }
  76.         ["order"]=> NULL
  77.         ["resource"]=> NULL
  78.         ["privilege"]=> NULL
  79.         ["active"]=> bool(false)
  80.         ["visible"]=> bool(true)
  81.         ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  82.         ["pages"]=> array(0) {
  83.         }
  84.         ["uri"]=> string(1) "#"
  85.       }
  86.     }
  87.     ["uri"]=> string(1) "#"
  88.   }
  89. }
  90. */

Seiten