Comprobar el valor de los campos del formulario de registro



En la entrada de hoy vamos a ver la lógica para comprobar el valor de los campos del formulario de registro. Esto aplicará tanto el en formulario de registro como en el formulario de edición de nuestros datos personales.

Si prefieres en lugar de programar obtener directamente un módulo que haga esto mismo por ti, te recomiendo que leas la siguiente entrada: Módulo para crear nuevos campos en el formulario de registro.

Comprobar el valor de los campos del formulario de registro

Antes de entrar en detalle, recordemos esta entrada en la cual hablábamos acerca de cómo crear nuevos campos en el formulario de registro en modo visual bajo la plataforma de Prestashop 1.7.2.

Una vez hayamos realizado la anterior, vamos a continuar…

¿Creando override para trabajar sobre el script CustomerForm?

Empezamos localizando dónde van estos datos cada vez que pulsamos sobre el botón submit del formulario de registro.

Como podemos ver, estamos llamando a la clase classes/form/CustomerForm.php por lo tanto, como siempre queremos mantener las buenas prácticas en el desarrollo, vamos a crear este mismo script en nuestro override bajo la ruta override/classes/form/CustomerForm.php

¿Qué métodos llamamos al pulsar el botón submit del formulario de registro?

El script CustomerForm.php lo primero que hace tras pulsar el botón submit, es validar una serie de campos definidos.

