Validaciones personalizadas Más videos
Descripción del tema
Formulario con validaciones personalizadas
Material de apoyo
Antes de seguir es necesario descargar el material de apoyo, el cual consta de dos archivos solamente, un HTML y un JS; he creado un formulario y lo he puesto dentro de una ventana, asi que el ejercicio será agregar validaciones para algunos campos.Mostrar los mensajes de error
Si en este momento ejecutamos el material de apoyo veremos que tres campos son requeridos, y al presionar el botón “save” nos dice que existen errores (si no ponemos nada en las cajas de texto), pero únicamente se esta poniendo en color rojo el contorno de los campos.No muestra mensajes de error
Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget = 'side';La primera línea permite que aparezcan los mensajes flotantes cuando posicionamos el Mouse sobre la caja de texto, con la segunda línea de indicamos que aparezca un ícono de error en la parte lateral del campo.
Desplegamos un mensaje flotante con el error de validación
Validar mayoría de edad
En el campo “Date of birth” vamos a validar que dada la fecha de nacimiento calculemos cuantos años hay hasta el día de hoy, luego verificamos que sea mayor de 18 para pasar la validación del campo. En el tema anterior vimos como utilizar los “vtype’s” que vienen incluidos en el framework de Ext JS, hoy vamos agregar algunas validaciones mas a la clase “Ext.form.VTypes”. Lo primero que necesitamos hacer es extender la clase mencionada de la siguiente manera:Ext.apply(Ext.form.VTypes,{ //aqui vamos a definer las validaciones necesarias });Lo siguiente es definir el “vtype” de la siguiente manera:
Ext.apply(Ext.form.VTypes,{ adult: function(val, field){ try{ var birth = field.getValue(); var now = new Date(); // The number of milliseconds in one year var ONE_YEAR = 1000 * 60 * 60 * 24 * 365; // Convert both dates to milliseconds var date1_ms = birth.getTime() var date2_ms = now.getTime() // Calculate the difference in milliseconds var difference_ms = Math.abs(date1_ms - date2_ms) // Convert back to years var years = difference_ms/ONE_YEAR; return years >= 18; }catch(e){ return false; } }, adultText: 'You are underage!', //mensaje de error adultMask: / / //regexp para filtrar los caracteres permitidos });Primero se define el nombre que le daremos al “vtype”, en este caso “adult” luego le asignamos una función que recibe dos parámetros, el contenido del campo y la instancia del campo que se está validando, dentro de esta función pondremos la lógica para validar y debe regresar “true” para cuando el valor capturado sea correcto o “false” para cuando el valor del campo sea incorrecto. Lo siguiente que debemos hacer es definir el texto que se mostrará en caso de que la información capturada sea incorrecta, debemos recordar que existen más validaciones dentro de este objeto (Ext.form.VTypes), por lo tanto para relacionar el mensaje con la función de validación simplemente le agregamos la palabra “Text” al final del nombre la función, en este caso “adultText”. Opcionalmente podemos definir un filtro para capturar solamente los caracteres correctos, para eso necesitamos definir una mascara con la expresión regular adecuada.
adultMask: /[\d\/]/La expresión regular anterior valida que solamente se puedan capturar dígitos y una diagonal, estos caracteres son los únicos que necesitamos para escribir una fecha en el formato que hemos definido, nótese que la propiedad se llama “adultMask”, solamente le agregamos al final la palabra “Mask” para relacionarla con la validación que creamos anteriormente. Una vez definida el “vtype” necesitamos asignárselo al campo que necesitamos validar, en este caso al campo “birth” del formulario:
{xtype:'datefield',fieldLabel:'Date of birth',name:'birth',allowBlank:false,format:'d/m/Y',vtype:'adult'},
Validar una fecha de nacimiento, para que sea mayor de edad
Validar un teléfono
Vamos a validar el formato de un número telefónico, primero necesitamos definir las reglas de validación.- Tiene que ser de 10 dígitos, ejemplo: 8192847135
- Solamente puede aceptar paréntesis, guiones, espacios y números, ejemplos: (81) 92 847 135, 81 92-847-135, (81) 92-847-135, 81 92 84 71 35, 8192847135
- No debe capturar ningún otro carácter de los definidos anteriormente
phone: function(value,field){ return value.replace(/[ \-\(\)]/g,'').length == 10; }, phoneText: 'Wrong phone number, please make sure it contains 10 digits', phoneMask: /[ \d\-\(\)]/La función definida en la propiedad “phone” solamente remueve los caracteres aceptados (espacios, guiones, paréntesis) dejando solamente los números, luego valida que sean diez dígitos, la mascara solo acepta los caracteres definidos en las reglas. Por último necesitamos asignarle el “vtype” al campo del formulario que necesitamos validar.
{fieldLabel:'Phone number',name:'phone',vtype:'phone'},
Validar un número telefónico
Validar una tarjeta de crédito
En este último ejemplo vamos a validar el número de una tarjeta de crédito, primero necesitamos definir las reglas de validación para tener una idea clara de lo que haremos.- El número debe ser de 16 dígitos, ejemplo: 1234567891234567
- Solo puede aceptar dígitos, espacios y guiones, ejemplo: 1234 5678 9123 4567, 1234-5678-9123-4567
- No debe aceptar ningún otro carácter que de los anteriores mencionados
creditcard: function(value,field){ return value.replace(/[ \-]/g,'').length == 16; }, creditcardText: 'Wrong credit card number', creditcardMask: /[ \d\-]/No cambié muchas cosas en esta parte ya que las reglas son muy semejantes, ahora necesitamos agregar el “vtype” al campo “credit”.
{fieldLabel:'Credit card',name:'credit',vtype:'creditcard'},
Validar una tarjeta de crédito
Conclusiones
El día de hoy aprendimos a crear nuestras propias validaciones del lado del cliente, como puedes ver fue realmente sencillo. Ext JS nos provee una manera muy fácil de lograr validar e inclusive poner una mascara a nuestros campos. Si tienes alguna duda o sugerencia puedes hacerlo en los comentarios, o bien si es algo más complicado te recomiendo ir a los foros donde la comunidad crece diariamente, es muy amable y sobre todo nos ayudamos entre todos, también recuerda seguirnos en Twitter (@quizzpot) para estar al tanto de las noticias del sitio.Te gustaría recibir más tutoriales como este en tu correo?
Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.
Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!
Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.
Regístrate a este curso
Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.
Tendrás acceso a descargar los videos, códigos y material adicional.
Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.
Llevarás un registro de tu avance.
12Comentarios
Muy bueno, si esto hubiera estado unos cuantos meses atras, cuantos quebraderos de cabeza me habría quitado. Gracias y sigue así.
Interesante... talvez ha realizado validaciones junto con csla.net y xval...??
Muy util... muy bien para poder controlar los campos y tal.... aunque no entiendo muy bien las mascaras... pero bueno.
Una pregunta. Se pueden localizar los mensajes de error dependiendo, por ejemplo, del idioma elegido en el navegador?. Gracias y saludos
Si, pero eso te toca implementarlo a ti, pues el mensaje es definido por ti, lo que yo hago es poner una variable en lugar de el texto, de esta manera puedo seleccionar el lenguaje que necesite.
Excelente el tutorial. La función de un vtype puede recibir más parámetros que value y field?? Digamos que necesitamos comprobar si un número es múltiplo de otro y el divisor es el parámetro adicional, si es posible como hacerlo en la llamada al vtype? Espero me puedan dar una mano
Ya lo resolvi, se puede agregar una propiedad personzalizada al control y luego desempaquetarla el momento de evaluar el vtype en el javascript
Gracias por el aporte
crysfel seria bueno ver algunas validaciones en grid editable por ejemplo algunas veces se necesita deshabilitar una celda para que no ingresen información, otras veces se necesita habilitar esa misma celda para permitir ingresar informacion. Validaciones de valor etc....
Hola crysfel esta todo genial, pero tengo un pregunta, como aplicar Ext.util.MD5 a un textfield y luego hacer submit junto con el resultado de la codificacion. Saludos y gracias.
Hola crysfel tengo una pregunta, cuando los mensajes de error se disparan, me gustaria poder mostrar variables y mi validación la hago dinámicamente con el server ya sea para verificar un nick único. Ext.apply(Ext.form.VTypes,{ nickname:function(val,field){ //creamos llamadas asincronas al server con json $.post("/index.php/usuario/checkNick",{ "nick":val },function(data){ return data.result; },"json"); }, nicknameText:"El nick "+val+" ya existe" });
Hola crysfel, geniales los tutoriales, me sirvieron de mucho, yo agregaria aqui, el tema de habilitar/ deshabilitar botones una vez que es validado el formulario. Ya que seguramente varios habran tenido esta necesidad. Simplemente en el form hay que activar la propiedad monitorValid:true y en los botones que queremos habilitar/deshabilitar segun sea valido el fromulario la propiedad formBind:true Saludos