TigerZF
🌐Español

51.3. Contenedores

Los contenedores disponen de métodos para añadir, recuperar, eliminar e iterar páginas. Los contenedores implementan las interfaces de SPL RecursiveIterator y Countable, lo que significa que un contenedor puede iterarse usando la clase SPL RecursiveIteratorIterator.

51.3.1. Creación de contenedores

Zend_Navigation_Container es abstracta y no puede instanciarse directamente. Use Zend_Navigation si desea instanciar un contenedor.

Zend_Navigation puede construirse completamente vacío, o recibir un array o un objeto Zend_Config con páginas para colocar en el contenedor. Cada página del array/config dado se pasará eventualmente al método addPage() de la clase contenedora, lo que significa que cada elemento del array/config puede ser un array o un objeto config, o una instancia de Zend_Navigation_Page.

Ejemplo 51.11. Crear un contenedor usando un array

/*
 * Create a container from an array
 *
 * Each element in the array will be passed to
 * Zend_Navigation_Page::factory() when constructing.
 */
$container = new Zend_Navigation(array(
    array(
        'label' => 'Page 1',
        'id' => 'home-link',
        'uri' => '/'
    ),
    array(
        'label' => 'Zend',
        'uri' => 'http://www.zend-project.com/',
        'order' => 100
    ),
    array(
        'label' => 'Page 2',
        'controller' => 'page2',
        'pages' => array(
            array(
                'label' => 'Page 2.1',
                'action' => 'page2_1',
                'controller' => 'page2',
                'class' => 'special-one',
                'title' => 'This element has a special class',
                'active' => true
            ),
            array(
                'label' => 'Page 2.2',
                'action' => 'page2_2',
                'controller' => 'page2',
                'class' => 'special-two',
                'title' => 'This element has a special class too'
            )
        )
    ),
    array(
        'label' => 'Page 2 with params',
        'action' => 'index',
        'controller' => 'page2',
        // specify a param or two
        'params' => array(
            'format' => 'json',
            'foo' => 'bar'
        )
    ),
    array(
        'label' => 'Page 2 with params and a route',
        'action' => 'index',
        'controller' => 'page2',
        // specify a route name and a param for the route
        'route' => 'nav-route-example',
        'params' => array(
            'format' => 'json'
        )
    ),
    array(
        'label' => 'Page 3',
        'action' => 'index',
        'controller' => 'index',
        'module' => 'mymodule',
        'reset_params' => false
    ),
    array(
        'label' => 'Page 4',
        'uri' => '#',
        'pages' => array(
            array(
                'label' => 'Page 4.1',
                'uri' => '/page4',
                'title' => 'Page 4 using uri',
                'pages' => array(
                    array(
                        'label' => 'Page 4.1.1',
                        'title' => 'Page 4 using mvc params',
                        'action' => 'index',
                        'controller' => 'page4',
                        // let's say this page is active
                        'active' => '1'
                    )
                )
            )
        )
    ),
    array(
        'label' => 'Page 0?',
        'uri' => '/setting/the/order/option',
        // setting order to -1 should make it appear first
        'order' => -1
    ),
    array(
        'label' => 'Page 5',
        'uri' => '/',
        // this page should not be visible
        'visible' => false,
        'pages' => array(
            array(
                'label' => 'Page 5.1',
                'uri' => '#',
                'pages' => array(
                    array(
                        'label' => 'Page 5.1.1',
                        'uri' => '#',
                        'pages' => array(
                            array(
                                'label' => 'Page 5.1.2',
                                'uri' => '#',
                                // let's say this page is active
                                'active' => true
                            )
                        )
                    )
                )
            )
        )
    ),
    array(
        'label' => 'ACL page 1 (guest)',
        'uri' => '#acl-guest',
        'resource' => 'nav-guest',
        'pages' => array(
            array(
                'label' => 'ACL page 1.1 (foo)',
                'uri' => '#acl-foo',
                'resource' => 'nav-foo'
            ),
            array(
                'label' => 'ACL page 1.2 (bar)',
                'uri' => '#acl-bar',
                'resource' => 'nav-bar'
            ),
            array(
                'label' => 'ACL page 1.3 (baz)',
                'uri' => '#acl-baz',
                'resource' => 'nav-baz'
            ),
            array(
                'label' => 'ACL page 1.4 (bat)',
                'uri' => '#acl-bat',
                'resource' => 'nav-bat'
            )
        )
    ),
    array(
        'label' => 'ACL page 2 (member)',
        'uri' => '#acl-member',
        'resource' => 'nav-member'
    ),
    array(
        'label' => 'ACL page 3 (admin',
        'uri' => '#acl-admin',
        'resource' => 'nav-admin',
        'pages' => array(
            array(
                'label' => 'ACL page 3.1 (nothing)',
                'uri' => '#acl-nada'
            )
        )
    ),
    array(
        'label' => 'Zend Framework',
        'route' => 'zf-route'
    )
));

