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.
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…
Índice
¿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.
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.
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
solucionado … gracias
Hola Rodrigo, ¿puedes compartir con nosotros qué originó el problema y cómo lo solucionaste?
Un saludo!
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
y ahora me da este error:
UndefinedMethodException in CustomerForm.php line 193:
Attempted to call an undefined method named «getAddress1MaxLengthViolationMessage» of class «CustomerForm».
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
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.
¿Revisaste la clase que te indiqué?
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.
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.
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.
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!
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’)
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!
Buenos días Sr. Jordan
He leído sus tres post referentes a crear un campo de captura en los formularios de registro en Prestashop, para el ejemplo el campo dni (o Cédula de Ciudadanía aquí en Colombia), soy nuevo en el tema de ecommerce y estoy desarrollando (sin ser desarrollador) mi tienda en PS1.7.6.2.
Me asalta una duda en respecto a la función
…
public function submit()
{
if ($this->validate()) {
…
dentro de mi php customerformatter.php no lo ubico, en cual ruta puedo hallar esa función? con el fin de entender y aplicar las validaciones necesarias para la captura de la identificación del cliente
Mil gracias por su tiempo
Cordial Saludo
Rafael Gallardo
Colombia
Hola Luis Muchas Gracias por este aporte! Vale lo que pesa!! Lo acabo de adaptar en Prestashop 1.7.6 Y todo funciona OK. Pero… Estoy tratando de incorporar el campo en el BackOffice (panel de administración) para cuando registre usuarios o modifique datos de los clientes desde allí, en los foros de Prestashop encontré que en la versión 1.7.2 se puede lograr haciendo overraide en controllers/admin/AdminCustomersController.php pero en la versión 1.7.6 no consigo ese controlador. Puedes ayudarme a lograr esto?
De antemano gracias, y felicitaciones por tu POST esta genial!
Hola Ruth, el core de la versión 1.7.6 es muy diferente a versiones anteriores.
La verdad es que de momento, no me he metido a tocarlo, espero durante las próximas semanas hacerlo.
Buen post… Excelente, te felicito. Me gustó mucho. Pero tengo una duda:
¿Para validar un rut chileno (los valores), cómo le podría hacer? Porque tengo entendido que esta «fórmula» es sólo para validar la Longitud, y el Formato de un DNI. Pero, ¿y si quisiera validar si efectivamente el rut o el dni ingresado existe, es real, o es válido? Porque cualquiera podría ingresar, por ejemplo: 12345678B, o 123.456.78-9 y se lo aceptaría. Y a nivel de registro, ese rut o número de documento es inválido, no existe ese número en el registro.
Saludos y muchas gracias de antemano,
Esta todo muy bien. Considero que hay algo muy importante que se pasa por alto y es verificar la cuenta de correo electrónico para evitar que alguien entre en nuestros formularios de contacto y suscripción y el servidor nos envie basura de la gente que introduce cuentas de correo inexistentes o falsas
Gracias por el aporte Ramiro.
Buenos días,
He entrado en este post aunque nuestro caso es un poco «el contrario».
Somos una floristería que estamos terminando de pulir nuestra tienda online con Prestashop 1.7.6.7.
De los datos a solicitar para las direcciones de envío, queremos quitar los campos (o al menos su obligatoriedad) del número de identificación fiscal/DNI.
Accediendo desde el apartado Clientes-direcciones, quitamos la obligatoriedad del DNI pero sigue exigiéndolo para poder seguir con la compra.
Desde el apartado Ubicaciones geográficas-España, quitamos la necesidad de número de identificación fiscal, y entonces al hacer una prueba, ya no me sale el campo de DNI pero al continuar con la compra me sale ERROR 500
«la propiedad Address -> está vacía»
¿Sabéis por qué puede ser?
Muchísimas gracias de antemano