• Home
  • Nous contacter

Le blog d'Adfab

Le blog d'Adfab

Le blog d'Adfab

Le blog d'Adfab
e-Commerce

Module Prestashop | épisode 2

Dans un précédent article, nous avons vu comment créer un module et avons été en mesure de l’installer et le désinstaller sans avoir surchargé les méthodes install() et unistall(). Cependant vous allez devoir surcharger ces méthodes dès que vous souhaitez :

  • Lier des actions à des Hooks prestashop ;
  • Rajouter ou modifier la structure de tables dans la base de données ;
  • Ajouter ou supprimer un onglet du menu de l’admin prestashop ;
  • Ajouter des configurations à l’installation de votre module.

Les méthodes install() et uninstall()

Dans les méthodes install() et uninstall(), on va appeler un certain nombre d’opérations que l’on souhaite réaliser soit à l’installation soit à la désinstallation du module et on va tester si toutes les opérations ce sont bien déroulées. Si c’est le cas on retourne true, un message de ce type apparaîtra alors dans le back-office.

  success

Sinon, on retourne false et c’est ce type de message qui apparaîtra.

fail

Lier des actions à des Hooks prestashop

Afin de pouvoir rattacher des actions de votre module à un Hook Prestashop, il va vous falloir déclarer les Hooks en question au moment de l’installation du module. Cela se fait à l’aide de la méthode registerHook(). Pour chaque Hook que vous souhaitez utiliser par la suite pour y « greffer » des actions de votre module, vous devez ajoutez le code suivant dans la fonction install() :

/* déclaration de l'utilisation du Hook myNewHook */
$this->registerHook('myNewHook');

La fonction renvoie true si l’enregistrement a fonctionné, false sinon. Vous pourrez trouver la liste des Hooks disponibles dans prestashop à partir de 1.5 sur  la doc officielle.

En l’état, il ne se passe rien au déclenchement des hooks enregistré. Pour définir un comportement pour votre module au déclenchement des hooks enregistrés il vous faudra pour chacun définir une méthode de ce type :

/* Comportement au déclenchement du hook "myNewHook" */
public function hookMyNewHook ($params) {

}

dans laquelle vous définirez ce que doit faire votre module au déclenchement du hook concerné.

Rajouter ou modifier la structure de tables dans la base de données

Vous pouvez avoir besoin d’enregistrer des données en base de données, voir même d’ajouter vos propres tables à la base.  Afin d’ajouter et retirer les tables de mon module de la base de données, j’ai ajouté les 2 méthodes :    installDb() et uninstallDb(). Pour ma part, j’ai également choisi la solution de placer le code SQL dans un fichier à part. J’ai donc créé un fichier sql_install.php retournant un tableau avec pour chaque entrée :  en clé le nom de la table et en valeur le code SQL permettant de créer celle-ci.

Cela m’a permi d’automatiser le processus de création et suppression des tables. Voici donc la définition des méthodes installDb() et uninstallDb() :

/* Création des tables */
public function installDb()
{
    $return = true;
    include(dirname(__FILE__).'/sql_install.php');
    foreach ($sql as $s)
        $return &= Db::getInstance()->execute($s);
    return $return;
}

/* Suppression des tables */
public function uninstallDb()
{
    include(dirname(__FILE__).'/sql_install.php');
    foreach ($sql as $name => $v)
        Db::getInstance()->execute('DROP TABLE '.$name.' ;');
    return true;
}

Astuces :

–  Préparez dès le départ votre module pour le multilinguisme en séparant les champs traduisibles de ceux qui ne le sont pas. La méthode habituelle sur Prestashop consiste a créer une table « prefix_my_table », dans laquelle on sauvera les champs non traduisibles et un id pour chaque entrée, ainsi qu’une table « prefix_my_table_lang » qui contiendra sur chaque ligne l’id de l’objet, l’id de la langue dans laquelle on traduit ainsi que la traduction dans cette langue des champs traduisibles.

– La variable globale _DB_PREFIX_ contient le préfixe défini dans la config pour les tables de la base de données.

Ajouter ou supprimer un onglet du menu de l’admin prestashop

Il est courant pour un module d’avoir une interface de configuration dans le back office. Souvent, on accède à celle-ci en cliquant sur un lien nommé « configurer » et présent sur la présentation du module dans la liste des tous les modules, comme c’est le cas dans l’exemple ci-dessous.

 configure_link

 Si l’on souhaite avoir ce type de fonctionnement, il faudra alors implémenter la méthode getContent() dans la classe de votre module, celle-ci devra renvoyer le contenu de la page de configuration.

