Jump to content

Recommended Posts

Hola a todos!,

Tengo dos tiendas prestashop (1.5.4.1 y 1.6.1.1) en las que necesito cambiar el campo de identificación fiscal para que reconozca si el formato DNI/NIE/CIF es correcto y lo valide. Ya que por defecto podrías poner cualquier cosa en ese campo y te lo aceptaba. Hasta ahora sólo he encontrado para la validación de DNI (este que os adjunto funciona) pero no para el resto.

 

Los clientes suelen incluir también el NIE y el CIF por lo que no nos podemos restringir en este sentido. ¿Alguien sabe cómo podríamos solucionarlo?

 

Muchas gracias

 

PD: Muchas gracias al usuari "nadie" por ponerlo, en otro post. Lo adjunto aquí porque el otro topic está bloqueado.

 

 

 

'nadie', on 16 May 2013 - 1:41 PM, said:snapback.png

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

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