Validar un campo concreto y no dejar grabar registro en caso de errores

Hola amigos:

Estoy haciendo un formulario, en el que entre otros campos, esta el del Nif o Cif, de tal forma que hay que comprobar y validar que el dato introducido en dicho campo es correcto.

Y en caso de que no sea correcto, adem?s de manifestar el error, no deje grabar el registro.

Pues bien, el validar el campo no ha representado dificultad alguna, por cuanto he creado la rutina mediante un M?todo PHP, y cuando es err?neo con el mensaje de error, advierte de dicha circunstancia marcando en rojo el fondo del campo.

El problema es que a pesar de dar el error, si actualizas o grabas el registro, lo permite a pesar del error.

Para ello, en el m?todo PHP he creado un variable global que modifico a false o true en funci?n de que exista o no error, para saber que existe un error pendiente de solucionar antes de guardar el registro y poder manejar el error desde eventos. Este m?todo PHP lo ejecuto desde el evento ajax ONBLUR para el campo referido.

He intentado crear en eventos ANTES DE INSERTAR, ANTES DE MODIFICAR, etc, un script que me permitiese dar un mensaje de error, que impida la grabaci?n del registro. Pues bien, si por ejemplo, en el evento Antes de Insertar he intentado leer la variable global creada en el m?todo php no me la lee, y por tanto no puedo impedir el actualizar el registro.

?Como deber?a de proceder en t?rminos generales?

Saludos y gracias anticipadas

Carlos (Madrid)

Muestra en el evento onvalidate que validacion estas haciendo? asi podemos saber por qu? est? dejando salvar.

Correcto. Cuento con im?genes y texto desde el principio para mejor compresi?n:

1?) Tengo un formulario con un campo denominado NIF que hay que validar para que en la bbdd no pueda introducirse un NIF incorrecto
[ATTACH=CONFIG]n75653[/ATTACH]

2?) He creado un m?todo php llamado “validar_nifcif” para validar un campo del formulario llamado NIF
[ATTACH=CONFIG]n75654[/ATTACH]

3?) He creado un evento ajax ONBLUR al campo nif desde el que ejecuto el m?todo “validar_nifcif” al abandonar el campo NIF
[ATTACH=CONFIG]n75655[/ATTACH]

4?) El scrip de “validar_nifcif” es el siguiente:

// Crear una variable global para determinar si existe error en la validaci?n del nif
[var_nifOK] = 0;

// Validamos el campo nif, asignandolo a nuestra variable local
$str = {nif};

// Normalizamos el formato
$str = preg_replace( ‘/[^0-9A-Z]/i’, ‘’, $str );

// Comprobar longitud del Cif. No debe ser distinto de 9 caracteres.
for ($i = 0; $i < 9; $i ++){
$num[$i] = substr($str, $i, 1);
}

// Si no tiene un formato valido devuelve error
if (!ereg(’((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)’, $str))
{
{ sc_error_message(“ERROR FORMATO NO VALIDO”); [var_nifOK] = 0; return; } // ERROR FORMATO NO VALIDO.
}

// El formato es de un NIF o un NIE
if (preg_match(’/X?[0-9]{8}[A-Z]/i’, $str))
{
//para no duplicar c?digo, eliminamos la X en el caso de que sea un NIE
$str = preg_replace(’/^X/i’, ‘’, $str);

//calculamos que letra corresponde al n?mero del DNI o NIE
$stack = ‘TRWAGMYFPDXBNJZSQVHLCKE’;
$pos = substr($str, 0, 8) % 23;
if (strtoupper( substr($str, 8, 1) ) == substr($stack, $pos, 1) )
{[var_nifOK] = 1; return;} ; // NIF/NIE CORRECTO
}
// El formato es el de un CIF
else if (preg_match(’/[A-HK-NPQS][0-9]{7}[A-J0-9]/i’, $str)) //CIF
{
//sumar los digitos en posiciones pares
$sum = 0;
for ($i=2; $i<strlen($str)-1; $i+=2) {
$sum += substr($str, $i, 1);
}

//Multiplicar los digitos en posiciones impares por 2 y sumar los digitos del resultado
for ($i=1; $i<strlen($str)-1; $i+=2) {
$t = substr($str, $i, 1) * 2;
//agrega la suma de los digitos del resultado de la multiplicaci?n
$sum += ($t>9)?($t-9):$t;
}

//Restamos el ?ltimo digito de la suma actual a 10 para obtener el control
$control = 10 - ($sum % 10);

//El control puede ser un n?mero o una letra
if ( substr($str, 8, 1) == $control ||
strtoupper(substr($str, 8, 1)) == substr(‘JABCDEFGHI’, $control, 1 ))
{[var_nifOK] = 1; return;} ; // CIF CORRECTO
}

{sc_error_message(“Cif/Nif/Nie: No v?lido”); [var_nifOK] = 0; return;} ; // CIF/NIF/NIE INCORRECTO

5?) Este script funciona correctamente y valida el campo bien, sin embargo, y a pesar de que valida el campo correctamente y lanza el mensaje de error, y a pesar de no haberse corregido el error, deja actualizar el registro

