Jump to content

[> SOLUCIONADO <] DNI obligatorio en PS 1.4.0.17


JoysticK

Recommended Posts

Buenas señores,

¿ alguien sabría decirme que modificación tendría que realizar en PS 1.4 para que en la ficha de registro de nuevo cliente el campo DNI sea obligatorio y no opcional ?

¿ tiene ps 1.4 alguna opción para activar esto sin modificar los tpl ?



Gracias de antemano por vuestro tiempo :)

Link to comment
Share on other sites

Estoy interesad en lo mismo!
Lo que he encontrado es modificar la traducción de "Addres(2)" Por DNI/NIF/NIE y en template poner obligatorio.
Ya se que no es lo que buscas ni yo tampoco, preferiría que fuera por administración..

A ver si alguien más puede aportar algo! :)

Saludos!

Link to comment
Share on other sites

Bueno ya lo he solucionado, he modificado el controlador de autenticacion de la carpeta controlles/authController.php
En el apartado de dni he dividido el IF que hay en 2, para poder tratar el error por separado, como se hace con el resto ce campos.
Ahora no lo tengo delante, pero si quieres me mandas un mensaje privado y mañana te lo contesto, y si eso ya lo publico aquí también.

Saludos!

Link to comment
Share on other sites

Yo lo que he hecho es en "authentication.php" cambiar el trozo de código que valida el DNI (lo que he hecho es dividir el IF en 2).

if(Tools::getValue('dni') == NULL)
{
$errors[] = Tools::displayError('DNI isn\'t valid');
}
if ($validateDni != 1)
{
$error = array(
0 => Tools::displayError('DNI isn\'t valid'),
-1 => Tools::displayError('this DNI has been already used'),
-2 => Tools::displayError('NIF isn\'t valid'),
-3 => Tools::displayError('CIF isn\'t valid'),
-4 => Tools::displayError('NIE isn\'t valid')
);
$errors[] = $error[$validateDni];
}

Link to comment
Share on other sites

Buenas de nuevo, te paso por aquí la "solución" y así a ver si ayudamos a más gente
Lo que hice fué modificar la parte donde valida el DNI en el AuthController.php como ya te comenté:

/*            if (Country::isNeedDniByCountryId($address->id_country) AND !Tools::getValue('dni') AND !Validate::isDniLite(Tools::getValue('dni')))
               $this->errors[] = Tools::displayError('Identification number is incorrect or has already been used.');
           elseif (!Country::isNeedDniByCountryId($address->id_country))
               $address->dni = NULL;
*/
//------------------------ DNI   --------------------------
           if (Country::isNeedDniByCountryId($address->id_country))
           {
               if(!Tools::getValue('dni') or !Validate::isDniLite(Tools::getValue('dni')))
               {
                   $this->errors[] = Tools::displayError(''.Tools::displayError('Introduzca el DNI/NIF/NIE').'');
               }
           }
           elseif (!Country::isNeedDniByCountryId($address->id_country))
               $address->dni = NULL;

//------------------------ DNI   --------------------------    



Si te fijas, la primera parte que esta todo comentado, es la forma antigua de tratar el dni (línea 125 del -php), la segunda parte es la que obliga a rellenar el dni para poder hacer el registro.

Ten en cuenta que en la ficha del pais (en transportes-Paises) hay que poner que requiere el numero de de identificación fiscal.

Bueno a ver si te ayuda!

Link to comment
Share on other sites

Yo lo que he hecho es en "authentication.php" cambiar el trozo de código que valida el DNI (lo que he hecho es dividir el IF en 2).

if(Tools::getValue('dni') == NULL)
{
$errors[] = Tools::displayError('DNI isn\'t valid');
}
if ($validateDni != 1)
{
$error = array(
0 => Tools::displayError('DNI isn\'t valid'),
-1 => Tools::displayError('this DNI has been already used'),
-2 => Tools::displayError('NIF isn\'t valid'),
-3 => Tools::displayError('CIF isn\'t valid'),
-4 => Tools::displayError('NIE isn\'t valid')
);
$errors[] = $error[$validateDni];
}



Justo acabo de comentar algo parecido jeje
Link to comment
Share on other sites

Yo lo que he hecho es en "authentication.php" cambiar el trozo de código que valida el DNI (lo que he hecho es dividir el IF en 2).

