Ajouter un menu dans le backoffice pour vos modules prestashop

Je vais vous présenter une manière différente de mettre en place un vrai espace d’administration pour vos modules prestashop, car je trouve, le menu configuré des modules prestashop par défaut, pas très pratique.
Il oblige à se rendre dans la partie module, puis de rechercher notre module et ensuite de cliquer sur le bouton configure pour enfin réussir à changer nos paramètres. De plus, la construction de l’interface de configuration des modules est vraiment très mal pensée, même si dans les dernières versions, Prestashop nous propose des ViewHelper.

Si votre module est un peut complexe ou que vous souhaitez offrir un agencement de bloc différent de ce que l’équipe de prestashop a prévu, vous allez devoir mélanger du HTML dans des string php toutes moches qui seront imbitables lors de la maintenance 6 mois plus tard.

Il existe toutefois une alternative plus élégante et plus simple : créer un controller d’administration. Vous profitez ainsi des ViewHelper de prestashop mais vous avez également la possibilité d’utiliser des vues smarty pour l’affichage, ce qui est, vous l’avouerez, plus agréable à développer, lire et maintenir.

Mise en place du menu en backoffice

Je pars du postula que vous avez déjà votre module de créer ainsi qu’un contoller d’administration (vous pouvez lire cette article ci ce n’est pas le cas). Pour ma part, le nom du module sera guestbook et mon controller sera AdminGuestbook.

Si vous ne savez pas comment créer un controller sous prestashop, vous pouvez lire l’article dédié sur le site de prestarocket.

Maintenant nous allons éditer la méthode install() de notre module pour rajouter ceci (ou dans une méthode externe):

// On récupère l'id de l'onglet principale, ici le menu "Clients"
$id_parent = Tab::getIdFromClassName('AdminParentCustomer');

// On récrée le nouvel onglet
$adminTab = new Tab();

// On ajoute pour chaque langue un libellé de menu (optionnel)
$languages = Language::getLanguages(true);
$adminTab->name = array();

foreach($languages as $lang)
    $adminTab->name[$lang->id] = (('fr' == $lang->iso_code) ? 'Livre d\'or' : 'Guest Book');
// On spécifie la class du controller (sans le mot clé controller)
$adminTab->class_name = 'AdminGuestbook';
// On spécifié également le nom du module
$adminTab->module = 'guestbook';
// On indique l'id du menu principal
$adminTab->id_parent = $id_parent;
// On l'active
$adminTab->active = true;
// Et on indique de le placer en dernière position 
$adminTab->position = Tab::getNbTabs($id_parent);

if(!$adminTab->save())
    return false;
// On enregistre ensuite l'id de l'onglet pour pouvoir le désintaller automatiquement
Configuration::updateValue('ADMIN_TAB_MODULE_GUESTBOOK', $adminTab->id);
return true;

Ce code est je pense assez simple et les commentaires vous aident si vous n’avez pas compris 😉

Pour la désinstallation rien de bien compliqué, on fait le processus inverse :

// On récupère l'id de l'onglet
$adminTabId = Configuration::get('ADMIN_TAB_MODULE_GUESTBOOK');

// On vérifie qu'il n'est pas déjà déinstallé
if(Tab::existsInDatabase($adminTabId, Tab::$definition['table']))
{
    // On l'instancie...
    $adminTab = new Tab($adminTabId);
    // Puis on le supprime
    if(!$adminTab->delete())
        return false;

    // Et enfin on supprime la configuration qui n'est plus utile
    return Configuration::deleteByName('ADMIN_TAB_MODULE_GUESTBOOK');
}

return true;

J’espère que cette technique vous inspira pour créer des modules avec des vrais espaces d’administration propre et clair.