Jump to content

validar el DNI / NIF


bezwada
 Share

Recommended Posts

¡Hola

 

¿hay alguna opción para validar el DNI / NIF / NIE

 

el problema es que los clientes están llenando el campo obligatorio comox0000001d, con los números B23232323 son spam. Entonces, ¿hay alguna manera de controlar esto?

 

gracias

Share this post


Link to post
Share on other sites

¿El módulo "Número de IVA europeo" conecta con una base de datos?. Para sociedades funciona, para DNI no lo sé.

Teóricamente. (Pero comprobar a que persona pertenece lo dudo, ya que por ley no esta permitido, acceder a una base de datos digamos donde tengan almacenados este tipo de datos)

 

Pero recomiendo mirar este tema:

http://www.prestasho...cion-de-dnicif/

  • Like 1

Share this post


Link to post
Share on other sites

Creo que no conecte con una base de datos, a parte que no existe (solo la tiene el ministerio de interior). En España solo se valida que tengo un formato valido, utilizando un algoritmo que calcula la Letra.

 

Yo creo que prestashop no valida ni esto, por lo menos en mi casi. Si estoy equivocado os agradeceria que me lo comentarais.

 

Un saludo.

Edited by LaVallDissenys.com (see edit history)

Share this post


Link to post
Share on other sites

Hola:

 

Yo estoy en la misma situación.

 

Me gustaría que prestashop, por lo menos validará la letra que corresponde con el dni.

 

Antiguamente tenía la versión cartium 1.2.5 c7, y si que comprobaba la letra.

 

Ahora, desde que actualicé a la 1.4, no lo comprueba. He buscado por todos los sitios, he hecho algunas modificaciones que he visto, pero no me funciona. Se ponga lo que se ponga en el cuadro dni, lo acepta.

 

¿Alguien conoce la manera de que funcione la validación del dni?

 

Un saludo

Share this post


Link to post
Share on other sites

  • 5 months later...
  • 6 months later...

He encontrado el codigo php, pero lo he metido en el authcontroller y no funciona la autenticación.

 

 

<?php

$partes = explode('-', $nif);

$numeros = $partes[0];

$letra = strtoupper($partes[1]);

if (substr("TRWAGMYFPDXBNJZSQVHLCKE",$numeros%23,1) == $letra)

echo '<p>El DNI: '.$nif.' es correcto!</p>';

else

echo '<p>La letra introducida no es corrrecta!</p>';

?>

No se, haber si algun experto nos ilumina

Share this post


Link to post
Share on other sites

He encontrado el codigo php, pero lo he metido en el authcontroller y no funciona la autenticación.

 

 

<?php

$partes = explode('-', $nif);

$numeros = $partes[0];

$letra = strtoupper($partes[1]);

if (substr("TRWAGMYFPDXBNJZSQVHLCKE",$numeros%23,1) == $letra)

echo '<p>El DNI: '.$nif.' es correcto!</p>';

else

echo '<p>La letra introducida no es corrrecta!</p>';

?>

No se, haber si algun experto nos ilumina

 

Eso ya lo hace prestashop con la funcion:

 

Validate::isDni

Share this post


Link to post
Share on other sites

Eso ya lo hace prestashop con la funcion:

 

Validate::isDni

 

nah, no lo hace, simplemente comprueba otra cosa.

 

De todos modos, si tu metes esa validacion que dices, se lo estaras aplicando a todos los paises.

 

¿Estas seguro de eso?

Share this post


Link to post
Share on other sites

He encontrado el codigo php, pero lo he metido en el authcontroller y no funciona la autenticación.

 

 

<!--?php

$partes = explode('-', $nif);

$numeros = $partes[0];

$letra = strtoupper($partes[1]);

if (substr("TRWAGMYFPDXBNJZSQVHLCKE",$numeros%23,1) == $letra)

echo '<p-->El DNI: '.$nif.' es correcto!<p></p>';

else

echo '<p>La letra introducida no es corrrecta!</p>';

?>

No se, haber si algun experto nos ilumina

 

Fichero:

 

/classes/Validate.php

 

Añade esto:

 

public static function comprobarDni ($cadena)
{
//Comprobamos longitud
if (strlen($cadena) != 9) return false;	

//Posibles valores para la letra final
$valoresLetra = array(
	0 => 'T', 1 => 'R', 2 => 'W', 3 => 'A', 4 => 'G', 5 => 'M',
	6 => 'Y', 7 => 'F', 8 => 'P', 9 => 'D', 10 => 'X', 11 => 'B',
	12 => 'N', 13 => 'J', 14 => 'Z', 15 => 'S', 16 => 'Q', 17 => 'V',
	18 => 'L', 19 => 'H', 20 => 'C', 21 => 'K',22 => 'E'
);
//Comprobar si es un DNI
if (preg_match('/^[0-9]{8}[A-Z]$/i', $cadena))
{
	//Comprobar letra
	if (strtoupper($cadena[strlen($cadena) - 1]) !=
		$valoresLetra[((int) substr($cadena, 0, strlen($cadena) - 1)) % 23])
		return false;

	//Todo fue bien
	return true;
}
//Comprobar si es un NIE
else if (preg_match('/^[XYZ][0-9]{7}[A-Z]$/i', $cadena))
{
	//Comprobar letra
	if (strtoupper($cadena[strlen($cadena) - 1]) !=
		$valoresLetra[((int) substr($cadena, 1, strlen($cadena) - 2)) % 23])
		return false;
	//Todo fue bien
	return true;
}

//Cadena no válida
return false;
}

