PrestaShop 1.6 propose comme sur les anciennes versions de la solution e-commerce une page particulière contenant un formulaire de contact. Ce formulaire suffit dans la plupart des cas mais il faut souvent le modifier / ajouter des champs pour répondre au besoin des projets.
Tuto : Modifier le formulaire de contact de PrestaShop 1.6
Par défaut, PrestaShop propose un formulaire de contact simple et efficace sans besoin d’intégration particulière. Voici une capture d’écran du formulaire par défaut :
Le formulaire de contact de PrestaShop 1.6 permet de recevoir les infos de base des clients. On peut en revanche vouloir d’autres informations comme le prénom et nom du client, la société, le téléphone en tant que champs obligatoires. On peut aussi supprimer la fonction d’envoi de fichiers et le champ référence.
Modifier le template du formulaire de contact
On travaille ici le thème Défault-Bootstrap de PrestaShop 1.6.1.6 pour l’exemple mais le travail est valable pour toutes les version 1.6 de PrestaShop.
Suppression des champs inutiles
On ne peut pas utiliser les champs “référence” et “envoi de fichiers”. On ouvre le fichier contact-form.tpl du thème et on commente l’affichage des champs en Smarty via les accolades / étoiles : {* code commenté *}
Pour enlever le champ référence de commande du formulaire de contact :
Toujours dans le fichier contact-form.tpl on va ajouter le nouveau champ “téléphone” par exemple. Voici le code du fichier contact-form.tpl après ajout du champ après l’envoi de fichier qui est désormais masqué :
Le controller du formulaire de contact de PrestaShop définit les champs à traiter, les champs obligatoires et fait le lien avec les variables Smarty. Il faut copier le fichier /controllers/front/ContactController.php et le coller dans /override/controllers/front/ContactController.php.
Il faut copier tout le contenu du fichier en modifiant la première ligne comme suit :
class ContactController extends ContactControllerCore
Il faut également supprimer totalement les fonctions suivantes :
public function setMedia() protected function assignOrderList() protected function getOrder()
Test et contrôle des nouveaux champs
Dans le fichier ContactController.php la fonction postProcess vérifie que les champs sont remplis correctement avant d’envoyer le contenu du formulaire. Si les champs sont obligatoires (comme dans l’exemple), il faut ajouter les conditions correspondantes à présent.
Voici le contenu du controller après ajout du contrôle du champ téléphone ajouté :
public function postProcess() { if (Tools::isSubmit('submitMessage')) { $extension = array('.txt', '.rtf', '.doc', '.docx', '.pdf', '.zip', '.png', '.jpeg', '.gif', '.jpg'); $file_attachment = Tools::fileAttachment('fileUpload'); $message = Tools::getValue('message'); // Html entities is not usefull, iscleanHtml check there is no bad html tags. if (!($from = trim(Tools::getValue('from'))) || !Validate::isEmail($from)) { $this->errors[] = Tools::displayError('Invalid email address.'); } elseif (!$message) { $this->errors[] = Tools::displayError('The message cannot be blank.'); } elseif (!Validate::isCleanHtml($message)) { $this->errors[] = Tools::displayError('Invalid message'); } elseif (!($id_contact = (int)Tools::getValue('id_contact')) || !(Validate::isLoadedObject($contact = new Contact($id_contact, $this->context->language->id)))) { $this->errors[] = Tools::displayError('Please select a subject from the list provided. '); } else if (!($contact_telephone = trim(Tools::getValue('contact_telephone'))) || (!($contact_telephone = nl2br2($contact_telephone)))) { $this->errors[] = Tools::displayError('Veuillez renseigner le téléphone.'); } elseif (!empty($file_attachment['name']) && $file_attachment['error'] != 0) { $this->errors[] = Tools::displayError('An error occurred during the file-upload process.'); } elseif (!empty($file_attachment['name']) && !in_array(Tools::strtolower(substr($file_attachment['name'], -4)), $extension) && !in_array(Tools::strtolower(substr($file_attachment['name'], -5)), $extension)) { $this->errors[] = Tools::displayError('Bad file extension'); } else { [...]
Toujours dans la fonction postProcess, il faut modifier la condition if (!count($this->errors)) par :
Dans le cas où les champs obligatoires ne sont pas remplis à la validation du formulaire, alors il faut que les champs conservent les valeurs précédemment saisies. On va éditer le fichier ContactController.php encore une fois dans la fonction initContent(), repérer la condition $this->context->smarty->assign(array( et la modifier par :
public function initContent() { parent::initContent(); $this->assignOrderList(); $email = Tools::safeOutput(Tools::getValue('from', ((isset($this->context->cookie) && isset($this->context->cookie->email) && Validate::isEmail($this->context->cookie->email)) ? $this->context->cookie->email : ''))); $this->context->smarty->assign(array( 'errors' => $this->errors, 'email' => $email, 'fileupload' => Configuration::get('PS_CUSTOMER_SERVICE_FILE_UPLOAD'), 'max_upload_size' => (int)Tools::getMaxUploadSize() )); if (($id_customer_thread = (int)Tools::getValue('id_customer_thread')) && $token = Tools::getValue('token')) { $customer_thread = Db::getInstance()->getRow(' SELECT cm.* FROM '._DB_PREFIX_.'customer_thread cm WHERE cm.id_customer_thread = '.(int)$id_customer_thread.' AND cm.id_shop = '.(int)$this->context->shop->id.' AND token = \''.pSQL($token).'\' '); $order = new Order((int)$customer_thread['id_order']); if (Validate::isLoadedObject($order)) { $customer_thread['reference'] = $order->getUniqReference(); } $this->context->smarty->assign('customerThread', $customer_thread); } $this->context->smarty->assign(array( 'contacts' => Contact::getContacts($this->context->language->id), 'message' => html_entity_decode(Tools::getValue('message')), 'contact_telephone'=>Tools::getValue('contact_telephone') )); $this->setTemplate(_PS_THEME_DIR_.'contact-form.tpl'); }
Modifier les e-mails du formulaire de contact de PrestaShop 1.6
Les e-mails dans PrestaShop sont sous deux formats : txt et html. Il faut modifier les deux formats aussi on modifie /mails/fr/contact.html et /mails/fr/contact.txt comme l’exemple.
Modification du template e-mail au format txt :
[{shop_url}] Message de la part d'un client de {shop_name} ADRESSE E-MAIL DU CLIENT : {email} MESSAGE DU CLIENT : {message} TELEPHONE : {contact_telephone} {shop_name} [{shop_url}] propulsé par PrestaShop(tm) [http://www.prestashop.com/]
6 commentaires sur “Tuto : Modifier le formulaire de contact sous PrestaShop 1.6”
bonjour Arnaud, j’ai bien suivi tout le tuto, mais la variable ne fonctionne pas à la réception du mail.
J’ai aussi bien vidé tout les caches.
J’ai bien vérifié point par point.
Je suis sou 1.6.1
Merci pour ton aide
Bonjour Regis,
Impossible pour moi de corriger car cela peut provenir de nombreux facteurs.
Je vous invite à reprendre de zéro et de bien vider le cache.
Bonjour,
Je voudrais réaliser ce tuto mais j’utilise Prestashop 1.7 .. Malheureusement il n’y a pas les fonctions :
public function setMedia()
protected function assignOrderList()
protected function getOrder()
dans le controller : /controllers/front/ContactController.php
Pouvez vous m’aider à adapter votre tuto pour la version 1.7 de Prestashop ?
Bonjour Laura,
C’est un sujet complexe car le fonctionnement n’est pas le même entre PrestaShop 1.6 et 1.7.
Je note l’idée pour un futur tuto PrestaShop mais en attendant je vous conseille un module formulaire de contact déjà développé qui vous fera gagner pas mal de temps 😉
Bonjour et merci pour ton tuto.
j’ai effectué les modifications mais ma page contact est vide maintenaint 🙁
j’ai certainement fait un erreur.
je suppose que c’est ici:
Test et contrôle des nouveaux champs
Dans le fichier ContactController.php la fonction postProcess (c’est bien le fichier ContactController.php present dans le dossier /override/controllers/front/ ) qu’il faut modifier??
ou bien /controllers/front/ContactController.php ??
merci d’avance
Luigi
Bonjour Lupis,
Attention à bien vider les caches déjà.
Si page blanche il faut afficher les erreurs ; un article est disponible sur le blog pour cela 😉
bonjour Arnaud, j’ai bien suivi tout le tuto, mais la variable ne fonctionne pas à la réception du mail.
J’ai aussi bien vidé tout les caches.
J’ai bien vérifié point par point.
Je suis sou 1.6.1
Merci pour ton aide
Bonjour Regis,
Impossible pour moi de corriger car cela peut provenir de nombreux facteurs.
Je vous invite à reprendre de zéro et de bien vider le cache.
Bonjour,
Je voudrais réaliser ce tuto mais j’utilise Prestashop 1.7 .. Malheureusement il n’y a pas les fonctions :
public function setMedia()
protected function assignOrderList()
protected function getOrder()
dans le controller : /controllers/front/ContactController.php
Pouvez vous m’aider à adapter votre tuto pour la version 1.7 de Prestashop ?
Bonjour Laura,
C’est un sujet complexe car le fonctionnement n’est pas le même entre PrestaShop 1.6 et 1.7.
Je note l’idée pour un futur tuto PrestaShop mais en attendant je vous conseille un module formulaire de contact déjà développé qui vous fera gagner pas mal de temps 😉
Bonjour et merci pour ton tuto.
j’ai effectué les modifications mais ma page contact est vide maintenaint 🙁
j’ai certainement fait un erreur.
je suppose que c’est ici:
Test et contrôle des nouveaux champs
Dans le fichier ContactController.php la fonction postProcess (c’est bien le fichier ContactController.php present dans le dossier /override/controllers/front/ ) qu’il faut modifier??
ou bien /controllers/front/ContactController.php ??
merci d’avance
Luigi
Bonjour Lupis,
Attention à bien vider les caches déjà.
Si page blanche il faut afficher les erreurs ; un article est disponible sur le blog pour cela 😉