TigerZF
🌐Español

51.2. Páginas

Zend_Navigation incluye dos tipos de página:

Las páginas MVC enlazan a páginas web dentro del sitio, y se definen usando parámetros MVC (action, controller, module, route, params). Las páginas URI se definen mediante una única propiedad uri, que le da toda la flexibilidad para enlazar páginas fuera del sitio o hacer otras cosas con los enlaces generados (por ejemplo, un URI que se convierte en <a href="#">foo<a>).

51.2.1. Características comunes de las páginas

Todas las clases de página deben extender Zend_Navigation_Page, y por lo tanto compartirán un conjunto común de características y propiedades. Cabe destacar que comparten las opciones de la tabla siguiente y el mismo proceso de inicialización.

Las claves de opciones se corresponden con métodos set. Esto significa que la opción order se corresponde con el método setOrder(), y reset_params se corresponde con el método setResetParams(). Si no hay un método setter para la opción, se establecerá como propiedad personalizada de la página.

Lea más sobre cómo extender Zend_Navigation_Page en Creación de tipos de página personalizados.

Tabla 51.1. Opciones comunes de página

Clave Tipo Por defecto Descripción
label String NULL Una etiqueta de página, como 'Home' o 'Blog'.
id String | int NULL Una etiqueta/atributo id que puede usarse al renderizar la página, típicamente en un elemento anchor.
class String NULL Una clase CSS que puede usarse al renderizar la página, típicamente en un elemento anchor.
title String NULL Una breve descripción de la página, típicamente para usarse como el atributo title en un anchor.
target String NULL Especifica un target que puede usarse para la página, típicamente en un elemento anchor.
accesskey String NULL Este atributo asigna una tecla de acceso a un elemento A. Una tecla de acceso es un único carácter del conjunto de caracteres del documento.
fragment String NULL El identificador de fragmento (identificador de anchor) que apunta a un anchor dentro de un recurso que es subordinado a otro, recurso primario. El identificador de fragmento se introduce mediante una marca de almohadilla '#'. Ejemplo: http://www.example.org/foo.html#bar ('bar' es el identificador de fragmento)
rel Array array() Especifica relaciones directas (forward) para la página. Cada elemento del array es un par clave-valor, donde la clave designa el tipo de relación/enlace, y el valor es un puntero a la página enlazada. Un ejemplo de par clave-valor es 'alternate' => 'format/plain.html'. Para permitir total flexibilidad, no hay restricciones sobre los valores de relación. El valor no tiene que ser una cadena. Lea más sobre rel y rev en la sección sobre el ayudante Links..
rev Array array() Especifica relaciones inversas para la página. Funciona exactamente igual que rel.
order String | int | NULL NULL Funciona como order para elementos en Zend_Form. Si se especifica, la página se iterará en un orden específico, lo que significa que puede forzar que una página se itere antes que otras estableciendo el atributo order a un número bajo, p. ej. -100. Si se da un String, debe parsearse a un int válido. Si se da NULL, se restablecerá, lo que significa que se usará el orden en el que la página fue añadida al contenedor.
resource String | Zend_Acl_Resource_Interface | NULL NULL Recurso ACL a asociar con la página. Lea más en la sección sobre la integración de ACL en los ayudantes de vista..
privilege String | NULL NULL Privilegio ACL a asociar con la página. Lea más en la sección sobre la integración de ACL en los ayudantes de vista..
active bool FALSE Si la página debe considerarse activa para la solicitud actual. Si active es FALSE o no se indica, las páginas MVC verificarán sus propiedades contra el objeto request al llamar a $page->isActive().
visible bool TRUE Si la página debe ser visible para el usuario, o solo formar parte de la estructura. Los ayudantes de vista omiten las páginas invisibles.
pages Array | Zend_Config | NULL NULL Páginas hijas de la página. Esto puede ser un Array u objeto Zend_Config que contenga bien opciones de página que puedan pasarse al método factory(), o instancias reales de Zend_Navigation_Page, o una mezcla de ambos.