public static function isDniSpain($dni)
{
 return empty($dni) || (bool)Validate::comprobarDni($dni);
}

 

La funcion:

 

comprobarDni

 

ha sido sacada de aquí:

 

http://www.kiwwito.c...dni-nie-espanol

 

Despues, vamos al fichero:

 

/controllers/front/AuthController.php

 

Buscamos esto:

 

  if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))))

 

Y lo dejamos asi:

 

  if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni')) || !Validate::isDniSpain(Tools::getValue('dni')) ))

 

Atención, aqui lo que hacemos es comprobar si el dni es Español para todos los países.... (Lo ideal seria hacerlo de forma individual por Paises y no de forma general)

Share this post


Link to post
Share on other sites

Hola nadie, gracias por tu respuesta, he cambiado lo que me dices, pero sigue tragandose lo que le pongas en el campo de dni.

Yo no tengo la carpeta front dentro de controller, he cambiado eso que me dices en /controllers/authcontroller.php

 

Un saludo, yo no acepto pedidos de fuera del pais. (Todavía)

Share this post


Link to post
Share on other sites

Lo acabo de probar Bubalcaba y no hace nada en el dni. me deja registrarme con el dni er4k4 por ejemplo

 

Acabo de probar lo que decia Nadie arriba, el codigo ese que ha puesto, y me funciona, pero yo uso Prestashop 1.5, que version de prestashop usas tu ¿?

Share this post


Link to post
Share on other sites

Fichero:

 

/classes/Validate.php

 

Añade esto:

 

public static function comprobarDni ($cadena)
{
//Comprobamos longitud
if (strlen($cadena) != 9) return false;	

//Posibles valores para la letra final
$valoresLetra = array(
	0 => 'T', 1 => 'R', 2 => 'W', 3 => 'A', 4 => 'G', 5 => 'M',
	6 => 'Y', 7 => 'F', 8 => 'P', 9 => 'D', 10 => 'X', 11 => 'B',
	12 => 'N', 13 => 'J', 14 => 'Z', 15 => 'S', 16 => 'Q', 17 => 'V',
	18 => 'L', 19 => 'H', 20 => 'C', 21 => 'K',22 => 'E'
);
//Comprobar si es un DNI
if (preg_match('/^[0-9]{8}[A-Z]$/i', $cadena))
{
	//Comprobar letra
	if (strtoupper($cadena[strlen($cadena) - 1]) !=
		$valoresLetra[((int) substr($cadena, 0, strlen($cadena) - 1)) % 23])
		return false;

	//Todo fue bien
	return true;
}
//Comprobar si es un NIE
else if (preg_match('/^[XYZ][0-9]{7}[A-Z]$/i', $cadena))
{
	//Comprobar letra
	if (strtoupper($cadena[strlen($cadena) - 1]) !=
		$valoresLetra[((int) substr($cadena, 1, strlen($cadena) - 2)) % 23])
		return false;
	//Todo fue bien
	return true;
}

//Cadena no válida
return false;
}

public static function isDniSpain($dni)
{
 return empty($dni) || (bool)Validate::comprobarDni($dni);
}

 

La funcion:

 

comprobarDni

 

ha sido sacada de aquí:

 

http://www.kiwwito.c...dni-nie-espanol

 

Despues, vamos al fichero:

 

/controllers/front/AuthController.php

 

Buscamos esto:

 

  if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))))

 

Y lo dejamos asi:

 

  if ($country->need_identification_number && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni')) || !Validate::isDniSpain(Tools::getValue('dni')) ))

 

Atención, aqui lo que hacemos es comprobar si el dni es Español para todos los países.... (Lo ideal seria hacerlo de forma individual por Paises y no de forma general)

 

Añado, que lo de modificar el fichero:

 

/controllers/front/AuthController.php

 

es para el formulario de registro.

 

Para el formulario de modificar la dirección, es el fichero:

 

/controllers/front/AddressController.php

 

Y se cambia esto:

 

  if ($country->isNeedDni() && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni'))))

 

por esto:

 

  if ($country->isNeedDni() && (!Tools::getValue('dni') || !Validate::isDniLite(Tools::getValue('dni')) || !Validate::isDniSpain(Tools::getValue('dni'))))

Share this post


Link to post
Share on other sites

ya funciona, muchas gracias, pero me fastidia que no he averiguado cual era el error, supongo que de sintaxis (algun espacio o algo por el estilo)

he dejado solo en el if la nueva función y funcionaba y he ido agregando las otras una a una y ahora si funciona!!!

De nuevo muchas gracias

 

Bueno...., me alegro de que al final te funcionara.

 

PD: Es posible que el foro haya dejado un espacio de mas accidentalmente..

Share this post


Link to post
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More