TigerZF
🌐Español

40.4. Uso avanzado de Zend_Layout

Zend_Layout tiene una serie de casos de uso para el desarrollador avanzado que desee adaptarlo a diferentes implementaciones de vista, estructuras de sistema de archivos, y más.

Los principales puntos de extensión son:

  • Objetos de vista personalizados. Zend_Layout le permite utilizar cualquier clase que implemente Zend_View_Interface.

  • Plugins de controlador frontal personalizados. Zend_Layout incluye un plugin de controlador frontal estándar que automatiza la renderización de los layouts antes de devolver la respuesta. Puede sustituirlo por su propio plugin.

  • Helpers de acción personalizados. Zend_Layout incluye un helper de acción estándar que debería ser adecuado para la mayoría de las necesidades, ya que es un simple proxy hacia el propio objeto layout.

  • Resolución de ruta de script de layout personalizada. Zend_Layout le permite usar su propio inflector para la resolución de la ruta del script de layout, o simplemente modificar el inflector asociado para especificar sus propias reglas de inflexión.

40.4.1. Objetos de vista personalizados

Zend_Layout le permite usar cualquier clase que implemente Zend_View_Interface o que extienda Zend_View_Abstract para renderizar su script de layout. Simplemente pase su objeto de vista personalizado como parámetro al constructor/startMvc(), o establézcalo usando el accesor setView():

$view = new My_Custom_View();
$layout->setView($view);
[Note] No todas las implementaciones de Zend_View son iguales

Aunque Zend_Layout le permite usar cualquier clase que implemente Zend_View_Interface, puede encontrarse con problemas si no pueden utilizar los distintos helpers de Zend_View, en particular los helpers de layout y placeholder. Esto se debe a que Zend_Layout hace que las variables establecidas en el objeto estén disponibles a través de sí mismo y de los placeholders.

Si necesita usar una implementación de Zend_View personalizada que no admita estos helpers, necesitará encontrar la forma de llevar las variables de layout a la vista. Esto puede hacerse extendiendo el objeto Zend_Layout y modificando el método render() para pasar las variables a la vista, o creando su propia clase de plugin que las pase antes de renderizar el layout.

Alternativamente, si su implementación de vista admite algún tipo de capacidad de plugin, puede acceder a las variables mediante el placeholder 'Zend_Layout', usando el helper placeholder:

$placeholders = new Zend_View_Helper_Placeholder();
$layoutVars   = $placeholders->placeholder('Zend_Layout')->getArrayCopy();

40.4.2. Plugins de controlador frontal personalizados

Cuando se usa con los componentes MVC, Zend_Layout registra un plugin de controlador frontal que renderiza el layout como la última acción antes de salir del bucle de despacho. En la mayoría de los casos, el plugin por defecto será adecuado, pero si desea escribir el suyo propio, puede especificar el nombre de la clase de plugin a cargar pasando la opción pluginClass al método startMvc().

Cualquier clase de plugin que escriba para este fin necesitará extender Zend_Controller_Plugin_Abstract, y debería aceptar una instancia del objeto layout como argumento del constructor. Por lo demás, los detalles de su implementación dependen de usted.

La clase de plugin por defecto utilizada es Zend_Layout_Controller_Plugin_Layout.

40.4.3. Helpers de acción personalizados

Cuando se usa con los componentes MVC, Zend_Layout registra un helper de controlador de acción en el broker de helpers. El helper por defecto, Zend_Layout_Controller_Action_Helper_Layout, actúa como un simple proxy hacia la propia instancia del objeto layout, y debería ser adecuado para la mayoría de los casos de uso.

Si siente la necesidad de escribir funcionalidad personalizada, simplemente escriba una clase de helper de acción que extienda Zend_Controller_Action_Helper_Abstract y pase el nombre de la clase como la opción helperClass al método startMvc(). Los detalles de la implementación quedan a su cargo.

40.4.4. Resolución de ruta de script de layout personalizada: uso del inflector

Zend_Layout utiliza Zend_Filter_Inflector para establecer una cadena de filtros para traducir un nombre de layout a una ruta de script de layout. Por defecto, utiliza las reglas 'Word_CamelCaseToDash' seguida de 'StringToLower', y el sufijo 'phtml' para transformar el nombre en una ruta. Como algunos ejemplos:

  • 'foo' se transformará en 'foo.phtml'.

  • 'FooBarBaz' se transformará en 'foo-bar-baz.phtml'.

Tiene tres opciones para modificar la inflexión: modificar el destino de inflexión y/o el sufijo de vista mediante los accesores de Zend_Layout, modificar las reglas del inflector y el destino del inflector asociado a la instancia de Zend_Layout, o crear su propia instancia de inflector y pasarla a Zend_Layout::setInflector().

Ejemplo 40.4. Uso de los accesores de Zend_Layout para modificar el inflector

El inflector por defecto de Zend_Layout utiliza referencias estáticas para el destino y el sufijo del script de vista, y dispone de accesores para establecer estos valores.

// Establecer el destino del inflector:
$layout->setInflectorTarget('layouts/:script.:suffix');

// Establecer el sufijo del script de vista de layout:
$layout->setViewSuffix('php');

Ejemplo 40.5. Modificación directa del inflector de Zend_Layout

Los inflectores tienen un destino y una o más reglas. El destino por defecto utilizado con Zend_Layout es ':script.:suffix'; a ':script' se le pasa el nombre de layout registrado, mientras que ':suffix' es una regla estática del inflector.

Supongamos que quiere que el script de layout termine con el sufijo 'html', y que quiere separar las palabras en MixedCase y camelCase con guiones bajos en lugar de guiones, y no convertir el nombre a minúsculas. Además, quiere que busque el script en un subdirectorio 'layouts'.

$layout->getInflector()->setTarget('layouts/:script.:suffix')
                       ->setStaticRule('suffix', 'html')
                       ->setFilterRule(array('Word_CamelCaseToUnderscore'));

Ejemplo 40.6. Inflectores personalizados

En la mayoría de los casos, modificar el inflector existente será suficiente. Sin embargo, puede que tenga un inflector que desee utilizar en varios lugares, con objetos diferentes de distintos tipos. Zend_Layout lo permite.

$inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
$inflector->addRules(array(
    ':script' => array('Word_CamelCaseToUnderscore'),
    'suffix'  => 'html'
));
$layout->setInflector($inflector);

[Note] La inflexión puede desactivarse

La inflexión puede desactivarse y activarse mediante accesores en el objeto Zend_Layout. Esto puede ser útil si desea especificar una ruta absoluta para un script de vista de layout, o sabe que el mecanismo que utilizará para especificar el script de layout no necesita inflexión. Simplemente use los métodos enableInflector() y disableInflector().