Architecture d’un module Prestashop

Un module Prestashop suit une structure précise. Respecter cette convention garantit la compatibilité avec les mises à jour et le marketplace.

mycustommodule/
├── mycustommodule.php          # Fichier principal
├── config.xml                   # Configuration
├── controllers/
│   ├── admin/                   # Controllers back-office
│   └── front/                   # Controllers front-office
├── views/
│   └── templates/
│       ├── admin/               # Templates back-office
│       ├── front/               # Templates front-office
│       └── hook/                # Templates de hooks
├── classes/                     # Classes métier
├── sql/                         # Scripts SQL
└── translations/                # Traductions

Chez Lueur Externe, nous développons des modules Prestashop sur mesure en respectant scrupuleusement cette architecture.

Le système de hooks

Les hooks sont le mécanisme central d’extension de Prestashop. Il en existe deux types :

Hooks d’affichage (display)

Ils permettent d’injecter du contenu HTML dans le front-office :

public function hookDisplayHeader($params)
{
    $this->context->controller->addCSS($this->_path . 'views/css/front.css');
    $this->context->controller->addJS($this->_path . 'views/js/front.js');
}

public function hookDisplayProductAdditionalInfo($params)
{
    $product = $params['product'];
    $this->context->smarty->assign([
        'custom_data' => $this->getCustomData($product['id_product']),
    ]);
    return $this->display(__FILE__, 'views/templates/hook/product-info.tpl');
}

Hooks d’action

Ils réagissent aux événements du système :

public function hookActionProductUpdate($params)
{
    $productId = (int) $params['id_product'];
    // Synchroniser avec un ERP externe
    $this->syncWithErp($productId);
}

public function hookActionOrderStatusPostUpdate($params)
{
    $order = new Order($params['id_order']);
    if ($params['newOrderStatus']->id == Configuration::get('PS_OS_SHIPPING')) {
        $this->sendTrackingNotification($order);
    }
}

Controllers personnalisés

Front controller

// controllers/front/display.php
class MyCustomModuleDisplayModuleFrontController extends ModuleFrontController
{
    public function initContent()
    {
        parent::initContent();
        $this->context->smarty->assign([
            'items' => $this->module->getItems(),
        ]);
        $this->setTemplate('module:mycustommodule/views/templates/front/display.tpl');
    }
}

Admin controller

// controllers/admin/AdminMyCustomController.php
class AdminMyCustomController extends ModuleAdminController
{
    public function __construct()
    {
        $this->table = 'my_custom_table';
        $this->className = 'MyCustomClass';
        $this->bootstrap = true;
        parent::__construct();
    }
}

Bonnes pratiques

  • Toujours utiliser les méthodes Db::getInstance() pour les requêtes SQL
  • Valider et échapper toutes les entrées utilisateur avec pSQL() et (int)
  • Utiliser le système de traduction $this->l('...')
  • Implémenter les méthodes install() et uninstall() proprement
  • Tester sur Prestashop 1.7 et 8 pour la compatibilité

Conclusion

Le développement de modules Prestashop demande une connaissance approfondie de l’architecture de la plateforme. Lueur Externe développe des modules sur mesure, performants et maintenables pour ses clients e-commerce.