Tuto : Modifier le formulaire de contact sous PrestaShop 1.6
Arnaud Merigeau
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/]