Ejemplo 51.12. Crear un contenedor usando un objeto config

Ejemplo para INI:

[nav]
zend.label = "Zend"
zend.uri = "http://www.zend-project.com/"
zend.order = "100"

page1.label = "Page 1"
page1.uri = "page1"
page1.pages.page1_1.label = "Page 1.1"
page1.pages.page1_1.uri = "page1/page1_1"

page2.label = "Page 2"
page2.uri = "page2"
page2.pages.page2_1.label = "Page 2.1"
page2.pages.page2_1.uri = "page2/page2_1"
page2.pages.page2_2.label = "Page 2.2"
page2.pages.page2_2.uri = "page2/page2_2"
page2.pages.page2_2.pages.page2_2_1.label = "Page 2.2.1"
page2.pages.page2_2.pages.page2_2_1.uri = "page2/page2_2/page2_2_1"
page2.pages.page2_2.pages.page2_2_2.label = "Page 2.2.2"
page2.pages.page2_2.pages.page2_2_2.uri = "page2/page2_2/page2_2_2"
page2.pages.page2_2.pages.page2_2_2.active = "1"
page2.pages.page2_3.label = "Page 2.3"
page2.pages.page2_3.uri = "page2/page2_3"
page2.pages.page2_3.pages.page2_3_1.label = "Page 2.3.1"
page2.pages.page2_3.pages.page2_3_1.uri = "page2/page2_3/page2_3_1"
page2.pages.page2_3.pages.page2_3_2.label = "Page 2.3.2"
page2.pages.page2_3.pages.page2_3_2.uri = "page2/page2_3/page2_3_2"
page2.pages.page2_3.pages.page2_3_2.visible = "0"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.label = "Page 2.3.2.1"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.uri = "page2/page2_3/page2_3_2/1"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.active = "1"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.label = "Page 2.3.2.2"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.uri = "page2/page2_3/page2_3_2/2"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.active = "1"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.label = "Ignore"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.uri = "#"
page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.active = "1"
page2.pages.page2_3.pages.page2_3_3.label = "Page 2.3.3"
page2.pages.page2_3.pages.page2_3_3.uri = "page2/page2_3/page2_3_3"
page2.pages.page2_3.pages.page2_3_3.resource = "admin"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.label = "Page 2.3.3.1"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.uri = "page2/page2_3/page2_3_3/1"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.active = "1"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.label = "Page 2.3.3.2"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.uri = "page2/page2_3/page2_3_3/2"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.resource = "guest"
page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.active = "1"

