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
Borra caché (
var/cache/
o consola).Ve al checkout.
Rellena el campo adicional.
Finaliza el pedido.
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.