[Note] Propiedades personalizadas

Todas las páginas admiten establecer y obtener propiedades personalizadas mediante el uso de los métodos mágicos __set($name, $value), __get($name), __isset($name) y __unset($name). Las propiedades personalizadas pueden tener cualquier valor, y se incluirán en el array que devuelve $page->toArray(), lo que significa que las páginas pueden serializarse/deserializarse correctamente incluso si las páginas contienen propiedades que no son nativas de la clase de página.

Tanto las propiedades nativas como las personalizadas pueden establecerse usando $page->set($name, $value) y obtenerse usando $page->get($name), o mediante métodos mágicos.

Ejemplo 51.1. Propiedades personalizadas de página

Este ejemplo muestra cómo pueden usarse las propiedades personalizadas.

$page = new Zend_Navigation_Page_Mvc();
$page->foo = 'bar';
$page->meaning = 42;

echo $page->foo;

if ($page->meaning != 42) {
    // action should be taken
}

51.2.2. Zend_Navigation_Page_Mvc

Las páginas MVC se definen usando parámetros MVC conocidos de el componente Zend_Controller. Una página MVC usará Zend_Controller_Action_Helper_Url internamente en el método getHref() para generar hrefs, y el método isActive() intersectará los parámetros de Zend_Controller_Request_Abstract con los parámetros de la página para determinar si la página está activa.

Tabla 51.2. Opciones de página MVC

Clave Tipo Por defecto Descripción
action String NULL Nombre de la acción a usar al generar el href de la página.
controller String NULL Nombre del controlador a usar al generar el href de la página.
module String NULL Nombre del módulo a usar al generar el href de la página.
params Array array() Parámetros de usuario a usar al generar el href de la página.
route String NULL Nombre de la ruta a usar al generar el href de la página.
reset_params bool TRUE Si los parámetros de usuario deben restablecerse al generar el href de la página.
encode_url bool TRUE Si el href debe codificarse al ensamblar la URL.

[Note] Nota

Los tres ejemplos siguientes asumen una configuración MVC por defecto con la ruta default establecida.

La URI devuelta es relativa al baseUrl en Zend_Controller_Front. En los ejemplos, el baseUrl es '/' por simplicidad.

Ejemplo 51.2. getHref() genera el URI de la página

Este ejemplo muestra que las páginas MVC usan Zend_Controller_Action_Helper_Url internamente para generar URIs al llamar a $page->getHref().

// getHref() returns /
$page = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'index',
    'controller' => 'index'
));

// getHref() returns /blog/post/view
$page = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'view',
    'controller' => 'post',
    'module'     => 'blog'
));

// getHref() returns /blog/post/view/id/1337
$page = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'view',
    'controller' => 'post',
    'module'     => 'blog',
    'params'     => array('id' => 1337)
));

Ejemplo 51.3. isActive() determina si la página está activa

Este ejemplo muestra que las páginas MVC determinan si están activas usando los parámetros encontrados en el objeto request.

/*
 * Dispatched request:
 * - module:     default
 * - controller: index
 * - action:     index
 */
$page1 = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'index',
    'controller' => 'index'
));

$page2 = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'bar',
    'controller' => 'index'
));

$page1->isActive(); // returns true
$page2->isActive(); // returns false

/*
 * Dispatched request:
 * - module:     blog
 * - controller: post
 * - action:     view
 * - id:         1337
 */
$page = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'view',
    'controller' => 'post',
    'module'     => 'blog'
));

// returns true, because request has the same module, controller and action
$page->isActive();

/*
 * Dispatched request:
 * - module:     blog
 * - controller: post
 * - action:     view
 */
$page = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'view',
    'controller' => 'post',
    'module'     => 'blog',
    'params'     => array('id' => null)
));

// returns false, because page requires the id param to be set in the request
$page->isActive(); // returns false

Ejemplo 51.4. Uso de rutas

Las rutas pueden usarse con páginas MVC. Si una página tiene una ruta, esta ruta se usará en getHref() para generar la URL de la página.