page3.label = "Page 3"
page3.uri = "page3"
page3.pages.page3_1.label = "Page 3.1"
page3.pages.page3_1.uri = "page3/page3_1"
page3.pages.page3_1.resource = "guest"
page3.pages.page3_2.label = "Page 3.2"
page3.pages.page3_2.uri = "page3/page3_2"
page3.pages.page3_2.resource = "member"
page3.pages.page3_2.pages.page3_2_1.label = "Page 3.2.1"
page3.pages.page3_2.pages.page3_2_1.uri = "page3/page3_2/page3_2_1"
page3.pages.page3_2.pages.page3_2_2.label = "Page 3.2.2"
page3.pages.page3_2.pages.page3_2_2.uri = "page3/page3_2/page3_2_2"
page3.pages.page3_2.pages.page3_2_2.resource = "admin"
page3.pages.page3_3.label = "Page 3.3"
page3.pages.page3_3.uri = "page3/page3_3"
page3.pages.page3_3.resource = "special"
page3.pages.page3_3.pages.page3_3_1.label = "Page 3.3.1"
page3.pages.page3_3.pages.page3_3_1.uri = "page3/page3_3/page3_3_1"
page3.pages.page3_3.pages.page3_3_1.visible = "0"
page3.pages.page3_3.pages.page3_3_2.label = "Page 3.3.2"
page3.pages.page3_3.pages.page3_3_2.uri = "page3/page3_3/page3_3_2"
page3.pages.page3_3.pages.page3_3_2.resource = "admin"

home.label = "Home"
home.order = "-100"
home.module = "default"
home.controller = "index"
home.action = "index"
$config    = new Zend_Config_Ini('/path/to/navigation.ini', 'nav');
$container = new Zend_Navigation($config);

Ejemplo para JSON:

{
  "nav": {
    "zend": {
      "label": "Zend",
      "uri": "http:\/\/www.zend-project.com\/",
      "order": "100"
    },
    "page1": {
      "label": "Page 1",
      "uri": "page1",
      "pages": {
        "page1_1": {
          "label": "Page 1.1",
          "uri": "page1\/page1_1"
        }
      }
    },
    "page2": {
      "label": "Page 2",
      "uri": "page2",
      "pages": {
        "page2_1": {
          "label": "Page 2.1",
          "uri": "page2\/page2_1"
        },
        "page2_2": {
          "label": "Page 2.2",
          "uri": "page2\/page2_2",
          "pages": {
            "page2_2_1": {
              "label": "Page 2.2.1",
              "uri": "page2\/page2_2\/page2_2_1"
            },
            "page2_2_2": {
              "label": "Page 2.2.2",
              "uri": "page2\/page2_2\/page2_2_2",
              "active": "1"
            }
          }
        },
        "page2_3": {
          "label": "Page 2.3",
          "uri": "page2\/page2_3",
          "pages": {
            "page2_3_1": {
              "label": "Page 2.3.1",
              "uri": "page2\/page2_3\/page2_3_1"
            },
            "page2_3_2": {
              "label": "Page 2.3.2",
              "uri": "page2\/page2_3\/page2_3_2",
              "visible": "0",
              "pages": {
                "page2_3_2_1": {
                  "label": "Page 2.3.2.1",
                  "uri": "page2\/page2_3\/page2_3_2\/1",
                  "active": "1"
                },
                "page2_3_2_2": {
                  "label": "Page 2.3.2.2",
                  "uri": "page2\/page2_3\/page2_3_2\/2",
                  "active": "1",
                  "pages": {
                    "page_2_3_2_2_1": {
                      "label": "Ignore",
                      "uri": "#",
                      "active": "1"
                    }
                  }
                }
              }
            },
            "page2_3_3": {
              "label": "Page 2.3.3",
              "uri": "page2\/page2_3\/page2_3_3",
              "resource": "admin",
              "pages": {
                "page2_3_3_1": {
                  "label": "Page 2.3.3.1",
                  "uri": "page2\/page2_3\/page2_3_3\/1",
                  "active": "1"
                },
                "page2_3_3_2": {
                  "label": "Page 2.3.3.2",
                  "uri": "page2\/page2_3\/page2_3_3\/2",
                  "resource": "guest",
                  "active": "1"
                }
              }
            }
          }
        }
      }
    },
    "page3": {
      "label": "Page 3",
      "uri": "page3",
      "pages": {
        "page3_1": {
          "label": "Page 3.1",
          "uri": "page3\/page3_1",
          "resource": "guest"
        },
        "page3_2": {
          "label": "Page 3.2",
          "uri": "page3\/page3_2",
          "resource": "member",
          "pages": {
            "page3_2_1": {
              "label": "Page 3.2.1",
              "uri": "page3\/page3_2\/page3_2_1"
            },
            "page3_2_2": {
              "label": "Page 3.2.2",
              "uri": "page3\/page3_2\/page3_2_2",
              "resource": "admin"
            }
          }
        },
        "page3_3": {
          "label": "Page 3.3",
          "uri": "page3\/page3_3",
          "resource": "special",
          "pages": {
            "page3_3_1": {
              "label": "Page 3.3.1",
              "uri": "page3\/page3_3\/page3_3_1",
              "visible": "0"
            },
            "page3_3_2": {
              "label": "Page 3.3.2",
              "uri": "page3\/page3_3\/page3_3_2",
              "resource": "admin"
            }
          }
        }
      }
    },
    "home": {
      "label": "Home",
      "order": "-100",
      "module": "default",
      "controller": "index",
      "action": "index"
    }
  }
}
$config    = new Zend_Config_Json('/path/to/navigation.json', 'nav');
$container = new Zend_Navigation($config);