public function submit()
{     
    if ($this->validate()) {
...

Buscando la función de validación validate(), vemos que por defecto realiza las siguientes acciones:
– Validación de email.
– Validación de fecha de nacimiento.

Pero claro, nosotros ahora queremos validar un nuevo campo, justo el campo DNI que es el que insertamos como nuevo en nuestra entrada anterior. (Ver entrada de cómo crear nuevos campos en el formulario de registro).

Añadiendo nueva validación de longitud para campo DNI en formulario de registro.

Vamos a indicar la longitud correcta que tiene que tener nuestro nuevo campo.
En el método validateFieldsLengths() añadimos 2 nuevos valores quedando de este modo:

protected function validateFieldsLengths()
{
    $this->validateFieldLength('email', 128, $this->getEmailMaxLengthViolationMessage());
    $this->validateFieldLength('firstname', 255, $this->getFirstNameMaxLengthViolationMessage());
    $this->validateFieldLength('lastname', 255, $this->getLastNameMaxLengthViolationMessage());

    // Añadimos validación para comprobar que la longitud del campo dni es correcta.
    $this->validateFieldLength('dni', 9, $this->getDniMaxLengthViolationMessage());
    $this->validateFieldMinimunLength('dni', 9, $this->getDniMaxLengthViolationMessage());
}

Con la primera línea, comprobamos que el campo DNI no tenga una longitud superior a 9 caracteres. Esto ya lo tenemos restringido con un maxlenght en el input, pero nunca está de más volver a realizar las comprobaciones en el lado servidor. $this->validateFieldLength(‘dni’, 9, $this->getDniMaxLengthViolationMessage());

La segunda línea es una función que he creado yo mismo, nada del otro mundo. Comprueba que el campo DNI no tiene una longitud inferior a 9. Esto podía haberse realizado con un único método, pero viendo que prestashop tenía definida la función de máximo de longitud, pues yo he creado también la que controla el mínimo 🙂 y en caso de no llegar al mínimo, lanzaremos un error. $this->validateFieldMinimunLength(‘dni’, 9, $this->getDniMaxLengthViolationMessage());

Paso a continuación las 2 funciones.

protected function validateFieldMinimunLength($fieldName, $minimunLength, $violationMessage)
{
    $field = $this->getField($fieldName);
    if (strlen($field->getValue()) < $minimunLength) {
        $field->addError($violationMessage);
    }
}
protected function getDniMaxLengthViolationMessage()
{
    return $this->translator->trans(
       'El campo %1$s debe ser 8 números y una letra (Ejemplo: 00000000A).',
        array('dni', 9),
        'Shop.Notifications.Error'
    );
}

Desde este instante, si salvamos los cambios realizados y ponemos por ejemplo en el campo DNI el valor 123123A podemos ver que ya nos está mostrando el error el formulario.

Comprobar el valor dni del formulario de registro

Aquí podríamos haber cerrado la entrada, pero estoy seguro de que muchos de los que desarrollamos en Prestashop tenemos la necesidad de añadir el campo DNI en el formulario de registro, y claro… deberíamos realizar una correcta validación para que no inserten nada similar a 2A3b66FEO (¿Tiene 9 caracteres?, sí. ¿Es correcto?, desde luego que no).

Validando el campo DNI en el formulario de registro de Prestashop 1.7.

Dentro de la función validate() vamos a crear una nueva validación de campo.

// dni is from input type text..., so we need to convert to a valid dni type
$dniField = $this->getField('dni');
if (!empty($dniField)) {
    $dniValue = $dniField->getValue();

    if (!empty($dniValue)) {
        $dni = Customer::checkDni($dniValue);

        if($dni === 'error-formato'){
            $dniField->addError(sprintf(
                $this->translator->trans(
                    'El campo dni no tiene un formato correcto (Ejemplo: 00000000A).', array(), 'Shop.Notifications.Error'
                ),
                $dniField->getValue()
            ));
        }
    }
}

Aquí lo que estamos haciendo es recuperar el valor del campo dni del formulario, comprobamos con un método de validación que este campo es correcto. El método lo crearemos a continuación en la clase Customer, no os preocupéis.

Y por último, si todo está OK, procesa el alta, si no, lanza un mensaje de error en pantalla.

Creando validación de campos en la clase Customer.

Ahora vamos a copiar otro script de clase para poder crear la función de validación en su sitio correspondiente, por lo tanto, vamos a classes/Customer.php y copiamos este script en override/classes/Customer.php.

Paso un pantallazo de los 3 scripts de los cuales hemos hecho override en estos 2 últimos artículos donde estamos trabajando la creación de nuevos campos en el formulario de registro.

Vamos entonces a override/classes/Customer.php y creamos el siguiente método.
NOTA: Recordemos ir limpiando caché para poder trabajar correctamente con el override.

// Comprueba si un DNI es correcto.
public static function checkDni($nif)
{
    $letras = explode(',','T,R,W,A,G,M,Y,F,P,D,X,B,N,J,Z,S,Q,V,H,L,C,K,E');

    if (  (strlen($nif)!=9) ||
          (!is_long($entero=intval(substr($nif,0,8)))) ||
          (!in_array($letra=strtoupper(substr($nif,8,1)),$letras))
    ){
       return 'error-formato';
    }else{
       return true;
    }
}

En este método poco tenemos que explicar, si el DNI tiene un formato correcto continua con la ejecución, en caso contrario devuelve un error.

Y si hemos realizado todos los pasos correctamente, al poner un dni que no es válido deberíamos ver algo como esto.

Lo mismo ocurrirá en el formulario de información del usuario. Acabamos de añadir el campo nuevo y su validación tanto en un formulario como en el otro.

Y por supuesto que si ponemos un dni correcto, procesará el formulario de alta sin problema.
Y esto es todo, recordemos que en una próxima entrada veremos como insertar el valor de este nuevo campo dni en la base de datos.

 

Versiones utilizadas, tiempo y dificultad de desarrollo:

Plataforma: Prestashop 1.7.2
Tiempo de desarrollo: 20 minutos
Dificultad: Intermedio.

Publicaciones relacionadas

14 comentarios en “Comprobar el valor de los campos del formulario de registro”

  1. Hola, muchas gracias por tu gran ayuda … pero me sale este error, alguna ayuda por favor:

    Parse error: syntax error, unexpected ‘public’ (T_PUBLIC) in /…./override/classes/Customer.php on line 1388

  2. Hola, claro muy simple primero lo dejé al final del script, luego probé pegándolo en la parte superior, justo debajo de:
    /**
    * CustomerCore constructor.
    *
    * @param null $id
    */
    Lo que si no logro que lo valide y he revisado 3 veces el código … la verdad me ha salido muy complejo prestashop , de hecho estoy reconstruyendo el sitio ya que el otro ya no se que funciona mal jajaja … saludos y muchas gracias por este espacio …. un abrazo

    1. y ahora me da este error:

      UndefinedMethodException in CustomerForm.php line 193:
      Attempted to call an undefined method named «getAddress1MaxLengthViolationMessage» of class «CustomerForm».

      1. Hola Rodrigo, ¿qué versión de Prestashop tienes?
        Por lo que reporta el error de Prestashop es que estás intentando hacer uso de la función getAddress1MaxLengthViolationMessage y esta no está declarada.
        Revisa CustomerForm.php

      2. Hola bueno no funciona definitivamente … si alguien le funcionó y lo comenta … yo uso 1.7.4 y después de usar otros carritos de compra se podría decir que odio a prestashop jajaja saludos.

  3. hola, estoy siguiendo el articulo sobre agregar campos a un formulario en prestashop, estoy trabajando con la version 1.7.3, al campo dni lo agrego perfectamente, tengo problemas con la validacion del mismo, sigo los pasos del tutorial pero no valida, las funciones deben ir en alguna ubicacion especial o no. Aclaro borro la cache siempre. Gracias.

    1. Hola Javier, los métodos de validación los has de colocar justo en el script CustomerForm.php.
      Es ahí donde lee la aplicación tras pulsar el submit de registro.

  4. Hola caballeros como estan? yo soy nuevo en este foro he estado trabajando en una tienda virtual que esta soportada con prestashop, bueno mi situación es esta , agregue un campo debajo del apellido llamado identificación algo asi como DNI bueno todo perfecto el campo me almacena me registra y todo bien , ahora necesito verificar que ese campo «identificación» o «DNI» el numero que ingreso el cliente no este registrado en la base de datos algo asi como cuando nos dice que el correo ya esta registrado necesito que me diga lo mismo con ese campo y que me diga que el cliente ya esta registrado por favor ingrese el correo electrónico del numero de identificación para recuperar la contraseña y no comuníquese con servicio al cliente para generarle un usuario . agradecería sus respuestas.

    1. Hola Juan Muñoz.

      Lo que necesitas es ampliar la función public static function checkDni($nif) que hemos creado en este mismo tutorial de Prestashop, de este modo, deberás hacer una select a la tabla donde registres el campo aplicando la cláusula WHERE dni=$nif y comprobar que el resultado devuelto es vacío.

      Si es vacío insertas el registro, y si no lo es, lanzas un mensaje de error.
      Espero que te guíe mi explicación.
      Saludos!

  5. Hola buenos dias, me pregunto si es posible realizar una validación de comparación es decir
    me gustaría que se cree un usuario siempre que el usuario introduzca un valor un campo extra
    Ejemplo.
    el usuario rellena todos los campos y al final del todo estará un campo donde se deberá introducir el valor 1234 para continuar con el registro
    en que fichero debería hacer la comparación del getField(‘dni’)

    intento hacer algo como
    if (getField(‘dni’) == ‘1234’)

    1. Hola Jaime, así es… puedes validar ese nuevo campo.
      La validación la deberás realizar en el mismo script donde se realizan el resto de ellas: CustomerForm.php
      Entiendo que a estas alturas tu campo de validación ya está visible en el formulario, por lo tanto, crea un nuevo método y que valide el campo, algo como lo que expliqué para DNI.
      Saludos!

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Responsable de los datos: Luis María Jordán Muñoz | Finalidad: Responder a la solicitud que me envíes y ofrecerte información | Legitimación: Tu consentimiento de forma expresa | Destinatario: Webempresa mi proveedor de hosting | Derechos: Tienes derecho al acceso, rectificación, supresión, limitación, portabilidad y olvido, para más información, te dejo enlace a mi política de privacidad ... enlace