[Note] Nota

Tenga en cuenta que al usar la propiedad route en una página, también debe especificar los parámetros por defecto que la ruta define (module, controller, action, etc.), de lo contrario el método isActive() no podrá determinar si la página está activa. La razón de esto es que actualmente no hay forma de obtener los parámetros por defecto de un objeto Zend_Controller_Router_Route_Interface, ni de recuperar la ruta actual de un objeto Zend_Controller_Router_Interface.

// the following route is added to the ZF router
Zend_Controller_Front::getInstance()->getRouter()->addRoute(
    'article_view', // route name
    new Zend_Controller_Router_Route(
        'a/:id',
        array(
            'module'     => 'news',
            'controller' => 'article',
            'action'     => 'view',
            'id'         => null
        )
    )
);

// a page is created with a 'route' option
$page = new Zend_Navigation_Page_Mvc(array(
    'label'      => 'A news article',
    'route'      => 'article_view',
    'module'     => 'news',    // required for isActive(), see note above
    'controller' => 'article', // required for isActive(), see note above
    'action'     => 'view',    // required for isActive(), see note above
    'params'     => array('id' => 42)
));

// returns: /a/42
$page->getHref();

Ejemplo 51.5. Establecer parámetros a usar al ensamblar la URL

// The following route is added to the ZF router
Zend_Controller_Front::getInstance()->getRouter()->addRoute(
    'article_list', // route name
    new Zend_Controller_Router_Route(
        'blog/:category/:page',
        array(
            'module'     => 'blog',
            'controller' => 'article',
            'action'     => 'list',
            'category'   => null,
            'page'       => null,
        )
    )
);

// A page is created with the 'route' option
$page = new Zend_Navigation_Page_Mvc(array(
    'label'      => 'Article list',
    'module'     => 'blog',
    'controller' => 'post',
    'action'     => 'list',
));

// Add multiple parameters at once
$page->addParams(
    array(
        'category' => 'news',
        'page'     => 1,
    )
);

// Add a single parameter
$page->addParam('category', 'news');

// Set multiple parameters at once (Overwrites any previously set parameters!)
$page->setParams(
    array(
        'category' => 'news',
        'page'     => 1,
    )
);

// Set a single parameter
$page->setParam('category', 'news');

// Retrieve all parameters
$params = $page->getParams();

// Retrieve a single parameter
$category = $page->getParam('category');

// Remove a parameter
$page->removeParam('page');

// Clear all parameters
$page->clearParams();
        

51.2.3. Zend_Navigation_Page_Uri

Las páginas de tipo Zend_Navigation_Page_Uri pueden usarse para enlazar a páginas en otros dominios o sitios, o para implementar lógica personalizada para la página. Las páginas URI son simples; además de las opciones de página comunes, una página URI solo admite una opción — uri. El uri se devolverá al llamar a $page->getHref(), y puede ser una String o NULL.

[Note] Nota

Zend_Navigation_Page_Uri no intentará determinar si debe estar activa al llamar a $page->isActive(). Simplemente devuelve lo que está establecido actualmente, así que para hacer activa una página URI debe llamar manualmente a $page->setActive() o especificar active como opción de página al construirla.

Tabla 51.3. Opciones de página URI

Clave Tipo Por defecto Descripción
uri String NULL URI de la página. Puede ser cualquier cadena o NULL.

51.2.4. Creación de tipos de página personalizados

Al extender Zend_Navigation_Page, normalmente no es necesario sobrescribir el constructor ni los métodos setOptions() o setConfig(). El constructor de la página acepta un único parámetro, un Array u objeto Zend_Config, que se pasa a setOptions() o setConfig() respectivamente. Esos métodos a su vez llamarán al método set(), que mapeará las opciones a propiedades nativas o personalizadas. Si se indica la opción internal_id, el método primero buscará un método llamado setInternalId(), y le pasará la opción a este método si existe. Si el método no existe, la opción se establecerá como propiedad personalizada de la página, y será accesible mediante $internalId = $page->internal_id; o $internalId = $page->get('internal_id');.