Ejemplo para XML:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <nav>

        <zend>
            <label>Zend</label>
            <uri>http://www.zend-project.com/</uri>
            <order>100</order>
        </zend>

        <page1>
            <label>Page 1</label>
            <uri>page1</uri>
            <pages>

                <page1_1>
                    <label>Page 1.1</label>
                    <uri>page1/page1_1</uri>
                </page1_1>

            </pages>
        </page1>

        <page2>
            <label>Page 2</label>
            <uri>page2</uri>
            <pages>

                <page2_1>
                    <label>Page 2.1</label>
                    <uri>page2/page2_1</uri>
                </page2_1>

                <page2_2>
                    <label>Page 2.2</label>
                    <uri>page2/page2_2</uri>
                    <pages>

                        <page2_2_1>
                            <label>Page 2.2.1</label>
                            <uri>page2/page2_2/page2_2_1</uri>
                        </page2_2_1>

                        <page2_2_2>
                            <label>Page 2.2.2</label>
                            <uri>page2/page2_2/page2_2_2</uri>
                            <active>1</active>
                        </page2_2_2>

                    </pages>
                </page2_2>

                <page2_3>
                    <label>Page 2.3</label>
                    <uri>page2/page2_3</uri>
                    <pages>

                        <page2_3_1>
                            <label>Page 2.3.1</label>
                            <uri>page2/page2_3/page2_3_1</uri>
                        </page2_3_1>

                        <page2_3_2>
                            <label>Page 2.3.2</label>
                            <uri>page2/page2_3/page2_3_2</uri>
                            <visible>0</visible>
                            <pages>

                                    <page2_3_2_1>
                                        <label>Page 2.3.2.1</label>
                                        <uri>page2/page2_3/page2_3_2/1</uri>
                                        <active>1</active>
                                    </page2_3_2_1>

                                    <page2_3_2_2>
                                        <label>Page 2.3.2.2</label>
                                        <uri>page2/page2_3/page2_3_2/2</uri>
                                        <active>1</active>

                                        <pages>
                                            <page_2_3_2_2_1>
                                                <label>Ignore</label>
                                                <uri>#</uri>
                                                <active>1</active>
                                            </page_2_3_2_2_1>
                                        </pages>
                                    </page2_3_2_2>

                            </pages>
                        </page2_3_2>

                        <page2_3_3>
                            <label>Page 2.3.3</label>
                            <uri>page2/page2_3/page2_3_3</uri>
                            <resource>admin</resource>
                            <pages>

                                    <page2_3_3_1>
                                        <label>Page 2.3.3.1</label>
                                        <uri>page2/page2_3/page2_3_3/1</uri>
                                        <active>1</active>
                                    </page2_3_3_1>

                                    <page2_3_3_2>
                                        <label>Page 2.3.3.2</label>
                                        <uri>page2/page2_3/page2_3_3/2</uri>
                                        <resource>guest</resource>
                                        <active>1</active>
                                    </page2_3_3_2>

                            </pages>
                        </page2_3_3>

                    </pages>
                </page2_3>

            </pages>
        </page2>

        <page3>
            <label>Page 3</label>
            <uri>page3</uri>
            <pages>

                <page3_1>
                    <label>Page 3.1</label>
                    <uri>page3/page3_1</uri>
                    <resource>guest</resource>
                </page3_1>

                <page3_2>
                    <label>Page 3.2</label>
                    <uri>page3/page3_2</uri>
                    <resource>member</resource>
                    <pages>

                        <page3_2_1>
                            <label>Page 3.2.1</label>
                            <uri>page3/page3_2/page3_2_1</uri>
                        </page3_2_1>

                        <page3_2_2>
                            <label>Page 3.2.2</label>
                            <uri>page3/page3_2/page3_2_2</uri>
                            <resource>admin</resource>
                        </page3_2_2>

                    </pages>
                </page3_2>

                <page3_3>
                    <label>Page 3.3</label>
                    <uri>page3/page3_3</uri>
                    <resource>special</resource>
                    <pages>

                        <page3_3_1>
                            <label>Page 3.3.1</label>
                            <uri>page3/page3_3/page3_3_1</uri>
                            <visible>0</visible>
                        </page3_3_1>

                        <page3_3_2>
                            <label>Page 3.3.2</label>
                            <uri>page3/page3_3/page3_3_2</uri>
                            <resource>admin</resource>
                        </page3_3_2>

                    </pages>
                </page3_3>

            </pages>
        </page3>

        <home>
            <label>Home</label>
            <order>-100</order>
            <module>default</module>
            <controller>index</controller>
            <action>index</action>
        </home>

    </nav>