Une autre solution consiste à créer un ou plusieurs controller pour gérer l’administration du module. On aura alors la possibilité d’ajouter un lien vers notre page d’administration directement dans le menu du back-office.

Pour cette deuxième solution, commencez par créer un dossier controllers à la racine de votre module, puis créez un dossier admin dans celui-ci. C’est dans ce dossier « admin » que vous allez créer un fichier php qui contiendra la classe de votre controller. Le fichier devra porter le même nom que la classe du controller, sans le mot clé « Controller » à la fin.

Pour pouvoir ajouter un lien vers l’interface liée à ce controller dans le menu prestashop, il vous faudra inclure le fichier AdminTab.php. Voici ce à quoi va ressembler la définition la plus simple du controller.

include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');

class AdminCarouselController extends ModuleAdminController
{

    public function __construct()
    {        
        parent::__construct();
        $this->context = Context::getContext();
    }
}

Dans la classe de votre module, vous allez alors pouvoir créer 2 méthodes pour respectivement ajouter et supprimer un onglet dans le menu de l’admin prestashop : addAdminTab() et removeAdminTab()  dont voici la définition :

// Ajout d'onglet
public function addAdminTab()
{
    // création de l'onglet
    $tab = new Tab();
    foreach(Language::getLanguages(false) as $lang)
        $tab->name[(int) $lang['id_lang']] = 'Carousel';
    // Nom du controller sans le mot clé "Controller"
    $tab->class_name = 'AdminCarousel';
    $tab->module = $this->name;
    $tab->id_parent = 15;
    if (!$tab->save())
        return false;
    return true;
}

// Suppression d'onglets
public function removeAdminTab()
{
    $classNames = array('admin_carousel' => 'AdminCarousel');
    $return = true;
    foreach ($classNames as $key => $className) {
        $tab = new Tab(Tab::getIdFromClassName($className));
        $return &= $tab->delete();
    }
    return $return;
}

La propriété id_parent va déterminer la position du lien dans le menu. Ici, par exemple, l’onglet sera dans la liste des sous-menus du menu « Modules ».

Voici les ids des autres menus principaux de l’admin (dans prestashop 1.5) :

  • 9 – Catalogue
  • 10 – Commandes
  • 11 – Clients
  • 12 – Promotions
  • 13 – Transport
  • 14 – Localisation
  • 15 – Modules
  • 16 – Préférences
  • 17 – Paramètres avancés
  • 18 – Administration
  • 19 – Statistiques

Tel qu’il l’a été fait ici, après l’installation, un onglet ‘Carousel’ apparaîtra dans le menu déroulant du menu « Modules ». Cependant, en l’état, si on clique dessus, on atterira  sur une page blanche car le template n’a pas été créé. Il sera nécessaire d’ajouter des méthodes à la classe de notre controller pour permettre l’affichage et le traitement d’un formulaire.

Voici donc pour exemple la définition finale des méthodes install() et uninstall() de mon module :

public function install()
{
    if (!parent::install() ||
        !$this->registerHook('displayTop') ||
        !$this->registerHook('header') ||
        !$this->installDb() ||
        !$this->addAdminTab())
            return false;
        return true;
}

public function uninstall()
{
    if (!parent::uninstall() ||
        !$this->uninstallDb() ||
        !$this->removeAdminTab())
            return false;
        return true;
}

A vous de jouer maintenant !

27/08/2014 50 MIN READ BY: Stéphanie FAURE 0 COMMENT
SHARE
LIRE LA SUITE

Stéphanie FAURE

Wordpress, quelques codes utiles - Épisode 2

Apprendre le Javascript en s’amusant

VOUS POURRIEZ AIMER

e-Commerce L'actualité AdFab Magento : Outfit, animation de votre site e-commerce par vos clients.

CMS e-Commerce Woocommerce : Ajouter des coûts administrables pour un produit

e-Commerce Module Prestashop | Les classes outils

e-Commerce Les widgets dans Magento

e-Commerce Créer un script shell dans Magento

CMS e-Commerce WordPress E-commerce ? avec woocommerce c’est possible !

A propos d’Adfab

Nous sommes un studio de production digitales et d’innovation digitales au service des agences et des annonceurs
Nous recherchons le scintillement dans les regards et le plaisir de réalisations sur-performantes
Nous sommes techno-agnostiques
Nous sommes Adfab

Le blog d'Adfab
Copyright © 2018 Adfab Connect