Crear nuevos campos en el formulario de registro

Hola amigos, hoy vamos a ver cómo crear nuevos campos en el formulario de registro con la plataforma Prestashop versión 1.7.2.x

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.

Crear nuevos campos en el formulario de registro

Para empezar diremos que hay algunos campos definidos en la plataforma los cuales podemos hacer obligatorios o no. Para ello debemos entrar en nuestro panel de administración e ir a Clientes -> Direciones.

Pero como esta entrada trata acerca de creación de nuevos campos, vamos a obviar el paso anterior y vamos a ir directamente a lo que toca 🙂

Primeros pasos creando un nuevo campo en el formulario de registro.

Lo primero que tenemos que hacer es ir abrir el siguiente script con nuestro editor de código favorito classes/form/CustomerFormatter.php

Si vamos a la función public function getFormat() podemos apreciar en este script que se están declarando todos los campos que podemos ver en el formulario de registro.

Ya que no es recomendable editar los scripts por defecto de Prestashop, vamos a crear un Override.

Recordemos que si no creamos Overrides y por ejemplo estamos trabajando sobre un módulo, al recibir una actualización de este, lo más probable es que perdamos los cambios realizados.

Trabajando sobre el Override classes/form/CustomerFormatter.php

Vamos al directorio override/classes/ y creamos un nuevo directorio form/ y también un nuevo script llamado como el original CustomerFormater.php. Desde este momento este script prevalecerá sobre el original.

Copiamos todo el código del CustomerFormater.php original y ahora sí, vamos a crear nuestro campo DNI.
Este es el trozo de código que debemos insertar justo en el método getFormat().

Tengamos en cuenta que dependiendo de dónde coloquemos este trozo de código el nuevo campo aparecerá más arriba o abajo en nuestro formulario.

$format['dni'] = (new FormField)
    ->setName('dni')
    ->setLabel(
        $this->translator->trans(
            'Dni', [], 'Shop.Forms.Labels'
        )
    )
    ->setRequired(true)
    ->addAvailableValue(
        'placeholder',
        '00000000A'
    )
    ->setMaxLength(9)
    ->addAvailableValue(
        'comment',
        '(Ejemplo: 00000000A)'
    )
;

Nosotros vamos a colocarlo justo debajo del campo Apellido quedando en nuestro código fuente así.

$format['lastname'] = (new FormField)
    ->setName('lastname')
    ->setLabel(
        $this->translator->trans(
            'Last name', [], 'Shop.Forms.Labels'
        )
    )
    ->setRequired(true)
;

$format['dni'] = (new FormField)
    ->setName('dni')
    ->setLabel(
        $this->translator->trans(
            'Dni', [], 'Shop.Forms.Labels'
        )
    )
    ->setRequired(true)
    ->addAvailableValue(
        'placeholder',
        '00000000A'
    )
    ->addAvailableValue(
        'comment',
        '(Ejemplo: 0000000A)'
    )
;

Recordemos que cada vez que creamos un nuevo Override debemos borrar la caché desde nuestro back-office para poder apreciar los cambios.

Explicando los valores del nuevo campo añadido en nuestro formulario de registro.

setName(‘dni’) :: valor name en nuestro input.
setLabel() :: Etiqueta.
setRequired(true) :: Campo obligatorio.
addAvailableValue() :: Añade otros valores como placeholder, comentario sobre un campo, etc.

Y esto es todo en nuestra entrada de hoy.
Puedes continuar con la entrada de validación de campos pulsando en este enlace: https://luisjordan.net/prestashop/manual-de-prestashop-1-7-comprobar-el-valor-de-los-campos-del-formulario-de-registro/

Versiones utilizadas, tiempo y dificultad de desarrollo:

Plataforma: Prestashop 1.7.2

