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 :

Structure du module sample

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);
 
}
}