</config>
$config    = new Zend_Config_Xml('/path/to/navigation.xml', 'nav');
$container = new Zend_Navigation($config);

Ejemplo para YAML:

nav:
  zend:
    label: Zend
    uri: http://www.zend-project.com/
    order: 100
  page1:
    label: Page 1
    uri: page1
    pages:
      page1_1:
        label: Page 1.1
        uri: page1/page1_1
  page2:
    label: Page 2
    uri: page2
    pages:
      page2_1:
        label: Page 2.1
        uri: page2/page2_1
      page2_2:
        label: Page 2.2
        uri: page2/page2_2
        pages:
          page2_2_1:
            label: Page 2.2.1
            uri: page2/page2_2/page2_2_1
          page2_2_2:
            label: Page 2.2.2
            uri: page2/page2_2/page2_2_2
            active: 1
      page2_3:
        label: Page 2.3
        uri: page2/page2_3
        pages:
          page2_3_1:
            label: Page 2.3.1
            uri: page2/page2_3/page2_3_1
          page2_3_2:
            label: Page 2.3.2
            uri: page2/page2_3/page2_3_2
            visible: 0
            pages:
              page2_3_2_1:
                label: Page 2.3.2.1
                uri: page2/page2_3/page2_3_2/1
                active: 1
              page2_3_2_2:
                label: Page 2.3.2.2
                uri: page2/page2_3/page2_3_2/2
                active: 1
                pages:
                  page_2_3_2_2_1:
                    label: Ignore
                    uri: #
                    active: 1
          page2_3_3:
            label: Page 2.3.3
            uri: page2/page2_3/page2_3_3
            resource: admin
            pages:
              page2_3_3_1:
                label: Page 2.3.3.1
                uri: page2/page2_3/page2_3_3/1
                active: 1
              page2_3_3_2:
                label: Page 2.3.3.2
                uri: page2/page2_3/page2_3_3/2
                resource: guest
                active: 1
  page3:
    label: Page 3
    uri: page3
    pages:
      page3_1:
        label: Page 3.1
        uri: page3/page3_1
        resource: guest
      page3_2:
        label: Page 3.2
        uri: page3/page3_2
        resource: member
        pages:
          page3_2_1:
            label: Page 3.2.1
            uri: page3/page3_2/page3_2_1
          page3_2_2:
            label: Page 3.2.2
            uri: page3/page3_2/page3_2_2
            resource: admin
      page3_3:
        label: Page 3.3
        uri: page3/page3_3
        resource: special
        pages:
          page3_3_1:
            label: Page 3.3.1
            uri: page3/page3_3/page3_3_1
            visible: 0
          page3_3_2:
            label: Page 3.3.2
            uri: page3/page3_3/page3_3_2
            resource: admin
  home:
    label: Home
    order: -100
    module: default
    controller: index
    action: index
