Zend_Form incluye varios decoradores estándar. Para más
información sobre el uso general de decoradores, consulte la sección de Decoradores.
El decorador Callback puede ejecutar una retrollamada (callback) arbitraria para
renderizar contenido. Las retrollamadas deben especificarse mediante la opción
'callback' pasada en la configuración del decorador, y pueden ser cualquier
tipo de retrollamada válido de PHP. Las retrollamadas deben aceptar tres
argumentos, $content (el contenido original pasado a
el decorador), $element (el elemento que se está
decorando), y un array de $options. Como ejemplo
de retrollamada:
class Util
{
public static function label($content, $element, array $options)
{
return '<span class="label">' . $element->getLabel() . "</span>";
}
}
Esta retrollamada se especificaría como array('Util',
'label'), y generaría cierto (mal) marcado HTML
para la etiqueta. El decorador Callback entonces reemplazaría,
añadiría o antepondría al contenido original el valor de
retorno de esto.
El decorador Callback permite especificar un valor NULL para la
opción de posicionamiento, lo que reemplazará el contenido original con
el valor de retorno de la retrollamada; 'prepend' y 'append' siguen siendo
válidos también.
El decorador Captcha se utiliza con el elemento de formulario
CAPTCHA. Utiliza el método render() del
adaptador CAPTCHA para generar la salida.
Una variante del decorador Captcha, 'Captcha_Word', también es comúnmente utilizada, y crea dos elementos, un id y un input. El id indica el identificador de sesión contra el cual comparar, y el input es para la verificación del CAPTCHA por parte del usuario. Estos se validan como un único elemento.
El decorador Description puede utilizarse para mostrar una descripción establecida
en un Zend_Form, Zend_Form_Element, o
elemento Zend_Form_DisplayGroup; obtiene la descripción
mediante el método getDescription() del objeto. Los casos de uso
comunes son proporcionar sugerencias de interfaz de usuario para sus elementos.
Por defecto, si no hay ninguna descripción presente, no se genera ninguna salida. Si
la descripción está presente, entonces se envuelve en una etiqueta HTML
p por defecto, aunque puede especificar una etiqueta
pasando una opción tag al crear el decorador, o
llamando a setTag(). Adicionalmente puede especificar una clase
para la etiqueta usando la opción class o llamando a
setOption('class', 'foo'); por defecto, se usa la clase 'hint'.
La descripción se escapa usando los mecanismos de escape del objeto de vista
por defecto. Puede deshabilitar esto pasando un valor
FALSE a la opción 'escape' del decorador o al método
setEscape().
Los decoradores por defecto utilizan listas de definición (<dl>) para renderizar los elementos de formulario. Dado que los elementos de formulario pueden aparecer en cualquier orden, los grupos de visualización y los subformularios pueden intercalarse con otros elementos de formulario. Para mantener estos tipos particulares de elementos dentro de la lista de definición, el DtDdWrapper crea un nuevo término de definición vacío (<dt>) y envuelve su contenido en un nuevo dato de definición (<dd>). La salida se ve algo así:
<dt></dt>
<dd><fieldset id="subform">
<legend>User Information</legend>
...
</fieldset></dd>
Este decorador reemplaza el contenido que se le proporciona envolviéndolo dentro del elemento <dd>.
Los errores de elemento tienen su propio decorador con el decorador Errors. Este decorador delega en el ayudante de vista (view helper) FormErrors, el cual renderiza los mensajes de error en una lista no ordenada (<ul>) como elementos de lista. El elemento <ul> recibe una clase de "errors".
El decorador Errors puede anteponer o añadir el contenido que se le proporciona.
Los grupos de visualización y los subformularios renderizan su contenido dentro de
fieldsets por defecto. El decorador Fieldset comprueba si existe una
opción 'legend' o un método getLegend() en el
elemento registrado, y lo usa como leyenda si no está vacío. Cualquier
contenido pasado se envuelve en el fieldset HTML, reemplazando el
contenido original. Cualquier atributo establecido en el elemento decorado se
pasa al fieldset como atributos HTML.
Los elementos File tienen una notación especial cuando se usan múltiples
elementos file o subformularios. El decorador File es usado por
Zend_Form_Element_File y permite establecer múltiples
elementos file con una sola llamada a método. Se usa
automáticamente y corrige el nombre de los elementos.
Los objetos Zend_Form típicamente necesitan renderizar una
etiqueta form HTML. El decorador Form delega en el ayudante de vista Form. Envuelve
cualquier contenido proporcionado en un elemento form HTML, usando la
acción y el método del objeto Zend_Form, y cualquier
atributo como atributos HTML.
Los formularios, grupos de visualización y subformularios son colecciones de
elementos. Para renderizar estos elementos, utilizan el
decorador FormElements, que itera a través de todos los elementos,
llamando a render() en cada uno y uniéndolos con el
separador registrado. Puede añadir o anteponer contenido
que se le pasa.
Algunos desarrolladores y diseñadores prefieren agrupar todos los mensajes de error en la parte superior del formulario. El decorador FormErrors le permite hacer esto.
Por defecto, la lista de errores generada tiene el siguiente marcado:
<ul class="form-errors>
<li><b>[element label or name]</b><ul>
<li>[error message]</li>
<li>[error message]</li>
</ul>
</li>
<li><ul>
<li><b>[subform element label or name</b><ul>
<li>[error message]</li>
<li>[error message]</li>
</ul>
</li>
</ul></li>
</ul>
Puede pasar una variedad de opciones para configurar la salida generada:
ignoreSubForms: si se debe deshabilitar o no la recursión en subformularios. Valor por defecto:
FALSE(es decir, permite la recursión).markupElementLabelEnd: Marcado a añadir a las etiquetas de los elementos. Valor por defecto: '</b>'
markupElementLabelStart: Marcado a anteponer a las etiquetas de los elementos. Valor por defecto: '<b>'
markupListEnd: Marcado a añadir a las listas de mensajes de error . Valor por defecto: '</ul>'.
markupListItemEnd: Marcado a añadir a los mensajes de error individuales. Valor por defecto: '</li>'
markupListItemStart: Marcado a anteponer a los mensajes de error individuales. Valor por defecto: '<li>'
markupListStart: Marcado a añadir a las listas de mensajes de error. Valor por defecto: '<ul class="form-errors">'
El decorador FormErrors puede añadir o anteponer el contenido que se le proporciona.
El decorador HtmlTag le permite utilizar etiquetas HTML para decorar contenido; la etiqueta utilizada se pasa en la opción 'tag', y cualquier otra opción se usa como atributos HTML de esa etiqueta. Se asume que la etiqueta es de nivel de bloque por defecto, y reemplaza el contenido envolviéndolo en la etiqueta dada. Sin embargo, también puede especificar un posicionamiento para añadir o anteponer una etiqueta.
El decorador Image le permite crear una entrada de imagen HTML (<input type="image" ... />), y opcionalmente renderizarla dentro de otra etiqueta HTML.
Por defecto, el decorador usa la propiedad src del elemento, que puede
establecerse con el método setImage(), como la fuente
de la imagen. Adicionalmente, la etiqueta del elemento se usará como la etiqueta
alt, y el imageValue (manipulado con los métodos de acceso
setImageValue() y
getImageValue() del elemento Image) se usará para el valor.
Para especificar una etiqueta HTML con la cual envolver el elemento, o bien pase una
opción 'tag' al decorador, o llame explícitamente a
setTag().
Los elementos de formulario típicamente tienen etiquetas, y el decorador Label se
utiliza para renderizar estas etiquetas. Delega en el ayudante de vista FormLabel,
y obtiene la etiqueta del elemento usando el método
getLabel() del elemento. Si no hay etiqueta
presente, no se renderiza ninguna. Por defecto, las etiquetas se traducen cuando existe un
adaptador de traducción y existe una traducción para la etiqueta.
Opcionalmente puede especificar una opción 'tag'; si se proporciona, envuelve
la etiqueta en esa etiqueta de nivel de bloque. Si la opción 'tag' está
presente, y no hay ninguna etiqueta presente, la etiqueta se renderiza sin
contenido. Puede especificar la clase a usar con la etiqueta con la
opción 'class' o llamando a setTagClass().
Adicionalmente, puede especificar prefijos y sufijos a usar al mostrar el elemento, según si la etiqueta es para un elemento opcional o requerido. Los casos de uso comunes serían añadir un ':' a la etiqueta, o un '*' indicando que un elemento es requerido. Puede hacer esto con las siguientes opciones y métodos:
optionalPrefix: establece el texto a anteponer a la etiqueta cuando el elemento es opcional. Use los métodos de acceso
setOptionalPrefix()ygetOptionalPrefix()para manipularlo.optionalSuffix: establece el texto a añadir a la etiqueta cuando el elemento es opcional. Use los métodos de acceso
setOptionalSuffix()ygetOptionalSuffix()para manipularlo.requiredPrefix: establece el texto a anteponer a la etiqueta cuando el elemento es requerido. Use los métodos de acceso
setRequiredPrefix()ygetRequiredPrefix()para manipularlo.requiredSuffix: establece el texto a añadir a la etiqueta cuando el elemento es requerido. Use los métodos de acceso
setRequiredSuffix()ygetRequiredSuffix()para manipularlo.
Por defecto, el decorador Label antepone al contenido proporcionado; Esto puede controlarse especificando una de las siguientes opciones de 'placement':
PREPEND: renderiza la etiqueta antes del contenido.
APPEND: renderiza la etiqueta después del contenido.
IMPLICIT_PREPEND: renderiza el elemento dentro de la etiqueta label, colocando el texto de la etiqueta antes del contenido.
IMPLICIT_APPEND: renderiza el elemento dentro de la etiqueta label, colocando el texto de la etiqueta después del contenido.
Los formularios, grupos de visualización y subformularios son colecciones de elementos. Al usar el decorador ViewScript con su formulario o subformulario, es útil poder establecer recursivamente el objeto de vista, el traductor, y todos los nombres completamente calificados (según lo determinado por la notación de array de subformulario). El decorador 'PrepareElements' puede hacer esto por usted. Típicamente, lo establecerá como el primer decorador en la lista.
$form->setDecorators(array(
'PrepareElements',
array('ViewScript', array('viewScript' => 'form.phtml')),
));
El decorador Tooltip traduce el atributo title si está disponible, si el traductor está disponible y si el traductor no está deshabilitado en el elemento que se está renderizando.
La mayoría de los elementos utilizan ayudantes de vista de Zend_View
para renderizar, y esto se hace con el decorador ViewHelper. Con
él, puede especificar una etiqueta 'helper' para establecer explícitamente el ayudante
de vista a utilizar; si no se proporciona ninguno, usa el último segmento
del nombre de clase del elemento para determinar el ayudante, anteponiendo
la cadena 'form': por ejemplo, 'Zend_Form_Element_Text' buscaría
un ayudante de vista de 'formText'.
Cualquier atributo del elemento proporcionado se pasa al ayudante de vista como atributos del elemento.
Por defecto, este decorador añade contenido; use la opción 'placement' para especificar un posicionamiento alternativo.
A veces puede querer usar un script de vista para crear sus elementos; de esta forma puede tener control detallado sobre sus elementos, entregar el script de vista a un diseñador, o simplemente crear una forma de anular fácilmente la configuración según el módulo que esté usando (cada módulo podría opcionalmente anular los scripts de vista de elementos para adaptarse a sus propias necesidades). El decorador ViewScript resuelve este problema.
El decorador ViewScript requiere una opción 'viewScript', ya sea proporcionada al decorador, o como un atributo del elemento. Luego renderiza ese script de vista como un script parcial, lo que significa que cada llamada a él tiene su propio ámbito de variables; no se inyectará ninguna variable de la vista excepto el elemento mismo. Luego se rellenan varias variables:
element: el elemento que se está decorando
content: el contenido pasado al decorador
decorator: el objeto decorador mismo
Adicionalmente, todas las opciones pasadas al decorador mediante
setOptions()que no se usan internamente (tales como placement, separator, etc.) se pasan al script de vista como variables de vista.
Como ejemplo, podría tener el siguiente elemento:
// Setting the decorator for the element to a single, ViewScript,
// decorator, specifying the viewScript as an option, and some extra
// options:
$element->setDecorators(array(array('ViewScript', array(
'viewScript' => '_element.phtml',
'class' => 'form element'
))));
// OR specifying the viewScript as an element attribute:
$element->viewScript = '_element.phtml';
$element->setDecorators(array(array('ViewScript',
array('class' => 'form element'))));
Entonces podría tener un script de vista algo así:
<div class="<?php echo $this->class ?>">
<?php echo $this->formLabel($this->element->getName(),
$this->element->getLabel()) ?>
<?php echo $this->{$this->element->helper}(
$this->element->getName(),
$this->element->getValue(),
$this->element->getAttribs()
) ?>
<?php echo $this->formErrors($this->element->getMessages()) ?>
<div class="hint"><?php echo $this->element->getDescription() ?></div>
</div>
![]() |
Reemplazar el contenido con un script de vista |
|---|---|
|
Puede resultarle útil que el script de vista reemplace el
contenido proporcionado al decorador -- por ejemplo, si desea
envolverlo. Puede hacerlo especificando un valor booleano
// At decorator creation:
$element->addDecorator('ViewScript', array('placement' => false));
// Applying to an existing decorator instance:
$decorator->setOption('placement', false);
// Applying to a decorator already attached to an element:
$element->getDecorator('ViewScript')->setOption('placement', false);
// Within a view script used by a decorator:
$this->decorator->setOption('placement', false);
|
Se recomienda usar el decorador ViewScript cuando desee tener un control muy detallado sobre cómo se renderizan sus elementos.
![[Note]](images/note.png)