Jump to content

validar el DNI / NIF


bezwada

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

Link to comment
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
Link to comment
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)
Link to comment
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

Link to comment
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

Link to comment
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

Link to comment
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)

Link to comment
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 ¿?

Link to comment
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'))))

Link to comment
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..

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...