$config    = new Zend_Config_Yaml'/path/to/navigation.yaml', 'nav');
$container = new Zend_Navigation($config);

51.3.2. Añadir páginas

Añadir páginas a un contenedor puede hacerse con los métodos addPage(), addPages(), o setPages(). Vea los ejemplos siguientes para la explicación.

Ejemplo 51.13. Añadir páginas a un contenedor

// create container
$container = new Zend_Navigation();

// add page by giving a page instance
$container->addPage(Zend_Navigation_Page::factory(array(
    'uri' => 'http://www.example.com/',
)));

// add page by giving an array
$container->addPage(array(
    'uri' => 'http://www.example.com/',
));

// add page by giving a config object
$container->addPage(new Zend_Config(array(
    'uri' => 'http://www.example.com/',
)));

$pages = array(
    array(
        'label'  => 'Save',
        'action' => 'save',
    ),
    array(
        'label'  => 'Delete',
        'action' => 'delete',
    ),
);

// add two pages
$container->addPages($pages);

// add container
$container->addPages(new Zend_Navigation(array(
    array(
        'label'  => 'Move up',
        'action' => 'up',
    ),
    array(
        'label'  => 'Move down',
        'action' => 'down',
    ),
)));

// remove existing pages and add the given pages
$container->setPages($pages);

51.3.3. Eliminar páginas

Eliminar páginas puede hacerse con removePage() o removePages(). El primer método acepta una instancia de una página, o un entero. El entero corresponde al order que tiene una página. El segundo método eliminará todas las páginas del contenedor.

Ejemplo 51.14. Eliminar páginas de un contenedor

$container = new Zend_Navigation(array(
    array(
        'label'  => 'Page 1',
        'action' => 'page1'
    ),
    array(
        'label'  => 'Page 2',
        'action' => 'page2',
        'order'  => 200
    ),
    array(
        'label'  => 'Page 3',
        'action' => 'page3'
    )
));

// remove page by implicit page order
$container->removePage(0);      // removes Page 1

// remove page by instance
$page3 = $container->findOneByAction('page3');
$container->removePage($page3); // removes Page 3

// remove page by explicit page order
$container->removePage(200);    // removes Page 2

// remove all pages
$container->removePages();      // removes all pages

51.3.4. Buscar páginas

Los contenedores disponen de métodos localizadores para recuperar páginas. Estos son findOneBy($property, $value, $useRegex = false), findAllBy($property, $value, $useRegex = false), y findBy($property, $value, $all = false, $useRegex = false). Esos métodos buscarán recursivamente en el contenedor las páginas que coincidan con la condición dada $page->$property == $value o, cuando se usan expresiones regulares: preg_match($value, $page->$property). El primer método, findOneBy(), devolverá una única página que coincida con la propiedad y el valor dados, o NULL si no puede encontrarse. El segundo método devolverá todas las páginas con una propiedad que coincida con el valor dado. El tercer método llamará a uno de los dos métodos anteriores dependiendo del indicador $all.

Los métodos localizadores también pueden usarse de forma mágica añadiendo el nombre de la propiedad a findBy, findOneBy, o findAllBy, p.ej. findOneByLabel('Home') para devolver la primera página que coincida con la etiqueta 'Home'. Otras combinaciones son findByLabel(...), findOnyByTitle(...), findAllByController(...), etc. Los métodos localizadores también funcionan con propiedades personalizadas, como findByFoo('bar').