if(Tools::getValue('dni') == NULL)
{
$errors[] = Tools::displayError('DNI isn\'t valid');
}
if ($validateDni != 1)
{
$error = array(
0 => Tools::displayError('DNI isn\'t valid'),
-1 => Tools::displayError('this DNI has been already used'),
-2 => Tools::displayError('NIF isn\'t valid'),
-3 => Tools::displayError('CIF isn\'t valid'),
-4 => Tools::displayError('NIE isn\'t valid')
);
$errors[] = $error[$validateDni];
}



Justo acabo de comentar algo parecido jeje



Verdad no lo había visto!, sorry.
Link to comment
Share on other sites

Hola buenas,
Estoy probando la nueva version 1.4 y he hecho los cambios que comentais aqui.
Cuando he provado de introducir un dni he puesto cuanquier cosa para que me diera error.
Mi sorpresa ha sido que ponga lo que ponga en el campo dni me lo da por bueno, cuando me deberia decir que el dni es incorrecto.
Me he sorprendido aun más cuando al volver al codigo por defecto pasaba lo mismo. juas juas.

¿Os pasa lo mismo o es al bug de servidor?
Gracias

Link to comment
Share on other sites

Acabo de probarla Sawe y tienes razón, la verificación que realizaba en la versión 1.3 para comprobar que el dni es correcto, ahora en la 1.4 no la realiza...


Por un lado incluso me alegro, ese campo daba un poco de "por culo" cuando topamos con un cliente torpe...

Link to comment
Share on other sites

Hola, en Back Office>> Transporte>> Países hay una opción para requerir el Número de identificación fiscal por paises (¿Necesita el número de identificación fiscal?) ¿es que no funciona? .. saludos TECNILOCO.


Te lo pide pero no te lo hace obligatorio por defecto, como dices tu "no funciona"
Link to comment
Share on other sites

Con lo que yo he posteado funciona obligándote a escribir algo, pero falta depurarlo un poco ya que si escribes lo que sea, note lo trata como un dni, la función que mira el DNI Validate::isDniLite(Tools::getValue('dni') no se si acaba de funcionar bien, pero con lo que puse yo funciona parcialmente :P

Link to comment
Share on other sites

Creo que he encontrado la solución definitiva a este tema!

Sin modificar el código fuente de ningún "Controller", es decir, tal y como vienen (deshacer la modificación que habéis realizado), haced lo siguiente:

- Activar lo siguiente:

Back Office >> Transporte >> Países >> España >> ¿Necesita el número de identificación fiscal? >> SI

* Esto hace que se muestre en el formulario de registro la casilla de DNI.

Back Office >> Clientes >> Direcciones >> Parámetros avanzados >> Campos obligatorios >> dni

* Esto hace que el campo DNI sea obligatorio.

Con esto ya tendremos solucionado el problema de que el DNI sea obligatorio, y sin necesidad de modificar ningún fichero fuente...

Aún así, continuaremos con el problema del formato. Para solucionar esto, no hay otra manera que modificar ficheros del CORE, por lo que debemos ir al fichero:

* ..\classes\Validate.php

Y aquí realizar la siguiente modificación:

   static public function isDniLite($dni)
   {
   /* Validació DNI - INI */
   //return empty($dni) OR (bool)preg_match('/^[0-9a-z-.]{1,16}$/Ui', $dni);
   return empty($dni) OR (bool)preg_match('/[a-zA-Z0-9]{1}[0-9]{7}[a-zA-Z0-9]{1}/', $dni);
   /* Validació DNI - FIN */
   }



De esta manera podremos insertar los siguientes formatos:

* NNNNNNNNL (DNI)
* LNNNNNNNL (NIE)
* LNNNNNNNN (NIF)

Y para mayor control sobre la longitud de este campo, deberemos ir al fichero:

* ..\classes\Address.php

Y realizar la siguiente modificación:

/* Validació DNI - INI */
//'other' => 300, 'phone' => 16, 'phone_mobile' => 16, 'dni' => 16);
'other' => 300, 'phone' => 9, 'phone_mobile' => 9, 'dni' => 9);
/* Validació DNI - FIN */



Y así solo permitiremos insertar 9 caracteres en el campo 'dni' (y de paso en los números de teléfono... jeje... ).

Espero que a alguien le resulte de ayuda, ya que yo llevo toda la tarde peleándome con esto...

Por cierto, podéis verlo funcionando en:

>> http://www.elpalaciodelsexo.com (en construcción)

Un saludo!

Link to comment
Share on other sites

  • 1 month later...

