1.4 1.6 1.7.7 1.7.8 8.0 8.1 +
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Dans sa version 1.4, la gestion des controllers front office des modules n’est pas aussi optimisée que sur les versions suivantes.
Malgré tout cette version reste encore assez utilisée sur des anciennes boutiques.
Voici donc comment créer « proprement » un module qui disposera d’un controller front office.
Par proprement j’entends un module qui déposera les fichiers nécessaires aux bons emplacements, et qui peut être désinstallé sans laisser de traces 🙂
Le nom du module sera « sample » et sa structure sera la suivante :
Les contenus des fichiers css,js et tpl n’ayant pas d’importance je ne détaillerais pas leur contenu. ( il s’appelleront respectivement sample.css , sample.js et sample.tpl )
Voici le contenu du fichier de gestion du module « sample.php »
C’est dans ce fichier via les fonction _installModuleController et _uninstallModuleController que le controller Front office du module est bien installé ou supprimé
<?php if (!defined('_PS_VERSION_')) exit; class Sample extends Module { /** Nom de la page Front Office du module */ private $_module_page_name = 'sample_front_office_page'; public function __construct() { $this->name = "sample"; $this->tab = "others"; $this->version = '0.1.0'; $this->author = "Hennes Herve"; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->l("Sample Module"); $this->description = $this->l("Sample module with front controller"); } /** * Installation du module */ public function install() { //Installation Standard du module if (! parent::install()) return false; //Installation du controller Front du module if ( !$this->_installModuleController()) return false; return true; } /** * Désinstallation du module */ public function uninstall() { if (!parent::uninstall() || !$this->_uninstallModuleController() ) return false; } /** * Installation du controller Front Office du Module */ private function _installModuleController() { //Copie du fichier front Office if (!copy(dirname(__FILE__) . '/' . $this->_module_page_name . '.php', dirname(__FILE__) . '/../../' . $this->_module_page_name . '.php')) return false; //Création des balises meta de la page pour la redirection ( $meta = new Meta(); $meta->page = $this->_module_page_name; $languages = Language::getLanguages(); //Ces éléments sont à adapter suivant votre configuration foreach ($languages as $lang) { $meta->title[$lang['id_lang']] = 'Titre de la page'; $meta->description[$lang['id_lang']] = 'Description de la page'; $meta->keywords[$lang['id_lang']] = 'Keywords de la page'; $meta->url_rewrite[$lang['id_lang']] = 'url-page'; } return $meta->save(); } /** * Désinstallation du controller Front Office du Module */ private function _uninstallModuleController() { if ( is_file(dirname(__FILE__) . '/../../' . $this->_module_page_name . '.php') ) unlink(dirname(__FILE__) . '/../../' . $this->_module_page_name . '.php'); else return false; $id_meta = Db::getInstance()->getValue("SELECT id_meta FROM "._DB_PREFIX_."meta WHERE page='".$this->_module_page_name."'"); if ( !$id_meta ) return false; $meta = new Meta($id_meta); return $meta->delete(); } } ?> |
Voici le contenu de la page Front Office « sample_front_office_page.php » qui sera copiée à la racine du site par le module et qui sera appellée par les visiteurs du site.
<?php /** * Page FO qui sera copiée automatiquement à la racine du site lors de l'installation du module */ //Inclusion du fichier de config et du fichier de controller de notre module require(dirname(__FILE__).'/config/config.inc.php'); include_once(dirname(__FILE__).'/modules/sample/controllers/SampleFrontController.php'); //Instanciation et lancement du Controller Module $controller = new SampleFrontController(); $controller->run(); ?> |
Voici le contenu du controller front Office « SampleFrontController.php » qui va gérer (contenu + traitement ) la page front office
<?php /** * FIchier controller */ class SampleFrontController extends FrontController { /** Nom du fichier php front office */ public $php_self = 'sample_front_office_controller.php'; /** * Ajout des Css / Js */ public function setMedia() { parent::setMedia(); //Css et Js Spécifiques au module avec gestion des surcharges dans le theme if (is_file(_THEME_CSS_DIR_ . 'modules/sample/samples.css')) Tools::addCSS(_THEME_CSS_DIR_ . 'modules/sample/samples.css'); else Tools::addCSS(_MODULE_DIR_ . 'sample/views/css/samples.css'); if (is_file(_THEME_JS_DIR_ . 'modules/sample/sample.js')) Tools::addJS(_THEME_JS_DIR_ . 'modules/sample/sample.js'); else Tools::addJS(_MODULE_DIR_ . 'sample/views/js/sample.js'); } /** * Traitement des données de la page */ public function process() { parent::process(); //Envoi des informations au template self::$smarty->assign('data', 'test'); } /** * Affichage du contenu de la page */ public function displayContent() { parent::displayContent(); //Gestion de la surcharge des templates du module if (is_file(_PS_THEME_DIR_ . 'modules/sample/sample.tpl')) $tplFile = _PS_THEME_DIR_ . 'modules/sample/sample.tpl'; else $tplFile = _PS_MODULE_DIR_ . 'sample/views/sample.tpl'; self::$smarty->display($tplFile); } } |
Bonjour,
J’ai suivi votre tuto qui est très bien expliqué et détaillé.
J’ai une erreur:
Fatal error: Class ‘FrontController’ not found
lorsque j’essaie d’appeler ma page.
Cordialement.
Bonjour,
Quelle est votre version de Prestashop ?
Ce message est peu être le signe que le fichier du controller n’accède pas bien aux fichiers de config.
J’ai trouvé mon erreur j’ai confondu
sample_front_office_controller.php
avec le controller.
Merci
Bonjour,
c’est quoi la solution dans ce cas? je veux dire si le fichier du controller n’accède pas bien aux fichiers de config.
Car j’obtiens la même erreur et pour tant j’utilise le bon fichier.
Merci par avance
Bonjour,
Il faut vérifier que votre fichier est bien placé au bon endroit.
Et vérifier que le chemin d’inclusion du fichier de configuration existe réellement.
Quelle est la version de prestashop utilisée ?
Cordialement,
Hervé