<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dr. Danguer y Mr. Daniel &#187; Zend_Form</title>
	<atom:link href="http://vida.danguer.com/tag/zend_form/feed/" rel="self" type="application/rss+xml" />
	<link>http://vida.danguer.com</link>
	<description>Un blog más de un freelancer</description>
	<lastBuildDate>Sun, 31 Jan 2010 00:14:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Zend Form: Decoradores</title>
		<link>http://vida.danguer.com/2008/08/31/zend-form-decoradores/</link>
		<comments>http://vida.danguer.com/2008/08/31/zend-form-decoradores/#comments</comments>
		<pubDate>Mon, 01 Sep 2008 05:56:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Form]]></category>
		<category><![CDATA[Zend_Form_Decorator]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=49</guid>
		<description><![CDATA[<p>Extendiendo un poco el tutorial de <a title="Formularios con Zend Form" href="http://vida.danguer.com/2008/05/formularios-con-zend-framework-zend_form/" target="_blank">Formularios Zend</a> ahora explicaré como funcionan los decoradores. Los decoradores son la manera de visualizar los diferentes elementos de la forma, básicamente se encargan de &#8216;renderizar&#8217; los elementos de una forma (es decir es la parte de la Vista).</p>
<p>En el tutorial anterior no definí ningún decorador, esto es porque el Zend Framework inicializa los decoradores con algunos por defecto. Veremos un poco del código interno del Zend Framework para entenderlo a detalle.</p>
<p>en <code>Zend/Form/Element.php</code> nos daremos cuenta que en el <code>__construct</code> (inicialización del elemento) hasta al final hay una llamada a la función <code>loadDefaultDecorators</code> que es la siguiente:</p>
<pre name="code" class="php">public function loadDefaultDecorators()
{
    if ($this-&#62;loadDefaultDecoratorsIsDisabled()) {
        return;
    }

    $decorators = $this-&#62;getDecorators();
    if (empty($decorators)) {
        $this-&#62;addDecorator('ViewHelper')
            -&#62;addDecorator('Errors')
            -&#62;addDecorator('HtmlTag', array('tag' =&#62; 'dd'))
            -&#62;addDecorator('Label', array('tag' =&#62; 'dt'));
    }
}</pre>
<p>Estos cuatro decoradores son la base de como los elementos son renderizados. El sistema procesa en orden lineal de como definimos los decoradores, si no modificamos entonces el orden es de procesar primero <code>ViewHelper</code>, luego <code>Errors</code>, <code>HtmlTag </code>y por último <code>Label</code>.</p>
<p>Cada decorador al momento de procesar en la función <code>render</code>, el sistema le pasa una cadena con el contenido actual y regresa una cadena de texto que procesó. Idealmente debe de utilizarse la cadena del contenido actual, pero con esto también podemos incluso procesar los elementos procesados y sobreescribir todo el resultado o hacer otras cosas interesantes (aunque podría ser no recomendable en un elemento que tenga como propósito ser parte de una librería).</p>
<p>Los elementos por defecto funciona de la siguiente manera:</p>
<ul>
<li><code>ViewHelper</code>: renderea en sí el elemento mediante un <code>helper</code>. Por ejemplo un elemento <code>Zend_Form_Element_Select</code> que tiene un helper <code>formSelect</code> utilizará este último helper para mostrar el elemento como <code>&#60;select&#62;...&#60;/select&#62;</code></li>
<li><code>Errors</code>: renderea las partes de los errores, utiliza una plantilla de la siguiente forma:
<pre name="code" class="html">&#60;ul class="errores"[opciones html]&#62;
&#60;li&#62;[error1]&#60;/li&#62;
....
&#60;li&#62;[errorN]&#60;/li&#62;
&#60;/ul&#62;</pre>
</li>
<li><code>HtmlTag</code>: Le da un poco de formato al elemento&#8230;</li></ul>]]></description>
			<content:encoded><![CDATA[<p>Extendiendo un poco el tutorial de <a title="Formularios con Zend Form" href="http://vida.danguer.com/2008/05/formularios-con-zend-framework-zend_form/" target="_blank">Formularios Zend</a> ahora explicaré como funcionan los decoradores. Los decoradores son la manera de visualizar los diferentes elementos de la forma, básicamente se encargan de &#8216;renderizar&#8217; los elementos de una forma (es decir es la parte de la Vista).</p>
<p>En el tutorial anterior no definí ningún decorador, esto es porque el Zend Framework inicializa los decoradores con algunos por defecto. Veremos un poco del código interno del Zend Framework para entenderlo a detalle.</p>
<p>en <code>Zend/Form/Element.php</code> nos daremos cuenta que en el <code>__construct</code> (inicialización del elemento) hasta al final hay una llamada a la función <code>loadDefaultDecorators</code> que es la siguiente:</p>
<pre name="code" class="php">public function loadDefaultDecorators()
{
    if ($this-&gt;loadDefaultDecoratorsIsDisabled()) {
        return;
    }

    $decorators = $this-&gt;getDecorators();
    if (empty($decorators)) {
        $this-&gt;addDecorator('ViewHelper')
            -&gt;addDecorator('Errors')
            -&gt;addDecorator('HtmlTag', array('tag' =&gt; 'dd'))
            -&gt;addDecorator('Label', array('tag' =&gt; 'dt'));
    }
}</pre>
<p>Estos cuatro decoradores son la base de como los elementos son renderizados. El sistema procesa en orden lineal de como definimos los decoradores, si no modificamos entonces el orden es de procesar primero <code>ViewHelper</code>, luego <code>Errors</code>, <code>HtmlTag </code>y por último <code>Label</code>.</p>
<p>Cada decorador al momento de procesar en la función <code>render</code>, el sistema le pasa una cadena con el contenido actual y regresa una cadena de texto que procesó. Idealmente debe de utilizarse la cadena del contenido actual, pero con esto también podemos incluso procesar los elementos procesados y sobreescribir todo el resultado o hacer otras cosas interesantes (aunque podría ser no recomendable en un elemento que tenga como propósito ser parte de una librería).</p>
<p>Los elementos por defecto funciona de la siguiente manera:</p>
<ul>
<li><code>ViewHelper</code>: renderea en sí el elemento mediante un <code>helper</code>. Por ejemplo un elemento <code>Zend_Form_Element_Select</code> que tiene un helper <code>formSelect</code> utilizará este último helper para mostrar el elemento como <code>&lt;select&gt;...&lt;/select&gt;</code></li>
<li><code>Errors</code>: renderea las partes de los errores, utiliza una plantilla de la siguiente forma:
<pre name="code" class="html">&lt;ul class="errores"[opciones html]&gt;
&lt;li&gt;[error1]&lt;/li&gt;
....
&lt;li&gt;[errorN]&lt;/li&gt;
&lt;/ul&gt;</pre>
</li>
<li><code>HtmlTag</code>: Le da un poco de formato al elemento ya que lo agrega en una plantilla de la siguiente forma:
<pre name="code" class="html">&lt;dd&gt;
...
&lt;/dd&gt;</pre>
</li>
<li><code>Label</code>: Asigna una etiqueta de la siguiente forma:
<pre name="code" class="html">&lt;dt&gt;&lt;label&gt;Etiqueta&lt;/label&gt;&lt;/dt&gt;</pre>
</li>
</ul>
<p>Los decoradores por defecto tienen opciones para ser puestos al inicio (<code>PREPEND</code>) o al final (<code>APPEND</code>) del contenido, por defecto <code>Errors</code> se pone al final, <code>HtmlTag </code>pone el contenido en medio de las etiquetas y <code>Label</code> se pone al inicio del contenido.</p>
<p>Por lo que con las opciones por defecto la plantilla de como se verá nuestro elemento es:</p>
<pre name="code" class="php">&lt;dt&gt;&lt;label&gt;[Etiqueta del elemento]&lt;/label</span>&gt;&lt;/dt&gt;
&lt;dd&gt;
    [Elemento]
    &lt;ul class="errors"&gt;
        &lt;li&gt;[Errores]&lt;/li&gt;
    &lt;/ul&gt;
&lt;/dd&gt;
</pre>
<p>Si queremos cambiar el orden, o forma de presentación tenemos que cambiar un poco el formato de salida; por ejemplo con el siguiente código (modificándolo de I<code>ndexController.php</code> del tutorial de <a href="http://vida.danguer.com/2008/05/formularios-con-zend-framework-zend_form/" target="_blank">Zend Form</a>):</p>
<pre name="code" class="php">$decoradores = array(
     'ViewHelper',
     'Errors',
     array('HtmlTag', array('tag' =&gt; 'div', 'class' =&gt; 'formElement')),
     array('Label', array('tag' =&gt; 'div'))
);

$nombre = $formulario-&gt;createElement('text', 'nombre_completo')
               -&gt;setLabel('Nombre Completo')
               -&gt;setDecorators($decoradores)
               -&gt;setRequired(true);</pre>
<p>Esto nos mostrará un resultado como el siguiente:</p>
<p><img src="http://vida.danguer.com/archivos/articulos/Zend_Form_Decorators/ejemplo1.png" alt="Ejemplo de Zend_Form_Decorator" width="232" height="208" /></p>
<p>Como hemos definido todos los decoradores que vamos a utilizar es fácil aplicarlo a los demás elementos (en el ejemplo anterior, sólo se aplicó al primer elemento.</p>
<p>Hay que hacer notar que sólo podemos utilizar una vez el decorador en un elemento, si agregamos otro <code>HtmlTag</code> por ejemplo, el último sobreescribirá al primero.</p>
<p>Si queremos construir algo más complejo existe un decorador que nos permite tener mucho mayor control: <code>ViewScript</code>, este decorador básicamente llamará a un archivo de la carpeta de vista (<code>views/scripts</code>) y le pasará tres parámetros:</p>
<ul>
<li><code>content</code>: El contenido actual producto del renderizado de los otros decoradores</li>
<li><code>element</code>: El <code>Zend_Form_Element</code> que estamos renderizados</li>
<li><code>decorator</code>: Una referencia al decorador <code>ViewScript</code></li>
</ul>
<p>Por defecto el resultado se agrega al final, si pasamos como opcion que la posición sea <code>false</code> entonces el contenido que resulte de renderizar este decorador será el único contenido.</p>
<p>Por ejemplo lo siguiente crea un &#8220;contenedor&#8221; al elemento:</p>
<pre name="code" class="php">$decoradores = array(
           'ViewHelper',
           'Errors',
           array('HtmlTag', array('tag' =&gt; 'div', 'class' =&gt; 'formElement')),
           array('Label', array('tag' =&gt; 'div')),
           array('ViewScript', array('viewScript' =&gt; 'decorador-contenedor.phtml', 'placement' =&gt; false)),
    );</pre>
<p>Y el decorador está especificado como (archivo nombreado como: <code>views/scripts/decorador-contenedor.phtml</code>:</p>
<pre name="code" class="html">&lt;div class="formElementContent"&gt;
	&lt;?=$this-&gt;content ?&gt;
&lt;/div&gt;</pre>
<p>El resultado es el siguiente (con un poco de CSS):<br />
<img src="http://vida.danguer.com/archivos/articulos/Zend_Form_Decorators/ejemplo2.png" alt="Ejemplo de Zend_Form_Decorator" /></p>
<p>Ahora bien, si queremos podemos prácticamente reconstruir todo los demás decoradores mediante un un decorador de <code>ViewHelper</code> y un decorador <code>ViewScript</code> de la siguiente manera:</p>
<pre name="code" class="php">$decoradores = array(
          'ViewHelper',
          array('ViewScript', array('viewScript' =&gt; 'decorador-avanzado.phtml', 'placement' =&gt; false)),
     );</pre>
<p>Y el decorador seria de la siguiente manera:</p>
<pre name="code" class="html">&lt;!-- Esta primera parte reemplazaria HtmlTag --&gt;
&lt;div class="formElementContent"&gt;
	&lt;!--  parte que remplaza el decorador Label --&gt;
	&lt;div&gt;
    &lt;?php
    	$attribs = $this-&gt;element-&gt;getAttribs();
    	$label = $this-&gt;element-&gt;getLabel();

    	//nuevo, verificamos si el elemento es requerido,
    	//entonces agregamos un elemento en html al final de la etiqueta
    	if ($this-&gt;element-&gt;isRequired()) {
    		$attribs['escape'] = false;
    		$label = $this-&gt;escape($label). ' &lt;span class="required"&gt;*&lt;/span&gt;';
    	}

    	echo $this-&gt;formLabel($this-&gt;element-&gt;getName(), $label, $attribs);
    ?&gt;
    &lt;/div&gt;

    &lt;!-- parte del elemento --&gt;
    &lt;?=$this-&gt;content ?&gt;

    &lt;!--
    	parte que reemplaza Errors
    	observen que estoy poniendo los errores
    	con simples saltos de linea en lugar de lista
     --&gt;
	&lt;?php if ($this-&gt;element-&gt;getMessages()) { ?&gt;
	&lt;div class="errors"&gt;
		&lt;?=implode('&lt;br /&gt;', $this-&gt;element-&gt;getMessages())?&gt;
	&lt;/div&gt;
	&lt;?php } ?&gt;

    &lt;!-- esta parte es opcional si agregaron una descripción --&gt;
    &lt;div class="hint"&gt;&lt;?= $this-&gt;element-&gt;getDescription() ?&gt;&lt;/div&gt;
&lt;/div&gt;</pre>
<p>El resultado con un poco de CSS es el siguiente:</p>
<p><img src="http://vida.danguer.com/archivos/articulos/Zend_Form_Decorators/ejemplo3.png" alt="Ejemplo de Zend_Form_Decorator" width="206" height="323" /></p>
<p>Como se puede observar el anterior ejemplo nos da completo control sobre como mostrar los elementos.</p>
<p>También en un caso más complejo y avanzado podemos incluso definir con algunos cambios sobre el formulario principal (Zend_Form) para definir un decorador que nos permita sobre la vista definir el orden de los elementos, mostrar un formulario totalmente estilizado que no sea regular o incluso no mostrar elementos o crear nuevos para cosas como AJAX/Javascript por ejemplo.</p>
<p>Pero de eso hablaría en otro pequeño tutorial =).</p>
<p>Código Fuente:</p>
<p><a title="Descargar Ejemplo Zend_Form_Decorator" href="http://vida.danguer.com/archivos/articulos/Zend_Form_Decorators/DanguerArticle_Zend_Form_Decorator.tar.gz" target="_self">DanguerArticle_Zend_Form_Decorator.tar.gz</a></p>
<p><a title="Ver Demo de Zend_Form_Decorator" href="http://demo.livesourcing.com/blog_vida/articulos/DanguerArticle_Zend_Form_Decorator/" target="_blank">Visitar Sitio Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2008/08/31/zend-form-decoradores/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Formularios con Zend Framework (Zend_Form)</title>
		<link>http://vida.danguer.com/2008/05/06/formularios-con-zend-framework-zend_form/</link>
		<comments>http://vida.danguer.com/2008/05/06/formularios-con-zend-framework-zend_form/#comments</comments>
		<pubDate>Tue, 06 May 2008 22:03:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Form]]></category>

		<guid isPermaLink="false">http://vida.danguer.com/?p=6</guid>
		<description><![CDATA[<p>Una de las características que se había solicitado en Zend Framework era la de poder utilizar formularios. En la versión 1.5 ya existe esta característica; aunque algunas partes de la documentación de Zend es muy vaga el poder de los formularios es excelente; como siempre tiene una muy buena arquitectura que va desde lo medianamente simple para utilizar los formularios de manera rápida hasta lo complejo que permite extender sus capacidades sin &#8216;hacks&#8217; en el código o rehaciendo partes de código vitales.</p>
<p>Un formulario (<code>Zend_Form</code>) es un contenedor de elementos (por ejemplo una entrada de texto, una casilla de verificación, etc), del lado del controlador debemos definir los elementos, una vez hecho esto entonces podemos visualizar (render) la forma del lado de la vista ya sea asignándole una vista o simplemente con <code>&#60;?=$formulario?&#62;</code> donde <code>$formulario</code> es por supuesto nuestro objeto de tipo Zend_Form</p>
<p>Los elementos que maneja <strong>Zend Framework</strong> son básicamente los objetos en HTML a los que estamos acostumbrados, pero no estamos limitados a ellos ya que podemos crear los elementos que necesitemos.<br />
Un elemento puede tener <strong>validadores</strong> (subclases de <code>Zend_Validate_Abstract)</code> que nos permiten validar la entrada, aunque ya existen muchos validadores muy útiles y de uso frecuente.<br />
El elemento puede ser asignado uno o varios &#8220;<strong>Decoradores</strong>&#8220;; un Decorador es un objeto que pasa información a un Helper de la vista, los decoradores que tiene <strong>Zend Framework</strong> integrado nos permiten fácilmente alterar la salida de un elemento y también añadir fácilmente un diseño.</p>
<p><strong>Esquema</strong></p>
<p>El siguiente es un esquema de cómo funciona <code>Zend_Form</code>, podemos ver que el controlador se encargará de crear el formato del formulario y la parte de vista se encargará de mostrar el formulario y de mostrar los errores que hayan surgido.</p>
<p><img src="http://vida.danguer.com/archivos/articulos/Zend_Form/Controlador-Vista.png" alt="Esquema de Zend_Form" width="530" height="668" /></p>
<p><strong>Crear un formulario</strong></p>
<p>Para crear un formulario debemos hacer lo siguiente:</p>
<ol>
<li>Crear un formulario (<code>Zend_Form</code>)</li>
<li>Crear elementos ya sea mediante<br />
<code>$elemento = $formulario-&#62;createElement('tipo_elemento', 'nombre_elemento');</code><br />
o mediante un objeto de tipo Zend_Form_Element:<br />
<code>$elemento =&#8230;</code></li></ol>]]></description>
			<content:encoded><![CDATA[<p>Una de las características que se había solicitado en Zend Framework era la de poder utilizar formularios. En la versión 1.5 ya existe esta característica; aunque algunas partes de la documentación de Zend es muy vaga el poder de los formularios es excelente; como siempre tiene una muy buena arquitectura que va desde lo medianamente simple para utilizar los formularios de manera rápida hasta lo complejo que permite extender sus capacidades sin &#8216;hacks&#8217; en el código o rehaciendo partes de código vitales.</p>
<p>Un formulario (<code>Zend_Form</code>) es un contenedor de elementos (por ejemplo una entrada de texto, una casilla de verificación, etc), del lado del controlador debemos definir los elementos, una vez hecho esto entonces podemos visualizar (render) la forma del lado de la vista ya sea asignándole una vista o simplemente con <code>&lt;?=$formulario?&gt;</code> donde <code>$formulario</code> es por supuesto nuestro objeto de tipo Zend_Form</p>
<p>Los elementos que maneja <strong>Zend Framework</strong> son básicamente los objetos en HTML a los que estamos acostumbrados, pero no estamos limitados a ellos ya que podemos crear los elementos que necesitemos.<br />
Un elemento puede tener <strong>validadores</strong> (subclases de <code>Zend_Validate_Abstract)</code> que nos permiten validar la entrada, aunque ya existen muchos validadores muy útiles y de uso frecuente.<br />
El elemento puede ser asignado uno o varios &#8220;<strong>Decoradores</strong>&#8220;; un Decorador es un objeto que pasa información a un Helper de la vista, los decoradores que tiene <strong>Zend Framework</strong> integrado nos permiten fácilmente alterar la salida de un elemento y también añadir fácilmente un diseño.</p>
<p><strong>Esquema</strong></p>
<p>El siguiente es un esquema de cómo funciona <code>Zend_Form</code>, podemos ver que el controlador se encargará de crear el formato del formulario y la parte de vista se encargará de mostrar el formulario y de mostrar los errores que hayan surgido.</p>
<p><img src="http://vida.danguer.com/archivos/articulos/Zend_Form/Controlador-Vista.png" alt="Esquema de Zend_Form" width="530" height="668" /></p>
<p><strong>Crear un formulario</strong></p>
<p>Para crear un formulario debemos hacer lo siguiente:</p>
<ol>
<li>Crear un formulario (<code>Zend_Form</code>)</li>
<li>Crear elementos ya sea mediante<br />
<code>$elemento = $formulario-&gt;createElement('tipo_elemento', 'nombre_elemento');</code><br />
o mediante un objeto de tipo Zend_Form_Element:<br />
<code>$elemento = new Zend_Form_Element_Text('nombre_elemento');</code></li>
<li>Asignar propiedades al elemento:<br />
<code>setLabel('nombre_etiqueta'); //asigna el nombre de la etiqueta del elemento</code><br />
<code>setValue('valor'); //asigna el valor del elemento (sobreescribe la entrada del usuario)</code><br />
<code>setDecorators($arreglo_decoradores); //asigna los decoradores a usarse</code><br />
<code>setRequired(true/false); //indica si el valor no debe estar vacio</code><br />
<code>addValidator($validador); //indica el validador a utilizar</code></li>
<li>Agregar el elemento al formulario:<br />
<code>$formulario-&gt;addElement($elemento);</code><br />
los elementos se visualizarán en el orden en que han sido agregados, aunque esto puede cambiarse si se modifica el elemento mediante <code>$elemento-&gt;setOrder($numero);</code></li>
<li>Pasar el formulario a la vista para que sea renderizado:<br />
<code>$this-&gt;view-&gt;assign('formulario', $formulario);</code></li>
<li>Renderizarlo en la vista:<br />
<code>&lt;?=$this-&gt;formulario?&gt;</code></li>
</ol>
<p><strong>Validar un formulario</strong></p>
<p>Una vez que hemos renderizado el formulario y el usuario ha enviado datos, lo siguiente que debemos hacer es validar la entrada, para esto debemos de crear nuevamente el formulario y verificar si se han enviado datos (porque Zend Framework solo envia valores y no información sobre el formulario), si se han enviado datos entonces podemos utilizar la función <code>isValid($_POST);</code> que regresará un valor de verdadero en caso de que todos los validadores fueron satisfechos o falso en caso de que alguno no lo fuera.</p>
<p>La ventaja de Zend es que automáticamente agregará un mensaje de error al renderizar el elemento que tuvo un error; inicialmente el código de error estará en inglés, por lo que deberemos de traducir los mensajes (más adelante).</p>
<p><strong>Opciones de Validación</strong></p>
<p>Zend Framework tiene varias opciones para validar las entradas, todas ellas son subclases de <code>Zend_Validate_Abstract</code>, para agregar un validador debemos llamarlo de la siguiente manera:</p>
<p><code>$elemento-&gt;addValidator('nombre_validador', $romper_cadena_al_fallar, $arreglo_opciones);</code></p>
<p>Los validadores más importantes son (el nombre de validador es el que está entre paréntesis):</p>
<ul>
<li><code>Zend_Validate_Alnum</code> (<code>alnum</code>)<br />
Nos permite verificar que la entrada solo contenda caracteres alfanuméricos (letras y dígitos), opcionalmente se le puede pasar como opción un booleano para definir si se deben aceptar espacios en blanco (predeterminado en falso)</li>
<li><code>Zend_Validate_Alpha</code> (<code>alpha</code>)<br />
Nos permite verificar que la entrada sea sólo letras, al igual que el anterior permite una opción para aceptar espacios en blanco</li>
<li><code>Zend_Validate_Digits</code> (<code>digits</code>)<br />
Permite verificar que la entrada sea sólo números</li>
<li><code>Zend_Validate_StringLength</code> (<code>stringLength</code>)<br />
Nos permite definir que la entrada sólo contenga un número mínimo o máximo de valores; que deben ser especificado en las opciones por ejemplo:<br />
<code>$element-&gt;addValidator('stringLength', false, array(3, 20));</code><br />
Que especifica una cadena de al menos 3 caracteres y máximo 20 caracteres.</li>
<li><code>Zend_Validate_EmailAddress</code> (<code>emailAddress</code>)<br />
Es un validador muy poderoso que nos permite verificar que un correo sea válido (al menos en cuanto a formato y servidor válido incluso)</li>
<li><code>Zend_Validate_NotEmpty</code> (<code>notEmpty</code>)<br />
Este validador nos permite verificar que el usuario ha introducido un valor, lamentablemente no permite eliminar espacios en blanco con <code>trim </code>por ejemplo.</li>
</ul>
<p><strong>Traducción</strong></p>
<p>Los mensajes de error que mostrará Zend Framework de manera predeterminada serán en inglés; para poderlos mostrar en español debemos utilizar la parte de traducción de Zend (<code>Zend_Translate</code>).</p>
<p><code>Zend_Translate</code> permite muchas opciones pero aqui haremos una de las más básicas que es mediante un archivo PHP, esto nos permitirá usar las constantes de Zend, para esto simplemente hay que crear un archivo en PHP donde tendrá los mensajes en español, por ejemplo: <code>app/langs/es.php</code></p>
<p>En este archivo deberemos regresar un arreglo con la llave la cadena a traducir y el valor con la cadena traducida, por ejemplo:</p>
<pre name="code" class="php">&lt;?php
require_once 'Zend/Validate/NotEmpty.php';
require_once 'Zend/Validate/StringLength.php';
require_once 'Zend/Validate/EmailAddress.php';

return array(
Zend_Validate_NotEmpty::IS_EMPTY =&gt; 'El campo no puede estar vacío',
Zend_Validate_StringLength::TOO_LONG =&gt; 'El campo debe contener por lo menos %min% caracteres',
Zend_Validate_StringLength::TOO_SHORT =&gt; 'El campo debe contener un máximo de %max% caracteres',
Zend_Validate_EmailAddress::INVALID =&gt; 'La dirección de correo no es válida',
Zend_Validate_EmailAddress::QUOTED_STRING =&gt; "'%localPart%' no concuerda con el formato de comillas",
Zend_Validate_EmailAddress::DOT_ATOM =&gt; "'%localPart%' no concuerda con el formato de punto",
Zend_Validate_EmailAddress::INVALID_HOSTNAME =&gt; "'%hostname%' no es un nombre de dominio válido",
Zend_Validate_EmailAddress::INVALID_LOCAL_PART =&gt; "'%localPart%' no es una parte local válida",
Zend_Validate_EmailAddress::INVALID_MX_RECORD =&gt; "'%hostname%' no tiene un dominio de correo asignado",
);

?&gt;</pre>
<p>Debemos consultar la API para ver las cadenas que debemos traducir para cada validador. En el ejemplo sólo usaremos tres <code>notEmpty</code>, <code>stringLength</code> y <code>emailAddress</code></p>
<p>Entonces debemos de asignar estas traducciones a todos los componentes de Zend_Form de la siguiente manera:</p>
<pre name="code"  class="php">$traduccion = new Zend_Translate('array', 'app/langs/es.php', 'es');
Zend_Form::setDefaultTranslator($traduccion);</pre>
<p><strong>Obtención de Valores</strong></p>
<p>Los valores del formulario estarán en <code>$_POST['nombre_elemento']</code> o <code>$_GET['nombre_elemento']</code> según sea el caso, pero podemos pedirle al formulario que nos regrese solamente los valores que le corresponden de la entrada (si es que pasamos más datos), por lo que debemos hacer:</p>
<p><code>$valores = $formulario-&gt;getValues();</code></p>
<p><strong>Ejemplo</strong></p>
<p>Para el ejemplo tendremos dos archivos, <code>IndexController.php</code> (Controlador) e <code>index.phtml </code>(vista), simplemente mostraremos un formulario y mostraremos los valores.</p>
<p>El código del ejemplo puede ser obtenido en esta liga:<br />
<a title="Ejemplo de Zend_Form - Descargar" href="http://vida.danguer.com/archivos/articulos/Zend_Form/DanguerArticle_Zend_Form.tar.gz" target="_self">http://vida.danguer.com/archivos/articulos/Zend_Form/DanguerArticle_Zend_Form.tar.gz</a></p>
<p>Mientras que el ejemplo puede visualizarse en la siguiente liga:<br />
<a title="Ejemplo de Zend_Form" href="http://dev.fangit.com/DanguerArticle_Zend_Form/" target="_blank">http://dev.fangit.com/DanguerArticle_Zend_Form/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vida.danguer.com/2008/05/06/formularios-con-zend-framework-zend_form/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