Hola.
Si lo cambiamos en le BO todo esto funciona bien siempre y cuando el país de procedencia de la persona que se registra requiera DNI, si no es así, aun desapareciendo el campo, te pide que metas DNI para poder registrar, y claro, es imposible hacerlo si no está el campo por ningun lado. Resultado? Los potenciales clientes del resto del mundo no se pueden registrar en nuestra tienda.

Saludos.

Link to comment
Share on other sites

Buenas.

Para solucionar el problema.
Se tiene que tomar la solucion de KristianMM y juntarlas con la solucion de xasoco (Solo tomar la validacion del DNI y la longitud del DNI).

Porque si solo se toma solo la solucion de xacoso, pasara lo que le sucedio a Yoriel79

Yo uní las dos soluciones y me funciono todo correctamente.

Saludos.

Link to comment
Share on other sites

Creo que he encontrado la solución definitiva a este tema!

Sin modificar el código fuente de ningún "Controller", es decir, tal y como vienen (deshacer la modificación que habéis realizado), haced lo siguiente:

- Activar lo siguiente:

Back Office >> Transporte >> Países >> España >> ¿Necesita el número de identificación fiscal? >> SI

* Esto hace que se muestre en el formulario de registro la casilla de DNI.

Back Office >> Clientes >> Direcciones >> Parámetros avanzados >> Campos obligatorios >> dni

* Esto hace que el campo DNI sea obligatorio.

Con esto ya tendremos solucionado el problema de que el DNI sea obligatorio, y sin necesidad de modificar ningún fichero fuente...

Aún así, continuaremos con el problema del formato. Para solucionar esto, no hay otra manera que modificar ficheros del CORE, por lo que debemos ir al fichero:

* ..\classes\Validate.php

Y aquí realizar la siguiente modificación:

   static public function isDniLite($dni)
   {
   /* Validació DNI - INI */
   //return empty($dni) OR (bool)preg_match('/^[0-9a-z-.]{1,16}$/Ui', $dni);
   return empty($dni) OR (bool)preg_match('/[a-zA-Z0-9]{1}[0-9]{7}[a-zA-Z0-9]{1}/', $dni);
   /* Validació DNI - FIN */
   }



De esta manera podremos insertar los siguientes formatos:

* NNNNNNNNL (DNI)
* LNNNNNNNL (NIE)
* LNNNNNNNN (NIF)

Y para mayor control sobre la longitud de este campo, deberemos ir al fichero:

* ..\classes\Address.php

Y realizar la siguiente modificación:

/* Validació DNI - INI */
//'other' => 300, 'phone' => 16, 'phone_mobile' => 16, 'dni' => 16);
'other' => 300, 'phone' => 9, 'phone_mobile' => 9, 'dni' => 9);
/* Validació DNI - FIN */



Y así solo permitiremos insertar 9 caracteres en el campo 'dni' (y de paso en los números de teléfono... jeje... ).

Espero que a alguien le resulte de ayuda, ya que yo llevo toda la tarde peleándome con esto...

Por cierto, podéis verlo funcionando en:

>> http://www.elpalaciodelsexo.com (en construcción)

Un saludo!



Hola buenas
He estado viendo tu solucion para poner el DNI obligatorio en la 1.4, pero lamentablemente uso la 1.37 y esas opciones no me salen disponibles .
Sabes si hay alguna solucción para mi version?
Por cierto que modulo de redes sociales usas en tu página?

Muchas Gracias
Link to comment
Share on other sites

  • 1 year later...

Para España he encontrado una solución de validar el DNI.

 

En /classes/Validate.php encuentra la función isDniLite aprox linea 912 en 1.4.8 y cambiarlo a lo siguiente:

 

 

public static function isDniLite($dni)

{

//return empty($dni) OR (bool)preg_match('/^[0-9A-Za-z-.]{1,16}$/U', $dni);

$numeros = substr($dni, 0, -1);

$letra = substr($dni, -1, 1);

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

return true;

else

return false;

}

 

 

Ojo que eso usa el algoritmo de España entonces solo vale para tiendas que unicamente venden en España