37 comentarios en “Crear nuevos campos en el formulario de registro”

  1. Solo indicar que cuando haces un override, no tienes porque copiar todo el código del fichero original (lo digo porque en tu post comentas: «Copiamos todo el código del CustomerFormater.php original…»).

    Un override de una clase o controlador se usa para añadir en la mayoría de casos nuevas funcionalidades, por lo tanto para una mayor optimización se debe copiar solo lo necesario y no todo, y hacer las correspondientes ampliaciones.

    Pero bajo ningún concepto es recomendado copiarlo todo.

    Saludos,

    1. Hola Juan, antes de nada quería agradecer tu aporte.
      En este caso indiqué copiar el código completo en el override ya que vamos a modificar gran parte de el por no decir todo en futuros posts.
      De este modo facilitamos la explicación y la lectura para gente que está aprendiendo.
      Pero indico de nuevo que sí, lo correcto nunca es copiar un script completo.

      Saludos!

  2. Hola Luis,
    Ante todo agradecerte los aportes para que vayamos aprendiendo cosas muy importantes que nos interesan.
    Tengo un problema y es que después de haber hecho el override y modificado el formulario de creación de una cuenta al hacer click en el botón Enviar se me va a una pantalla en blanco, y no se porque puede ser.
    ¿Serías tan amable de ayudarme?.
    Saludos

    1. Hola Jose, por supuesto que te ayudo, para eso estamos.
      Vamos a ver…

      Tras crear el override, ¿has limpiado caché desde rendimiento de back-office?
      ¿Qué versión de Prestashop estás utilizando?
      ¿Has copiado el fichero en el override completo?, justo un comentario más arriba el compañero Juan indicaba que no es necesario copiar el script completo de la clase en el override, pero en mi caso y en la versión de Prestashop 1.7.2 si no lo copiaba completo me daba pantallazo blanco.

      Espero tus comentarios.
      Un abrazo!

      1. Hola Luis,

        Si limpie caché desde el back office, estoy utilizando la versión 1.7.2.4 de Prestashop en local, y sí que copié el fichero completo en el override.

        Un abrazo
        Gracias

          1. Hola Luis, perdona el retraso en la respuesta pero he estado liado con otras cosas.

            Al poner el modo debug a true me lanza el siguiente error:

            ContextErrorException in CustomerForm.php line 195: Notice: Undefined index: password

            in CustomerForm.php line 195
            at ErrorHandler->handleError(‘8’, ‘Undefined index: password’, ‘C:\xampp\htdocs\tienda\classes\form\CustomerForm.php’, ‘195’, array(‘clearTextPassword’ => null, ‘newPassword’ => null, ‘ok’ => false, ‘errors’ => array(‘Se requiere una contraseña’), ‘field’ => ‘password’)) in CustomerForm.php line 195
            at CustomerFormCore->submit() in AuthController.php line 62
            at AuthControllerCore->initContent() in Controller.php line 205
            at ControllerCore->run() in Dispatcher.php line 379
            at DispatcherCore->dispatch() in index.php line 28

            A ver te comento, yo lo que quiero es que al crear la cuenta un usuario no pueda poner él la contraseña, sino que mande una serie de datos (nombre, apellidos, empresa, CIF/DNI y email) a un correo y yo le dé una contraseña de acceso, creo que por ahí viene el problema del error que me lanza.

            Reitero mi agradecimiento por tu interés.

            Saludos.

          2. Hola Jose, no te preocupes por la tardanza, yo también ando super liado.
            En nuestra profesión es lo más normal jeje.

            Veamos, yo lo que haría en tu caso es poner esos campos como hidden para que el usuario no los vea en el registro (le pones un texto para que sepa de que va la cosa). Y pasaría un value por defecto en el campo password (de este modo evitarías el error). Seguidamente, haría una función que compusiera el password con esos valores que me indicas. Y por último haría un UPDATE sobre el campo password y enviaría el correo.

            Dime si de este modo te vale.
            Saludos!

          3. Hola Luis, feliz año ante todo, no tiene mucho que ver sobre lo que te consulté que creo que ya lo conseguí, pero me atrevo a preguntarte una duda que tengo y es si sabes si existe la posibilidad en Prestashop 1.7, de que puedan registrarse 2 clientes con el mismo email, realmente lo que tengo pensado es que el mismo cliente tenga 2 cuentas distintas con el mismo email pero con 2 contraseñas distintas, para distinguir la compra con o sin recargo de equivalencia.

            Gracias por orientarnos en tus comentarios y perdona las molestias

          4. Hola Jose, a día de hoy Prestashop no nos permite registrar 2 cuentas con la misma dirección de correo electrónico.
            Si intentas realizar el registro con una cuenta existente, obtendrás el siguiente mensaje.

            La dirección de correo electrónico «luisjordan1979@gmail.com» ya está en uso, por favor, elija otra para iniciar sesión o registrarse.

  3. Buenas, he seguido los pasos indicados (crear copia de CustomerFormater.php y modificar la misma) para agregar el teléfono sin resultado (no muestra el campo en el formulario).
    adjunto el código que añadí posterior a «lastname»
    $format[‘tlfn’] = (new FormField)
    ->setName(‘tlfn’)
    ->setLabel(
    $this->translator->trans(
    ‘Telefono’, [], ‘Shop.Forms.Labels’
    )
    )
    ->setRequired(true)

    ;

    ¿he hecho algo mal?

    1. Hola Antonio, he añadido el trozo de código que me has indicado y el nuevo campo aparece en el formulario sin problemas.

      Te pregunto lo mismo que a Jose…
      ¿Qué versión de Prestashop utilizas?
      ¿Limpiaste caché tras crear el override?

      Un abrazo!

  4. Hola Luis tu idea me vale, de hecho es la que estaba intentando realizar pero no sé como hacerlo.

    El campo contraseña ya está oculto en el formulario.

    Lo que no se hacer es pasar un value por defecto en el campo password.

    Gracias
    Saludos!

  5. Muchas gracias por esta guía, me ha sido de ayuda. Estoy buscando también la forma de añadir campos extra al formulario de contacto en prestashop 1.7.2. He encontrado para versiones anteriores pero no me funcionan en la 1.7 ¿Sabes dónde puede haber información o tienes alguna guía de como hacerlo? Gracias.

    1. Hola Serafín, actualmente no tengo ninguna entrada explicando la necesidad que tienes, pero a ver si pronto saco un rato entre tanto trabajo y la creo.
      Saludos!

      1. Hola Luis, Esta guía aun esta disponible? 2019, Estoy utilizando la versión 1.7.4.4. He realizado lo mismo pero no me sale nada. es como no hubiera realizado ningún cambio.

        1. Hola Toni, así es, todo depende de la versión de Prestashop que utilices.
          De todos modos, te recomiendo que descargues el módulo de registro ampliado que ofrezco.

          Saludos,

    1. Hola tocayo… disculpa pero no entiendo muy bien tu pregunta.
      ¿Te refieres a dónde llegan los mails o a donde puedes ver estos contactos desde backoffice?

      Lo que puedes ver desde el back-office de Prestashop 1.7 es una especie de log de qué usuarios te contactaron haciendo uso de los formularios de contacto. Para ello ve a Parámetros avanzados -> Dirección de correo electrónico.

      1. Gracias por la respuesta. El caso puntual es el siguiente:
        Cree en el formularió el camo C.C. Los clientes que se registran lo diligencian pero no se donde prestashop guarda esa información pues en modulos – Clientes no muestra el campo creado.

        1. Hola Luis, aquí el tema es que tu guardas el registro en la base de datos, pero en la consulta del back-office no está ese nuevo campo y por ello no te lo muestra. Deberías tocar el controlador correspondiente y el .tpl

  6. Hola Luis, muchas gracias por el tutorial, una pregunta, en que tabla guarda el campo DNI? He mirado en ps_customer y no lo veo.

    Gracias

  7. Hola, uso prestashop 1.7.4 hice todo y me muestra el campo DNI en mi registro pero:
    1. cuando hago el registro y le doy depsues editar ifnromación me lo muestra en blanco.
    2. cuando ingreso a el administrador para ver los clientes no tiene este campo guardado.
    3. esto si lo manda a la base de datos o hace falta hacer algo más?

    1. Hola Nayith, contesto a cada uno de tus puntos:
      1 – No debería, debería aparecer el DNI, comprueba que lo estás recuperando de tu db.
      2 – Es normal que no esté el campo visible, si está registrado pero no hemos modificado la parte de administración, solo la de front-end.
      3 – Así es, lo registra directamente en bbdd.

      Te recomiendo que revises esta entrada: https://luisjordan.net/prestashop/crear-campos-de-direccion-en-el-formulario-de-registro/

  8. Hola buenas tardes. Muy bueno el aporte, estoy con este problema desde hace días. Me gustaría saber si esto que estas explicando es aplicable tal cual esta en la explicación para la versión de prestashop 1.7.6.1

    Saludos

    1. Hola Ezequiel, para la versión de Prestashop funciona igual.
      Es más, tengo un módulo que está a la venta por 50€ que lo hace todo y funciona perfectamente en la versión 1.7.6.x
      Si estás interesado, contáctame utilizando mi formulario de contacto.
      Saludos.

  9. Hola Luis,

    Muchas gracias por todo tu trabajo. Estoy intentando descargar el módulo pero me indica que el enlace no está disponible. ¿Es posible que lo vuelvas a subir?

    Gracias de antemano,

    Mario

  10. Hola Luis, en el foro de PS he realizado una pregunta pero creo que nadie la ha visto y ando ‘atorado’ (https://www.prestashop.com/forums/topic/1037748-formulario/?tab=comments#comment-3289017) , tengo un formulario con todos los inputs, lo que deseo es que solo muestre el correo y validar si existe o no , si no existe ya, mostrar los demás inputs para continuar con el registro, espero leas esto y puedas ayudarme, de antemano Gracias, saludos

Deja 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: Nicalia 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

Ir arriba