Ejemplo 51.6. La página personalizada más simple

Lo único que una clase de página personalizada necesita implementar es el método getHref().

class My_Simple_Page extends Zend_Navigation_Page
{
    public function getHref()
    {
        return 'something-completely-different';
    }
}

Ejemplo 51.7. Una página personalizada con propiedades

Al añadir propiedades a una página extendida, no es necesario sobrescribir/modificar setOptions() o setConfig().

class My_Navigation_Page extends Zend_Navigation_Page
{
    private $_foo;
    private $_fooBar;

    public function setFoo($foo)
    {
        $this->_foo = $foo;
    }

    public function getFoo()
    {
        return $this->_foo;
    }

    public function setFooBar($fooBar)
    {
        $this->_fooBar = $fooBar;
    }

    public function getFooBar()
    {
        return $this->_fooBar;
    }

    public function getHref()
    {
        return $this->foo . '/' . $this->fooBar;
    }
}

// can now construct using
$page = new My_Navigation_Page(array(
    'label'   => 'Property names are mapped to setters',
    'foo'     => 'bar',
    'foo_bar' => 'baz'
));

// ...or
$page = Zend_Navigation_Page::factory(array(
    'type'    => 'My_Navigation_Page',
    'label'   => 'Property names are mapped to setters',
    'foo'     => 'bar',
    'foo_bar' => 'baz'
));

51.2.5. Creación de páginas usando la fábrica de páginas

Todas las páginas (incluidas las clases personalizadas) pueden crearse usando la fábrica de páginas, Zend_Navigation_Page::factory(). La fábrica puede recibir un array con opciones, o un objeto Zend_Config. Cada clave del array/config corresponde a una opción de página, como se ve en la sección sobre Páginas. Si se indica la opción uri y no se indican opciones MVC (action, controller, module, route), se creará una página URI. Si se indica alguna de las opciones MVC, se creará una página MVC.

Si se indica type, la fábrica asumirá que el valor es el nombre de la clase que debe crearse. Si el valor es mvc o uri se creará una página MVC/URI.

Ejemplo 51.8. Creación de una página MVC usando la fábrica de páginas

$page = Zend_Navigation_Page::factory(array(
    'label'  => 'My MVC page',
    'action' => 'index'
));

$page = Zend_Navigation_Page::factory(array(
    'label'      => 'Search blog',
    'action'     => 'index',
    'controller' => 'search',
    'module'     => 'blog'
));

$page = Zend_Navigation_Page::factory(array(
    'label'      => 'Home',
    'action'     => 'index',
    'controller' => 'index',
    'module'     => 'index',
    'route'      => 'home'
));

$page = Zend_Navigation_Page::factory(array(
    'type'   => 'mvc',
    'label'  => 'My MVC page'
));

Ejemplo 51.9. Creación de una página URI usando la fábrica de páginas

$page = Zend_Navigation_Page::factory(array(
    'label' => 'My URI page',
    'uri'   => 'http://www.example.com/'
));

$page = Zend_Navigation_Page::factory(array(
    'label'  => 'Search',
    'uri'    => 'http://www.example.com/search',
    'active' => true
));

$page = Zend_Navigation_Page::factory(array(
    'label' => 'My URI page',
    'uri'   => '#'
));

$page = Zend_Navigation_Page::factory(array(
    'type'   => 'uri',
    'label'  => 'My URI page'
));

Ejemplo 51.10. Creación de un tipo de página personalizado usando la fábrica de páginas

Para crear un tipo de página personalizado usando la fábrica, use la opción type para especificar un nombre de clase a instanciar.

class My_Navigation_Page extends Zend_Navigation_Page
{
    protected $_fooBar = 'ok';

    public function setFooBar($fooBar)
    {
        $this->_fooBar = $fooBar;
    }
}

$page = Zend_Navigation_Page::factory(array(
    'type'    => 'My_Navigation_Page',
    'label'   => 'My custom page',
    'foo_bar' => 'foo bar'
));