Ello me obliga a buscar un m?todo alternativo para mantener el error y por ello he pensado en crear una variable global al inicio del formulario y he utilizado el evento onLOAD, y de tal forma que el m?todo PHP la modifique y la pueda utilizar comprob?ndo su valor en otro tipo de eventos como por ejemplo onVALIDATE.

CONTINUA EN EL SIGUIENTE POST, PUESTO QUE NO ME DEJA INCLUIR MAS DE CINCO IMAGENES

seis.png

cuatro.png

cinco.png

tres.png

uno.png

CONTINUO CON LA EXPLICACION:

6?) Para utiliza el evento onVALIDATE y lanzar un mensaje de error de que existe el nif err?neo sin modificar, he creado la variable global en el evento onLOAD llamada [var_nifOK] y la doy valor de 0 o false: [var_nifOK] = 0;
Esta variable global en el m?todo PHP si la validaci?n es correcta, lo cambio a [var_nifOK] = 1; en caso contrario la dejo siempre en [var_nifOK] = 0;

[ATTACH=CONFIG]temp_3736_1489441852055_598[/ATTACH]

[ATTACH=CONFIG]temp_3739_1489441869328_19[/ATTACH]

7?) En el evento onVALIDATE compruebo el valor de dicha variable de tal forma que si sigue teniendo como valor 0 lanzo el mensaje de error, y ese mensaje de error si impide el guardar el registro.

realizo la siguiente comprobaci?n:

if ([var_nifOK] == 0)
{
sc_error_message(“El campo Nif es err?neo. ?Rectifique!”);
}

[ATTACH=CONFIG]temp_3738_1489441897415_564[/ATTACH]

8?) Con esa comprobaci?n, ahora siempre la comprobaci?n de la variable global me da false por cuanto siempre me lanza el mensaje de error, independientemente del valor que en el m?todo PHP le he asignado cuando la he modificado en funci?n de la validaci?n del campo.

[ATTACH=CONFIG]temp_3740_1489441928783_424[/ATTACH]

El error: No logro ver como hacer que si la variable global la he creado en el evento onINIT, la he cambiado el valor en el m?todo PHP, y la valido en el evento onVALIDATE, siempre me toma el valor de la declaraci?n inicial de la variable global A PESAR DE HABER SIDO MODIFICADA EN EL METODO PHP, y no se como solucionar esta cuesti?n.

Espero que ahora me haya sabido explicar mejor, y contribuya al mejor entendimiento del problema.

Saludos y gracias anticipadas.

Carlos

Hola, ya le? lo que has hecho, y pienso que has hecho las cosas bien en ambos metodos que lo has probado. Pero adem?s veo que has cometido una peque?a falla que debe de arreglarla y asi el registro en caso de error no deja salvar los cambios.
Si bien la funcion sc_error_message(“Este es un error”); muestra un mensaje de “error”, este funcion NO detiene la ejecucci?n del programa. Solo muestra su mensaje , por lo tanto debe ir acompa?ada de otra linea alternativa que es esta funcion: sc_error_exit(); As? SI se detiene la ejecucci?n del programa y muestra el mensaje.

Esa funci?n es la que te falt? desde un principio para que no dejara actualizar el registro.

Gracias por tu respuesta ALVAGAR.

Realmente no ten?a conocimiento de la macro que indicas, que funcionase as?.

No obstante, lo he resuelto de una manera m?s sencilla.

El problema era que el metodo PHP no me actualizaba el valor de la variable global, y la soluci?n ha sido muy sencilla, y es que en el evento ajax OnBLUR del campo nif, he asignado el valor del retorno directamente a la variable con :
[var_nifOK] = validar_nifcif();

y he cambiado las l?neas del retorno en el m?todo PHP a:

en los casos de error: { sc_error_message(“ERROR FORMATO NO VALIDO”); return 0; } // ERROR FORMATO NO VALIDO.
en los casos de Ok: {return 1;} ; // NIF/NIE CORRECTO

de esta manera con return 1 o 0, asigno el valor directamente a la variable global con [var_nifOK] = validar_nifcif(); y solucionado el problema.

Ahora en el evento OnVALIDATE puedo chequear correctamente con:

if ([var_nifOK] == 0)
{
sc_error_message(“El campo Nif es err?neo. ?Rectifique!”);
}

y ah?, dar el error en el momento de guardar el registro impidiendo en caso de error que se guarde.
Y con este sistema, si tengo que validar m?s campos en el mismo formulario, es tan f?cil como seguir el mismo criterio y devolver mediante return un valor concreto y en OnVALIDATE poder dar la respuesta adecuada.

Gracias a todos por vuestra ayuda.

Carlos

Ok, me alegro de que hayas podido darle solucion a tu inconveniente. :wink: