Prestashop 1.4 : Créer un controller Front Office pour un module

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.4 +

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

 

 

5 réflexions sur “Prestashop 1.4 : Créer un controller Front Office pour un module”

  1. 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.

  2. 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

    1. 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é

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.