Ejemplo 51.15. Buscar páginas en un contenedor

$container = new Zend_Navigation(array(
    array(
        'label' => 'Page 1',
        'uri'   => 'page-1',
        'foo'   => 'bar',
        'pages' => array(
            array(
                'label' => 'Page 1.1',
                'uri'   => 'page-1.1',
                'foo'   => 'bar',
            ),
            array(
                'label' => 'Page 1.2',
                'uri'   => 'page-1.2',
                'class' => 'my-class',
            ),
            array(
                'type'   => 'uri',
                'label'  => 'Page 1.3',
                'uri'    => 'page-1.3',
                'action' => 'about'
            )
        )
    ),
    array(
        'label'      => 'Page 2',
        'id'         => 'page_2_and_3',
        'class'      => 'my-class',
        'module'     => 'page2',
        'controller' => 'index',
        'action'     => 'page1'
    ),
    array(
        'label'      => 'Page 3',
        'id'         => 'page_2_and_3',
        'module'     => 'page3',
        'controller' => 'index'
    )
));

// The 'id' is not required to be unique, but be aware that
// having two pages with the same id will render the same id attribute
// in menus and breadcrumbs.
$found = $container->findBy('id', 'page_2_and_3'); // returns Page 2
$found = $container->findOneBy('id', 'page_2_and_3'); // returns Page 2
$found = $container->findBy('id', 'page_2_and_3', true); // returns Page 2 and Page 3
$found = $container->findById('page_2_and_3'); // returns Page 2
$found = $container->findOneById('page_2_and_3'); // returns Page 2
$found = $container->findAllById('page_2_and_3'); // returns Page 2 and Page 3

// Find all matching CSS class my-class
$found = $container->findAllBy('class', 'my-class'); // returns Page 1.2 and Page 2
$found = $container->findAllByClass('my-class');  // returns Page 1.2 and Page 2

// Find first matching CSS class my-class
$found = $container->findOneByClass('my-class'); // returns Page 1.2

// Find all matching CSS class non-existant
$found = $container->findAllByClass('non-existant'); // returns array()

// Find first matching CSS class non-existant
$found = $container->findOneByClass('non-existant'); // returns null

// Find all pages with custom property 'foo' = 'bar'
$found = $container->findAllBy('foo', 'bar'); // returns Page 1 and Page 1.1

// To achieve the same magically, 'foo' must be in lowercase.
// This is because 'foo' is a custom property, and thus the
// property name is not normalized to 'Foo'
$found = $container->findAllByfoo('bar');

// Find all with controller = 'index'
$found = $container->findAllByController('index'); // returns Page 2 and Page 3

Use expresiones regulares para buscar páginas:

$found = $container->findBy('class','/my/', false, true); // returns Page 1.2
$found = $container->findOneBy('class', '/my/', true); // returns Page 1.2
$found = $container->findBy('class', '/my/', true, true); // returns Page 1.2 and Page 2
$found = $container->findAllBy('class', '/my/', true); // returns Page 1.2 and Page 2
$found = $container->findOneByClass('/my/', true); // returns Page 1.2
$found = $container->findAllByClass('/my/', true); // returns Page 1.2 and Page 2

51.3.5. Iterar contenedores

Zend_Navigation_Container implementa RecursiveIteratorIterator, y puede iterarse usando cualquier clase Iterator. Para iterar un contenedor recursivamente, use la clase RecursiveIteratorIterator.

Ejemplo 51.16. Iterar un contenedor

/*
 * Create a container from an array
 */
$container = new Zend_Navigation(array(
    array(
        'label' => 'Page 1',
        'uri'   => '#'
    ),
    array(
        'label' => 'Page 2',
        'uri'   => '#',
        'pages' => array(
            array(
                'label' => 'Page 2.1',
                'uri'   => '#'
            ),
            array(
                'label' => 'Page 2.2',
                'uri'   => '#'
            )
        )
    ),
    array(
        'label' => 'Page 3',
        'uri'   => '#'
    )
));

