<?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>Blog cakephp en español por Hospedaxes &#187; validacion</title>
	<atom:link href="http://cakephp.hospedaxes.com/tag/validacion/feed" rel="self" type="application/rss+xml" />
	<link>http://cakephp.hospedaxes.com</link>
	<description>Blog sobre desarrollo web con cakephp en español por Hospedaxes</description>
	<lastBuildDate>Mon, 26 Apr 2010 07:11:23 +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>Validación en CakePHP 1.2 (III): Internacionalización de mensajes en el modelo</title>
		<link>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-iii-internacionalizacion-de-mensajes-en-el-modelo</link>
		<comments>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-iii-internacionalizacion-de-mensajes-en-el-modelo#comments</comments>
		<pubDate>Thu, 16 Apr 2009 10:37:46 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Validación 1.2]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[internacionalizacion]]></category>
		<category><![CDATA[mensajes de error]]></category>
		<category><![CDATA[modelo]]></category>
		<category><![CDATA[validacion]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=141</guid>
		<description><![CDATA[Continuando con los posts anteriores relativos a la validación y relacionado con el post en el que se trata la localización e internacionalización de nuestras aplicaciones, explicaremos en éste cómo realizar la internacionalización de los mensajes de error. Tenemos dos opciones para implementar este funcionamiento:

Utilizar la función error del FormHelper (realizando la llamada desde la [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con los posts anteriores relativos a la <a title="Validación en CakePHP 1.2 (I)" href="http://cakephp.hospedaxes.com/validacion-en-cakephp-12">validación</a> y relacionado con el post en el que se trata la <a title="Localización e internacionalización" href="http://cakephp.hospedaxes.com/localizacion-e-internacionalizacion" target="_blank">localización e internacionalización</a> de nuestras aplicaciones, explicaremos en éste cómo realizar la internacionalización de los mensajes de error. Tenemos dos opciones para implementar este funcionamiento:</p>
<ol>
<li>Utilizar la función <a title="Función error del FormHelper de CakePHP" href="http://api.cakephp.org/class/form-helper#method-FormHelpererror" target="_blank">error</a> del <a title="Form Helper (API CakePHP)" href="http://api.cakephp.org/class/form-helper" target="_blank">FormHelper</a> (realizando la llamada desde la vista) o la función <a title="Función invalidate del modelo de CakePHP" href="http://api.cakephp.org/class/model#method-Modelinvalidate" target="_blank">invalidate</a> del <a title="Clase Modelo de CakePHP" href="http://api.cakephp.org/class/model" target="_blank">modelo</a> (si realizamos la validación manual desde el controlador).</li>
<li>Utilizar el propio modelo como fuente de estos mensajes de error.</li>
</ol>
<p>En el primero de los casos utilizaríamos el siguiente código para la vista y el controlador respectivamente:</p>
<pre class="prettyprint">$form->error('campo', __('MENSAJE_ERROR', true));
$this->Modelo->invalidate('campo', __('MENSAJE_ERROR', true));</pre>
<p>y de esta forma buscaría esa clave del mensaje en el fichero de idioma.</p>
<p>La ventaja de hacerlo desde el modelo y no desde las vistas es que nos permite unificar los mensajes de error en cada campo y evitar la repetición de este código cuando estemos en formularios distintos que incluyan los mismos campos. El inconveniente es que en el modelo no se permite la utilización de la función __() de <a title="CakePHP" href="http://cakephp.org/" target="_blank">CakePHP</a>.</p>
<p>Para solucionar este problema será necesario modificar la clase <a title="AppModel de CakePHP" href="http://api.cakephp.org/class/app-model" target="_blank">AppModel</a> de la que extienden todos los modelos y que a su vez extiende de <a title="Clase Model en CakePHP" href="http://api.cakephp.org/class/model" target="_blank">Model</a> para redefinir la función <a title="Función invalidate del modelo de CakePHP" href="http://api.cakephp.org/class/model#method-Modelinvalidate" target="_blank">invalidate</a> (podemos ver la definición original en el <a href="http://api.cakephp.org/view_source/model/#line-2466">api de CakePHP</a>). Así, el fichero cake/libs/model/app_model.php quedaría como se muestra a continuación:</p>
<pre class="prettyprint"><code>&lt;?php
class AppModel extends Model {
   function invalidate($field, $value = true) {
      if (!is_array($this-&gt;validationErrors)) {
         $this-&gt;validationErrors = array();
      }
      $this-&gt;validationErrors[$field] = <strong>__($value, true)</strong>;
   }
}
?&gt;</code></pre>
<p>Con este simple cambio, tenemos los mensajes de error del modelo internacionalizados.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-iii-internacionalizacion-de-mensajes-en-el-modelo/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Validación en CakePHP 1.2 (II)</title>
		<link>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-ii</link>
		<comments>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-ii#comments</comments>
		<pubDate>Wed, 12 Nov 2008 14:22:20 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[Validación 1.2]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[personalizada]]></category>
		<category><![CDATA[validacion]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=136</guid>
		<description><![CDATA[Continuando con el post Validación en CakePHP 1.2, explicaremos en esta ocasión cómo validar formatos de campos permitiendo que estén vacíos y cómo realizar una validación personalizada, introduciendo manualmente el código de validación.
Validaciones con campos vacíos
Hasta hoy, no habíamos encontrado la forma de validar formatos de campos, permitiendo que se encuentren vacíos, directamente en el [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con el post <a title="Validación en CakePHP 1.2" href="http://cakephp.hospedaxes.com/validacion-en-cakephp-12">Validación en CakePHP 1.2</a>, explicaremos en esta ocasión cómo validar formatos de campos permitiendo que estén vacíos y cómo realizar una validación personalizada, introduciendo manualmente el código de validación.</p>
<p><strong>Validaciones con campos vacíos</strong></p>
<p>Hasta hoy, no habíamos encontrado la forma de validar formatos de campos, permitiendo que se encuentren vacíos, directamente en el modelo. Lo que hacíamos era hacer este tipo de comprobaciones manualmente, rompiendo un poco la flexibilidad que nos ofrece CakePHP para hacer las validaciones directamente en el modelo y sin volver a preocuparnos de ellas.</p>
<p>Ahora ya descubrimos la manera de hacerlo. Es una cosa muy simple que habíamos pasado por alto. Simplemente tenemos que pasar un parámetro a la función de validación, de la manera siguiente:</p>
<pre class="prettyprint"><code>var $validate = array(
   'email' =&gt; array(
   'valid' =&gt; array( 'rule' =&gt; array('email'),
                             <strong>'allowEmpty' =&gt; true</strong>,
                             'message' =&gt; 'Formato email inválido')
                             )
              );</code></pre>
<p><strong>Validación a medida</strong></p>
<p>En el modelo introduciremos el siguiente código:</p>
<pre class="prettyprint"><code>var $validate = array(
    'campo' =&gt; array(
                  'valid' =&gt; array( 'rule' =&gt; 'reglaPropia',
                              'param1'=&gt;'valor',
                              'message' =&gt; 'Mensaje de salida')
                              )
                    );

function reglaPropia($value, $params)
{
   $valid = false;
   if (!condicion){
      // Asignamos el valor a $valid en función de la condición que queramos establecer
   }
   return $valid;
}</code></pre>
<p>A la función creada le hemos pasado dos argumentos, aunque el segundo podríamos no ponerlo si no es necesario. Ambos serán arrays, de manera que si queremos acceder al valor del campo a validar tendremos que leer <em>$value['campo']</em> y para acceder a los parámetros <em>$params['param1']</em> , pudiendo introducir tantos parámetros como sea necesario.</p>
<p>En esta función podemos utilizar también las funciones de validación de CakePHP. Por ejemplo:</p>
<pre class="prettyprint">$valid = Validation::custom($value['campo'], $params['param1']);</pre>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/validacion-en-cakephp-12-ii/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validación en CakePHP 1.2</title>
		<link>http://cakephp.hospedaxes.com/validacion-en-cakephp-12</link>
		<comments>http://cakephp.hospedaxes.com/validacion-en-cakephp-12#comments</comments>
		<pubDate>Thu, 27 Mar 2008 08:18:26 +0000</pubDate>
		<dc:creator>nuria</dc:creator>
				<category><![CDATA[Validación 1.2]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[validacion]]></category>

		<guid isPermaLink="false">http://www.hospedaxes.com/blog-cakephp/?p=6</guid>
		<description><![CDATA[A pesar de estar todavía en la versión beta, hemos optado por hacer el desarrollo web con la versión 1.2 de CakePHP, entre otras cosas por el potente sistema de validación que posee. Explicaremos cómo realizar la validación de un formulario y los distintos tipos de validación que existen, aunque si no te gustan los [...]]]></description>
			<content:encoded><![CDATA[<p>A pesar de estar todavía en la versión beta, hemos optado por hacer el <a href="http://www.hospedaxes.com">desarrollo web</a> con la versión 1.2 de <a href="http://cakephp.org/">CakePHP</a>, entre otras cosas por el potente sistema de validación que posee. Explicaremos cómo realizar la validación de un formulario y los distintos tipos de validación que existen, aunque si no te gustan los que vienen ya implementados, <a href="http://cakephp.org/">CakePHP </a>da soporte para poder crear tus propias reglas de validación.</p>
<p>Al tema&#8230; Lo primero que hay que hacer es crear las reglas de validación en el modelo, lo haremos en la variable $validate, introduciendo ya aquí los mensajes de error para no tener que preocuparnos en cada formulario de especificarlos.<br />
En el siguiente ejemplo vemos varias reglas sencillas para un modelo que sólo tiene dos campos que queramos validar: nombre y password.</p>
<pre class="prettyprint">
var $validate = array(
   'nombre' => array(
      'valid' => array('rule' => array('alphaNumeric'),
                       'message' => 'Nombre debe ser alfanumérico'),
      'required' => array('rule' => array('minLength', '1'),
                            'message' => 'Nombre obligatorio')),
   'password'   => array(
      'required' => array('rule' => array('minLength', '1'),
                            'message' => 'Password obligatorio'),
      'length' => array('rule' => array('minLength', 6),
                            'message' => 'Longitud mínima del password de 6 caracteres')));</pre>
<p>Vemos ya en este ejemplo algunas de las distintas reglas que existen en CakePHP 1.2, pero tenemos muchas más. Son las siguientes:</p>
<ul>
<li><strong>alphaNumeric</strong>: campos alfanuméricos.</li>
<li><strong>between</strong>: aunque pueda parecer que valida que un número esté en un rango, lo que en realidad hace es comprobar que la longitud de una cadena esté en un rango:
<pre class="prettyprint">'rule' => array('between', minVal, maxVal)</pre>
</li>
<li><strong>blank</strong>: valida que el campo esté en blanco o contenga sólo espacios o tabulaciones.</li>
<li><strong>cc</strong>: valida que una tarjeta de crédito sea correcta:
<pre class="prettyprint">'rule' => array('cc', array('tipo')), donde tipo puede ser: visa, maestro...</pre>
</li>
<li><strong>comparison</strong>: para comparar valores numéricos:
<pre class="prettyprint">'rule' => array('comparison', 'tipo', val), donde tipo puede ser: "is greater”,“is less”, “greater or equal”, “less or equal”, “is less”, “equal to”, y “not equal”;y sus equivalentes >, <, >= ...</pre>
</li>
<li><strong>custom</strong>: sirve para definir tus propias expresiones regulares:
<pre class="prettyprint">'rule' => array('custom', 'expresion_regular')</pre>
</li>
<li><strong>date</strong>: valida una fecha, recibe como parámetro el formato:
<pre class="prettyprint">'rule' => array('date', 'ymd')</pre>
</li>
<li><strong>decimal</strong>: valida un número decimal recibiendo el número de decimales que tiene que tener:
<pre class="prettyprint">'rule' => array('decimal', num_decimales)</pre>
</li>
<li><strong>email</strong>: sirve para verificar que una dirección de email tiene el formato adecuado.</li>
<li><strong>equalTo</strong>: para comprobar que un campo sea exactamente igual a otro que se le pasa como parámetro:
<pre class="prettyprint">'rule' => array('equalTo', val)</pre>
</li>
<li><strong>extension</strong>: sirve para validar que el campo tiene la extensión o extensiones que se le indican como parámetro:
<pre class="prettyprint">'rule' => array('extension', <code>array('gif', 'jpeg', 'png', 'jpg')</code>)</pre>
</li>
<li><strong>file</strong>: permite comprobar que es un fichero. Todavía no está implementada.</li>
<li><strong>ip</strong>: valida que el campo es una IPv4.</li>
<li><strong>minLength </strong>y <strong>maxLength</strong>: sirve para validar que el campo tiene la longitud mínima y máxima, respectivamente, que se le pasa como parámetro:
<pre class="prettyprint">'rule' => array('minLength', <code>val</code>)  o  'rule' => array('maxLength', <code>val</code>)</pre>
<p><code></code></li>
<li><strong>money</strong>: valida que sea una cantidad monetaria. Se le pasa como parámetro &#8216;left&#8217; o &#8216;right&#8217;, en función de dónde le digamos que está el símbolo monetario.</li>
<li><strong>multiple</strong>: para validar selects múltiples. Aún no está implementado.</li>
<li><strong>numeric</strong>: se comporta igual que la función de PHP <em>is_numeric().</em></li>
<li><strong>phone</strong>: para validar un número de teléfono, se le pasa una expresión regular o null y el código del país. De momento sólo está implementado para Estados Unidos, para el resto se debe poner la expresión regular.
<pre class="prettyprint">'rule' => array('phone', null, 'us')</pre>
</li>
<li><strong>postal</strong>: igual que el anterior en sintaxis pero para validar códigos postales. En este caso, está implementado para Estado Unidos(us), Reino Unido(uk), Canada(ca), Italia(it) y Alemania (de).</li>
<li><strong>ssn</strong>: lo mismo que los dos anteriores pero para números de la seguridad social. Implementado para Estados Unidos(us), Dinamarca(dk) y Holanda(nl).</li>
<li><strong>url:</strong> para validar urls.</li>
</ul>
<p>Y ya sólo queda hacer el formulario que incluya validación. Podemos hacer uso para ello de una nueva función que viene implementada en el <em>Form</em> <em>Helper</em>, <strong>inputs</strong>:</p>
<pre class="prettyprint">
echo $form->inputs(array('legend'=>'Datos personales',
                  'nombre' => array('label'=>'Nombre *', 'size'=>32),
                  'password' => array('label'=>'Password *', 'type'=>'password')));</pre>
<p>De esta forma ya se encarga CakePHP de mostrar los errores automáticamente, al hacer el save (si no le especificamos que no nos lo haga) o bien al llamar explícitamente a la función validates del modelo. Si optas por esta segunda opción, la forma de hacer la llamada cambió con la nueva versión de Cake, y ahora se realiza de la manera siguiente:</p>
<pre class="prettyprint">
$this->Modelo->set($this->data);
$this->Modelo->validates();</pre>
<p>Yo he optado, en el caso de no poder usar la función <strong>inputs, </strong>por no usar ninguna de las funciones del <em>Form Helper</em> <strong>select</strong>, <strong>dateTime</strong>, <strong>radio</strong>&#8230; y utilizar para todo la función <strong>input</strong>, a la que se le pueden pasar atributos tipo <em>type</em>, <em>label</em>, <em>before</em>, <em>options, error</em>&#8230; (para más información ver la línea 491 del <a href="http://api.cakephp.org/1.2/form_8php-source.html">Form Helper</a>). De esta forma me muestra automáticamente los errores.</p>
<p>Por supuesto existe muchas más información en la propia <a href="http://api.cakephp.org/1.2/classes.html">API de CakePHP 1.2</a>, aunque una información menos densa la encontramos en la <a href="http://cakebaker.42dh.com/2007/01/03/validation-with-cakephp-12/">Bakery</a>, interesante sobre todo por los comentarios finales de la gente, que aportan muchas ideas.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/validacion-en-cakephp-12/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