Edited by logz05 (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Para España he encontrado una solución de validar el DNI.

 

En /classes/Validate.php encuentra la función isDniLite aprox linea 912 en 1.4.8 y cambiarlo a lo siguiente:

 

 

public static function isDniLite($dni)

{

//return empty($dni) OR (bool)preg_match('/^[0-9A-Za-z-.]{1,16}$/U', $dni);

$numeros = substr($dni, 0, -1);

$letra = substr($dni, -1, 1);

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

return true;

else

return false;

}

 

 

Ojo que eso usa el algoritmo de España entonces solo vale para tiendas que unicamente venden en España

 

Hola, he realizado ese proceso para validar el DNI en Chile (rut), pero modifico esa función, y después de guardar el archivo y subirlo al servidor, este muestra tanto el BO como el FO en blanco.

 

Hiciste algo con las variables (las registraste en otro archivo o algo)?

 

Saludos y gracias.

Link to comment
Share on other sites

Hola:

 

He hecho la modificación aquí señalada, pero veo que no acaba de funcionar correctamente, por lo menos en mi caso.

 

La cuestión, es que si pongo la letra del dni en minuscula, no lo acepta, con lo cual puede confundir a la persona que se está regsitrando.

 

También si está mal en dni, a mi me salen 2 avisos

dni es incorrecto

número de identificación incorrecto o ya utilizado

 

La verdad, es que me gustaría que funcionase correctamente, pues es algo muy útil.

 

Un saludo.

Link to comment
Share on other sites

  • 2 weeks later...

Hola:

 

He hecho la modificación aquí señalada, pero veo que no acaba de funcionar correctamente, por lo menos en mi caso.

 

La cuestión, es que si pongo la letra del dni en minuscula, no lo acepta, con lo cual puede confundir a la persona que se está regsitrando.

 

También si está mal en dni, a mi me salen 2 avisos

dni es incorrecto

número de identificación incorrecto o ya utilizado

 

La verdad, es que me gustaría que funcionase correctamente, pues es algo muy útil.

 

Un saludo.

 

Hay que utilizar un "input transform UpperCase" y la variable la llamas en php, así que todo lo transforma en mayúscula y funciona correctamente.

Link to comment
Share on other sites

  • 2 months later...

Hola a Todos

 

Para PS 1.5.2 para validar el DNI/CIF/NIF/NIE

 

Hay que cambiar el function isDNILite (aprox. linea 846) en /classes/Validate.php por el código abajo.

 

Ojo solo funciona para España

 

public static function isDniLite($dni)
 {
 $cif = strtoupper($dni);
 for ($i = 0; $i < 9; $i ++)
 {
$num[$i] = substr($cif, $i, 1);
 }
	//si no tiene un formato valido devuelve error
 if (!preg_match('/((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)/', $cif))
 {
return false;
 }

	//comprobacion de NIFs estandar
 if (preg_match('/(^[0-9]{8}[A-Z]{1}$)/', $cif))
 {
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr($cif, 0, 8) % 23, 1))
{
  return true;
}
else
{
  return false;
}
 }

	//algoritmo para comprobacion de codigos tipo CIF
 $suma = $num[2] + $num[4] + $num[6];
 for ($i = 1; $i < 8; $i += 2)
 {
$suma += substr((2 * $num[$i]),0,1) + substr((2 * $num[$i]), 1, 1);
 }
 $n = 10 - substr($suma, strlen($suma) - 1, 1);
	//comprobacion de NIFs especiales (se calculan como CIFs o como NIFs)
 if (preg_match('/^[KLM]{1}/', $cif))
 {
if ($num[8] == chr(64 + $n) || $num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr($cif, 1, 8) % 23, 1))
{
  return true;
}
else
{
  return false;
}
 }

	//comprobacion de CIFs
 if (preg_match('/^[ABCDEFGHJNPQRSUVW]{1}/', $cif))
 {
if ($num[8] == chr(64 + $n) || $num[8] == substr($n, strlen($n) - 1, 1))
 {
  return true;
}
else
{
  return false;
}
 }

	//comprobacion de NIEs
	//T
 if (preg_match('/^[T]{1}/', $cif))
 {
if ($num[8] == preg_match('/^[T]{1}[A-Z0-9]{8}$/', $cif))
 {
  return true;
}
else
{
  return false;
}
 }
	//XYZ
 if (preg_match('/^[XYZ]{1}/', $cif))
 {
if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE', substr(str_replace(array('X','Y','Z'), array('0','1','2'), $cif), 0, 8) % 23, 1))
 {
  return true;
}
else
{
  return false;
}
 }


	//si todavia no se ha verificado devuelve error
 return false;
	}

 

Este código funcionara en 1.4 tambien. Es mucho más exhaustivo del código anterior ya que comprueba todos los formatos.

 

El código viene directamente desde http://bulma.net/bod...nIdNoticia=2248

Link to comment
Share on other sites

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