Cómo añadir campos personalizados al checkout de PrestaShop 8 (sin módulos de pago)

Cómo añadir campos personalizados al checkout de PrestaShop 8 (sin módulos de pago)
Solucionex
30
Abr 25

A veces, una tienda necesita más datos del cliente: número de identificación, preferencias de entrega, aceptación de condiciones específicas, etc. Aunque existen módulos que lo permiten, hoy aprenderás a hacerlo manualmente, de forma 100% gratuita y profesional usando las herramientas nativas de PrestaShop 8.


🧩 ¿Qué vamos a hacer?

  • Añadir un campo extra al formulario de checkout (por ejemplo, "Número de Identificación").

  • Validarlo y guardarlo en la base de datos.

  • Mostrarlo en el back-office en el pedido.

  • Todo sin módulos externos.


🛠️ Paso 1: Crear override del formulario de checkout

En PrestaShop 8, el formulario de checkout se construye en Symfony. Para modificarlo, debes crear un override de formulario.

📁 Ruta:

/override/classes/checkout/CheckoutAddressesStep.php

📄 Contenido:

<?php
use Symfony\Component\Form\Extension\Core\Type\TextType;
class CheckoutAddressesStepOverride extends CheckoutAddressesStep
{
    public function handleRequest(array $requestParams = [])
    {
        $this->stepForm->add('dni_extra', TextType::class, [
            'label' => 'Número de identificación',
            'required' => false,
        ]);
        return parent::handleRequest($requestParams);
    }
}

⚠️ Asegúrate de limpiar la caché después de crear el override (php bin/console cache:clear).


💾 Paso 2: Guardar el campo en la base de datos

Hay varias formas de hacerlo. La más sencilla y segura es usar campos personalizados en la tabla ps_address.

📁 Hook para guardar el dato:

En tu módulo, usa el hook actionSubmitCustomerAddressForm:

public function hookActionSubmitCustomerAddressForm($params)
{
    $address = new Address($params['id_address']);
    if (Tools::getValue('dni_extra')) {
        $address->other = pSQL(Tools::getValue('dni_extra'));
        $address->update();
    }
}

⚠️ En este ejemplo se guarda el campo en other, pero puedes añadir una columna propia con una override si lo necesitas.


👁️ Paso 3: Mostrar el campo en el back-office

El campo other ya aparece en la ficha del pedido, pero si quieres mostrarlo en otro lugar personalizado, puedes usar el hook:

 public function hookDisplayAdminOrderMainBottom($params)
{
    $order = new Order((int) $params['id_order']);
    $address = new Address($order->id_address_delivery);
    return '<div><strong>DNI Extra:</strong> ' . htmlentities($address->other) . '</div>';
}

🧪 Paso 4: Probar el resultado

  1. Borra caché (var/cache/ o consola).

  2. Ve al checkout.

  3. Rellena el campo adicional.

  4. Finaliza el pedido.

  5. Ve al back-office y verifica el valor guardado.


🧠 ¿Y si quiero más campos?

Puedes repetir el mismo patrón para más campos: añadirlos al formulario, capturarlos desde Tools::getValue() y guardarlos en Address, Customer o una tabla personalizada.


📌 Conclusión

Añadir campos personalizados al checkout de PrestaShop 8 es posible sin usar módulos de pago. Solo necesitas saber cómo trabaja Symfony con los formularios y usar los hooks correctos.