Ajouter un champ personnalisé au formulaire d'inscription PrestaShop
Guide complet pour ajouter un champ personnalisé (ex : case majeur) au formulaire de création de compte PrestaShop avec validation et message d'erreur custom.
En bref : Pour ajouter un champ personnalisé (comme une case 'majeur') au formulaire d'inscription PrestaShop, il faut modifier la base de données, déclarer le champ dans l'objet Customer, override le contrôleur AuthController pour la validation et le message d'erreur, puis ajouter le HTML dans le template — sur PrestaShop 8.x, privilégiez un module avec les hooks Symfony plutôt qu'un override.
Pourquoi ajouter un champ personnalisé à l'inscription ?
Certaines obligations légales ou métier imposent de collecter des informations supplémentaires lors de la création de compte. L'exemple classique : une case à cocher confirmant que l'utilisateur est majeur, un numéro SIRET pour une boutique B2B, ou encore un code parrainage.
PrestaShop ne propose pas cette fonctionnalité nativement. Il faut intervenir sur trois niveaux : la base de données, le contrôleur d'authentification et le template du formulaire. Voyons comment procéder proprement sans toucher au cœur de PrestaShop.
Étape 1 : Ajouter la colonne en base de données
Avant toute chose, la table ps_customer doit pouvoir stocker la nouvelle donnée. Exécutez cette requête SQL via phpMyAdmin ou en ligne de commande :
ALTER TABLE `ps_customer`
ADD COLUMN `majeur` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0
AFTER `newsletter`;
Pour une installation propre, cette requête devrait se trouver dans le fichier install.sql de votre module ou dans la méthode install() si vous créez un module dédié.
Étape 2 : Déclarer le champ dans l'objet Customer
PrestaShop utilise son ORM interne (la classe ObjectModel) pour mapper les colonnes SQL aux propriétés PHP. Sans cette déclaration, l'objet Customer ignorera purement et simplement votre nouveau champ.
Créez un override de la classe Customer :
// override/classes/Customer.php
class Customer extends CustomerCore
{
/** @var bool Confirmation de majorité */
public $majeur;
public function __construct($id = null)
{
// Déclarer le champ dans la définition ObjectModel
self::$definition['fields']['majeur'] = [
'type' => self::TYPE_BOOL,
'validate' => 'isBool',
];
parent::__construct($id);
}
}
Point critique : sans cette déclaration, même si vous assignez $customer->majeur = 1 dans le contrôleur, la valeur ne sera jamais persistée en base. L'ORM de PrestaShop ne sauvegarde que les champs déclarés dans $definition['fields'].
Étape 3 : Override du contrôleur AuthController
C'est ici que la magie opère. Le formulaire d'inscription est traité par la méthode processSubmitAccount() du contrôleur AuthController. Le flux est le suivant :
- `postProcess()` détecte le submit via `Tools::isSubmit('submitAccount')`
- Il appelle `processSubmitAccount()`
- Cette méthode crée l'objet `Customer`, assigne les valeurs et appelle `$customer->add()`
- soit la déclaration dans `$definition['fields']` de l'objet Customer,
- soit l'assignation `$customer->majeur = $majeur` dans le contrôleur,
Voici l'override nécessaire :
// override/controllers/front/AuthController.php
class AuthController extends AuthControllerCore
{
protected function processSubmitAccount()
{
// Récupérer la valeur du champ personnalisé
$majeur = (int) Tools::getValue('majeur');
// Validation personnalisée AVANT la création du compte
if (!$majeur) {
$this->errors[] = $this->trans(
'Vous devez confirmer être majeur pour créer un compte.',
[],
'Shop.Notifications.Error'
);
return;
}
// Appeler le traitement parent
parent::processSubmitAccount();
// Assigner le champ à l'objet Customer après sa création
if ($this->context->customer->id && empty($this->errors)) {
$this->context->customer->majeur = $majeur;
$this->context->customer->update();
}
}
}
Approche alternative (plus propre) avec un hook
Sur PrestaShop 1.7+ et 8.x, vous pouvez utiliser le hook actionBeforeSubmitAccount sans override :
// Dans votre module
public function hookActionBeforeSubmitAccount($params)
{
$majeur = (int) Tools::getValue('majeur');
if (!$majeur) {
$controller = Context::getContext()->controller;
$controller->errors[] = $this->l(
'Vous devez confirmer être majeur pour créer un compte.'
);
}
}
Cette approche est préférable car elle évite les overrides qui compliquent les mises à jour.
Étape 4 : Modifier le template du formulaire
PrestaShop 1.6 (Smarty)
Dans votre thème, éditez themes/votre-theme/authentication.tpl :
<div class="form-group">
<label for="majeur">
<input type="checkbox" name="majeur" id="majeur" value="1"
{if isset($smarty.post.majeur) && $smarty.post.majeur}checked{/if} />
Je certifie être âgé(e) de 18 ans ou plus *
</label>
</div>
PrestaShop 8.x (Twig / module de formulaire)
Sur PrestaShop 8.x, le système de formulaire client utilise Symfony. La méthode recommandée passe par un module qui étend le CustomerFormBuilder :
// src/Form/Extension/CustomerFormExtension.php
use PrestaShop\PrestaShop\Core\Form\FormHandlerInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class CustomerFormExtension
{
public function extend($formBuilder)
{
$formBuilder->add('majeur', CheckboxType::class, [
'label' => 'Je certifie être majeur(e)',
'required' => true,
]);
}
}
Étape 5 : Personnaliser le message d'erreur
Pour personnaliser les messages d'erreur affichés au client, plusieurs approches :
Via les traductions PrestaShop
Rendez-vous dans Localisation > Traductions > Modifier les traductions et sélectionnez le type "Traductions des messages d'erreur de la boutique". Recherchez votre message et modifiez-le.
Directement dans le code
Dans votre override ou module, utilisez le système de traduction :
// PrestaShop 1.6
$this->errors[] = Tools::displayError('Vous devez confirmer être majeur.');
// PrestaShop 1.7+
$this->errors[] = $this->trans(
'Vous devez confirmer être majeur pour créer un compte.',
[],
'Shop.Notifications.Error'
);
Bonnes pratiques et pièges courants
Erreur n°1 : Le champ n'est pas sauvegardé
C'est le piège le plus fréquent. Si vous ajoutez la colonne SQL et récupérez la valeur avec Tools::getValue() mais que vous oubliez :
la colonne restera à sa valeur par défaut. Les deux étapes sont indispensables.
Erreur n°2 : Override non détecté
Après avoir créé vos fichiers d'override, n'oubliez pas de vider le cache de PrestaShop. En développement :
# Supprimer le cache des classes
rm -rf var/cache/prod/class_index.php
rm -rf var/cache/dev/class_index.php
# Ou en PrestaShop 1.6
rm -rf cache/class_index.php
Erreur n°3 : Validation côté serveur absente
Ne vous fiez jamais à la validation JavaScript seule. Un utilisateur peut désactiver JavaScript ou manipuler la requête HTTP. Validez toujours côté serveur dans le contrôleur.
Récapitulatif technique
En respectant cette séquence, vous obtiendrez un champ personnalisé fonctionnel, validé côté serveur, avec un message d'erreur adapté à votre contexte métier.
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

Alexandre Carette
Expert PrestaShop & Architecture E-commerce
Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.