Créer un module Prestashop moderne nécessite de maîtriser les bonnes pratiques de développement, l'architecture MVC et les standards de codage PSR-12. Ce guide vous accompagne pas à pas dans la création d'un module professionnel et maintenable.
1. Structure de base d'un module
Un module Prestashop moderne suit une architecture précise. Commençons par créer la structure de fichiers de notre module.
monmodule/
├── monmodule.php // Fichier principal
├── config.xml // Configuration
├── logo.png // Logo du module (82x82px)
├── index.php // Protection du dossier
├── controllers/
│ ├── front/ // Contrôleurs front-office
│ └── admin/ // Contrôleurs back-office
├── views/
│ ├── templates/
│ │ ├── admin/ // Templates admin
│ │ └── front/ // Templates front
│ ├── css/
│ └── js/
├── translations/
└── sql/
├── install.php
└── uninstall.php
2. Le fichier principal du module
Le fichier principal hérite de la classe Module et définit les propriétés essentielles du module.
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class MonModule extends Module
{
public function __construct()
{
$this->name = 'monmodule';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Votre Nom';
$this->need_instance = 0;
$this->ps_versions_compliancy = [
'min' => '1.7.8.0',
'max' => '8.99.99'
];
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Mon Module');
$this->description = $this->l('Description du module');
$this->confirmUninstall = $this->l('Êtes-vous sûr de vouloir désinstaller ce module ?');
}
}
3. Installation et désinstallation
Les méthodes install() et uninstall() gèrent le cycle de vie du module. C'est ici qu'on enregistre les hooks et crée les tables de base de données si nécessaire.
public function install()
{
return parent::install()
&& $this->registerHook('displayHeader')
&& $this->registerHook('actionProductUpdate')
&& $this->createTables();
}
public function uninstall()
{
return parent::uninstall()
&& $this->deleteTables();
}
private function createTables()
{
$sql = 'CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'monmodule_data` (
`id_data` INT(11) NOT NULL AUTO_INCREMENT,
`id_product` INT(11) NOT NULL,
`custom_field` VARCHAR(255) NOT NULL,
`date_add` DATETIME NOT NULL,
`date_upd` DATETIME NOT NULL,
PRIMARY KEY (`id_data`)
) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8;';
return Db::getInstance()->execute($sql);
}
4. Utilisation des hooks
Les hooks permettent d'injecter du code à des moments précis du cycle de vie de Prestashop. Respectez la convention de nommage hookNomDuHook.
public function hookDisplayHeader()
{
// Ajouter CSS et JS
$this->context->controller->addCSS($this->_path . 'views/css/monmodule.css');
$this->context->controller->addJS($this->_path . 'views/js/monmodule.js');
}
public function hookActionProductUpdate($params)
{
$idProduct = (int)$params['id_product'];
// Votre logique métier
Db::getInstance()->update(
'monmodule_data',
['date_upd' => date('Y-m-d H:i:s')],
'id_product = ' . $idProduct
);
}
5. Configuration du module
Créez une page de configuration pour permettre aux marchands de personnaliser le comportement de votre module.
public function getContent()
{
$output = '';
if (Tools::isSubmit('submitMonModuleConfig')) {
$configValue = Tools::getValue('MONMODULE_CONFIG');
if (empty($configValue)) {
$output .= $this->displayError($this->l('Valeur invalide'));
} else {
Configuration::updateValue('MONMODULE_CONFIG', $configValue);
$output .= $this->displayConfirmation($this->l('Configuration sauvegardée'));
}
}
return $output . $this->displayForm();
}
private function displayForm()
{
$fieldsForm = [
'form' => [
'legend' => [
'title' => $this->l('Configuration'),
],
'input' => [
[
'type' => 'text',
'label' => $this->l('Configuration'),
'name' => 'MONMODULE_CONFIG',
'required' => true
]
],
'submit' => [
'title' => $this->l('Enregistrer'),
]
]
];
$helper = new HelperForm();
$helper->submit_action = 'submitMonModuleConfig';
$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
. '&configure=' . $this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->fields_value['MONMODULE_CONFIG'] = Configuration::get('MONMODULE_CONFIG');
return $helper->generateForm([$fieldsForm]);
}
6. Utilisation des requêtes avec DbQuery
Utilisez toujours DbQuery pour construire vos requêtes SQL de manière sécurisée et éviter les injections SQL.
public function getProductData($idProduct)
{
$query = new DbQuery();
$query->select('*')
->from('monmodule_data')
->where('id_product = ' . (int)$idProduct);
return Db::getInstance()->getRow($query);
}
public function getAllActiveData()
{
$query = new DbQuery();
$query->select('md.*, pl.name as product_name')
->from('monmodule_data', 'md')
->leftJoin('product_lang', 'pl', 'md.id_product = pl.id_product')
->where('pl.id_lang = ' . (int)Context::getContext()->language->id)
->orderBy('md.date_add DESC');
return Db::getInstance()->executeS($query);
}
7. Respect du PSR-12
Suivez les standards de codage PSR-12 pour garantir la lisibilité et la maintenabilité de votre code.
- Utilisez le camelCase pour les méthodes et variables
- Respectez l'indentation avec 4 espaces
- Placez les accolades ouvrantes sur la même ligne pour les méthodes
- Typez vos paramètres et valeurs de retour
- Documentez vos méthodes avec des DocBlocks
/**
* Récupère les données d'un produit
*
* @param int $idProduct ID du produit
* @return array|false Données du produit ou false
*/
public function getProductData(int $idProduct)
{
$query = new DbQuery();
$query->select('*')
->from('monmodule_data')
->where('id_product = ' . (int)$idProduct);
return Db::getInstance()->getRow($query);
}
8. Gestion des traductions
Rendez votre module multilingue en utilisant la méthode l() pour tous vos textes.
// Dans le module
$this->l('Texte à traduire');
// Les fichiers de traduction seront générés automatiquement
// dans translations/fr.php, translations/en.php, etc.
9. Tests et validation
Avant de publier votre module, assurez-vous qu'il respecte les standards Prestashop :
- Testez sur Prestashop 1.7 et 8.x
- Utilisez le validator de modules Prestashop
- Vérifiez les performances avec le profiler
- Testez l'installation/désinstallation plusieurs fois
- Validez la compatibilité multilingue et multi-boutique
10. Bonnes pratiques avancées
Pour un module professionnel, allez plus loin :
- Utilisez des Services pour isoler la logique métier
- Implémentez des Repository pour la gestion des données
- Utilisez l'injection de dépendances quand c'est possible
- Créez des Commands Symfony pour les tâches planifiées
- Ajoutez des logs avec PrestaShopLogger
- Gérez les erreurs proprement avec des try/catch
Conclusion
Créer un module Prestashop moderne demande de la rigueur et le respect des standards. En suivant ces bonnes pratiques, vous développerez des modules performants, maintenables et conformes aux attentes de la communauté Prestashop.
Besoin d'aide pour développer un module sur mesure ? Contactez-moi pour discuter de votre projet !