// Iterate flat using regular foreach:
// Output: Page 1, Page 2, Page 3
foreach ($container as $page) {
    echo $page->label;
}

// Iterate recursively using RecursiveIteratorIterator
$it = new RecursiveIteratorIterator(
        $container, RecursiveIteratorIterator::SELF_FIRST);

// Output: Page 1, Page 2, Page 2.1, Page 2.2, Page 3
foreach ($it as $page) {
    echo $page->label;
}

51.3.6. Otras operaciones

El método hasPage(Zend_Navigation_Page $page) comprueba si el contenedor tiene la página dada. El método hasPages() comprueba si hay alguna página en el contenedor, y es equivalente a count($container) > 1.

El método toArray() convierte el contenedor y las páginas que contiene en un array. Esto puede ser útil para serializar y depurar.

Ejemplo 51.17. Convertir un contenedor en un array

$container = new Zend_Navigation(array(
    array(
        'label' => 'Page 1',
        'uri'   => '#'
    ),
    array(
        'label' => 'Page 2',
        'uri'   => '#',
        'pages' => array(
            array(
                'label' => 'Page 2.1',
                'uri'   => '#'
            ),
            array(
                'label' => 'Page 2.2',
               'uri'   => '#'
            )
        )
    )
));

var_dump($container->toArray());

/* Output:
array(2) {
  [0]=> array(15) {
    ["label"]=> string(6) "Page 1"
    ["id"]=> NULL
    ["class"]=> NULL
    ["title"]=> NULL
    ["target"]=> NULL
    ["rel"]=> array(0) {
    }
    ["rev"]=> array(0) {
    }
    ["order"]=> NULL
    ["resource"]=> NULL
    ["privilege"]=> NULL
    ["active"]=> bool(false)
    ["visible"]=> bool(true)
    ["type"]=> string(23) "Zend_Navigation_Page_Uri"
    ["pages"]=> array(0) {
    }
    ["uri"]=> string(1) "#"
  }
  [1]=> array(15) {
    ["label"]=> string(6) "Page 2"
    ["id"]=> NULL
    ["class"]=> NULL
    ["title"]=> NULL
    ["target"]=> NULL
    ["rel"]=> array(0) {
    }
    ["rev"]=> array(0) {
    }
    ["order"]=> NULL
    ["resource"]=> NULL
    ["privilege"]=> NULL
    ["active"]=> bool(false)
    ["visible"]=> bool(true)
    ["type"]=> string(23) "Zend_Navigation_Page_Uri"
    ["pages"]=> array(2) {
      [0]=> array(15) {
        ["label"]=> string(8) "Page 2.1"
        ["id"]=> NULL
        ["class"]=> NULL
        ["title"]=> NULL
        ["target"]=> NULL
        ["rel"]=> array(0) {
        }
        ["rev"]=> array(0) {
        }
        ["order"]=> NULL
        ["resource"]=> NULL
        ["privilege"]=> NULL
        ["active"]=> bool(false)
        ["visible"]=> bool(true)
        ["type"]=> string(23) "Zend_Navigation_Page_Uri"
        ["pages"]=> array(0) {
        }
        ["uri"]=> string(1) "#"
      }
      [1]=>
      array(15) {
        ["label"]=> string(8) "Page 2.2"
        ["id"]=> NULL
        ["class"]=> NULL
        ["title"]=> NULL
        ["target"]=> NULL
        ["rel"]=> array(0) {
        }
        ["rev"]=> array(0) {
        }
        ["order"]=> NULL
        ["resource"]=> NULL
        ["privilege"]=> NULL
        ["active"]=> bool(false)
        ["visible"]=> bool(true)
        ["type"]=> string(23) "Zend_Navigation_Page_Uri"
        ["pages"]=> array(0) {
        }
        ["uri"]=> string(1) "#"
      }
    }
    ["uri"]=> string(1) "#"
  }
}
*/