Récemment
-
Problème configuration php valeurs max-imput-vars
Bugs & Améliorations il y a environ 12 heures5 -
Nouvelle installation : erreur sur les ajouts d'images
Questions relatives à l'installation/upgrade il y a environ 2 jours11 -
Problème de lien vers tpl module custom
PhenixSuite il y a environ 9 jours3 -
Modification sur le thème "Craft"
Questions relatives à l'installation/upgrade 9 avr. 2025, 14:103 -
Installation avec Wamp
Questions relatives à l'installation/upgrade 9 avr. 2025, 13:531 -
date_upd produits
Bugs & Améliorations 24 mars 2025, 19:3013 -
Champ description longue pour les catégories
Modules 22 mars 2025, 16:315 -
Erreurs suite à la mise à jour
Questions relatives à l'installation/upgrade 17 mars 2025, 09:1910 -
Module personnalisation de produit
Modules 5 mars 2025, 13:113 -
Theme non fonctionnel - après MAJ de la Phenixsuite 1.6.2.32
Questions relatives à l'installation/upgrade 27 févr. 2025, 10:2113 -
TinyMCE
Bugs & Améliorations 16 févr. 2025, 18:202 -
Déclinaisons virtuelles avec fichiers
PhenixSuite 14 févr. 2025, 17:4610 -
[RESOLU]Lien téléchargement dans le mail
Discussion générale 14 févr. 2025, 17:436 -
[RESOLU]RGPD
Modules 10 févr. 2025, 17:035 -
Compatibilité des modules
Discussion générale 8 févr. 2025, 17:532 -
[RESOLU]Bug page Préférences Produits
Bugs & Améliorations 7 févr. 2025, 13:254 -
htaccess chatouilleux ?
Bugs & Améliorations 5 févr. 2025, 16:5814 -
Installation depuis boutique 1.6.1.17
Questions relatives à l'installation/upgrade 5 févr. 2025, 13:0819 -
[RESOLU]Module réassurance, permettre le html
Modules 31 janv. 2025, 14:154 -
Des modules et des hacks - liste non exhaustive des modules présentant un risque
Discussion générale 12 déc. 2024, 14:1517
Créer un contrôleur front (indépendant)
-
Il arrive de devoir créer un contrôleur front office pour y implémenter une logique particulière.
Ici nous allons faire juste cela, totalement indépendant d'un module.pré-requis
accès FTP
notepad++
5 minutes
le contrôleur
Nous allons créer le contrôleur. Nous pouvons le mettre directement dans le répertoire /controllers/front mais au cas où demain ne devions écraser notre prestashop, nous allons préférer le mettre dans /override/controllers/front. En plus de cette manière il est plus simple d'identifier à posteriori quel code a été ajouté.
Nous devons impérativement dériver d'un FrontController, mais il est tout a fait possible de dériver un contrôleur qui en dérive. Supposons ici ContactController.
/override/controllers/front/ContactControllerExtra.php<?php class ContactControllerExtra extends ContactController { public $php_self = 'contact-extra'; }
Vidons le cache (avec la gomme) ou supprimons le fichier /cache/class_index.php
Oui c'est tout faire un contrôleur n'est pas compliqué. Mais bon soyons clair c'est pour l'instant une coquille vide.Avant d'aller plus loin nous allons le configurer coté back-office afin que nous puissions lui donner une belle url et un minimum de décence coté SEO.
SEO & URL
Dans le BO, rendons nous dans Préférences > SEO&URL
Cliquer ajouter, et remplir- page: choisir contact-extra
- titre: Contact étendu
- description: Page de contact avancée
- mots clé: vide
- url: contact-avance
Enregistrer
Voila, vous pouvez/devez customiser les paramètres en fonction des langues afin qu'ils correspondent à vos besoins
Le code utile
Jusque maintenant nous n'avons qu'une coquille vide qui se contente de faire en tout point ce que fait le formulaire de contact. Écrivons un peu de code utile. Nous allons mettre en place un captcha très simple.
Reprenons notre fichier contrôleur
/override/controllers/front/ContactControllerExtra.php<?php class ContactControllerExtra extends ContactController { public $php_self = 'contact-extra'; private function trivial_captcha() { return (int)($this->context->cookie->id_guest); } public function postProcess() { if (Tools::isSubmit('submitMessage')) { $captcha = Tools::getValue('captcha',0); if (!$captcha || $captcha != $this->trivial_captcha()) { $this->errors[] = Tools::displayError('Invalid captcha.'); return; } } return parent::postProcess(); } }
Nous venons de créer un contrôle lors de la réception du formulaire et de vérifier que ce formulaire contient un captcha et que celui-ci est valide.
Si nous essayons notre contrôleur maintenant nous obtenons systématiquement une erreur "Invalid captcha" lors de l'envoi du formulaire.
la vue
Nous devons bien sûr construire un template permettant la saisie du captcha. Pour cela nous allons "bêtement" copier le template normal, puis nous ajouterons notre code à l'intérieur
Copions /themes/<votre-theme>/contact-form.tpl => /themes/<votre-theme>/contact-form-extra.tpl
Éditons maintenant ce fichier et identifions où mettre notre code<div class="col-xs-12 col-md-9"> <div class="form-group"> <label for="message">{l s='Message'}</label> <textarea class="form-control" id="message" name="message">{if isset($message)}{$message|escape:'html':'UTF-8'|stripslashes}{/if}</textarea> </div> {* ***** Nous allons mettre notre code ICI ***** *} {hook h='displayGDPRConsent' moduleName='contactform'} </div> </div> <div class="submit"> <input type="text" name="url" value="" class="hidden" /> <input type="hidden" name="contactKey" value="{$contactKey}" /> <button type="submit" name="submitMessage" id="submitMessage" class="button btn btn-default button-medium"><span>{l s='Send'}<i class="icon-chevron-right right"></i></span></button> </div>
Voici le code à mettre:
<div class="form-group"> <label for="captcha">{l s='Captcha'}</label> <input name="captcha" type="text" /> <span class="captcha-help">{l s='Please enter this number in the captcha field'}: {$captval}</span> </div>
Pour l'instant cette étape ne change rien.
En effet nous devons maintenant câbler la vue pour que le contrôleur l'appelle.
On air
Enfin la dernière étape.
Nous devons simplement appeler notre vue (le template) et nous aurons un contrôleur complet.Revenons dans le contrôleur.
/override/controllers/front/ContactControllerExtra.php<?php class ContactControllerExtra extends ContactController { public $php_self = 'contact-extra'; private function trivial_captcha() { return (int)($this->context->cookie->id_guest); } public function postProcess() { if (Tools::isSubmit('submitMessage')) { $captcha = Tools::getValue('captcha',0); if (!$captcha || $captcha != $this->trivial_captcha()) { $this->errors[] = Tools::displayError('Invalid captcha.'); return; } } return parent::postProcess(); } public function initContent() { parent::initContent(); $this->context->smarty->assign(array( 'captval' => $this->trivial_captcha(), )); $this->setTemplate(_PS_THEME_DIR_.'contact-form-extra.tpl'); } }
Il ne vous reste plus qu'a faire quelques réglages css, les traductions et vous avez terminé.
Bien joué