Pour créer un module,

  • On commence par créer un dossier de nom le nom du module, par exemple ‘mymodule’
  • Créer un fichier mymodule.php dans le dossier mymodule
  • Le nom de la classe class MyModule extends Module
Le constructeur :
public function __construct() {
       $this->name 		= 'mymodule';
       $this->tab 		  = 'front_office_features';
       $this->version 		= 1.0;
       $this->author 		= 'Tarek Fellah';
       $this->displayName 	= $this->l(‘My first module’);
       $this->description 	= $this->l(‘My module description’);
       $this->bootstrap = true ;	
       parent :: __construct();
}
  • $this->name doit prendre comme valeur le nom du module dans ce cas ‘mymodule’
  • $this->tab, c’est l’onglet dans la page modules dans lequel le module va s’afficher
  • $this->displayName c’est le nom qui va s’afficher dans la page des modules
  • $this->description : la description du module
  • $this->bootstrap = true ; pour activer bootstrap dans la page de configuration du module
La fonction install

Dans cette fonction, on appelle la fonction install de la classe mère, aussi on peut appeler, éventuellement, les fonctions de création de tables utilisées dans le module,

Aussi dans cette fonction on enregistre les hooks, Par exemple si on veut afficher du contenu dans la page d’accueil (hook displayHome), la colonne de droite, la colonne de gauche, les onglets de produits,...

Aussi si on veut appeler des fichiers js ou css dans le module dans ce cas on appelle le hook header dans les pages front et actionAdminControllerSetMedia dans les pages back.

Dans cette fonction aussi, on peut affecter des valeurs par défaut aux variables de configuration Par la fonction Configuration::updateValue('MY_MODULE_NB_PRDS', '4') ;

On peut faire des copies de fichiers/dossiers.

La fonction uninstall

Cette fonction s’exécute lors la désinstallation d’un module, dans cette fonction, on peut supprimer les tables mysql créés lors de l’install, reset des variables de configuration.

L’architecture d’un module

Un module peut contenir les dossiers/fichiers suivants :

  • Le fichier principale du module, my_module.php dans lequel il y a les méthodes d’install, désinstall, définir le nom du module, l’appel des hooks (d’affichage et d’actions), construire, eventuellement, la page de configuration du module, l’assignement des variables utilisés dans les fichiers tpl, ...
  • Dossier models, contenant les classes spécifiques au module, ils correspondent au mapping des tables mysql propres au module, la définition des attributs (même noms des champs de la table mysql correspondante), définition des méthodes qu’on a besoin dans les controlleurs
  • Dossier /views/templates/front  contenant les pages tpl du front office.
  • Dossier /views/templates/admin contenant les pages tpl et helpers du back office
  • Dossier /views/templates/hook contenant les fichiers tpl des hooks (les positions de Prestashop)
  • Dossier /views/css contenant les fichiers css du module
  • Dossier /views/js contenant les fichiers js du module
  • Dossier /views/img contenant les fichiers images du module
  • Dossier /override contient les fichiers d’override
  • Dossier controllers/front contient les contrôleurs du front office
  • Dossier controllers/back contient les contrôleurs back office
  • Dossier /translations contient les fichiers de traduction 
La création de la page de configuration

Pour la page de configuration, on doit appeler la fonction getContent, qui affiche le formulaire de configuration et enregistre ses variables dans la table configuration.

public function getContent(){
       $output = null;
       if (Tools::isSubmit('submit'.$this->name)){  //   if(isset($_POST[‘submit’]) 
              $my_module_name = intval(Tools::getValue('MY_MODULE_NUM_CMS'));
                     if (!$my_module_name || empty($my_module_name) || !is_numeric($my_module_name))
                           $output .= $this->displayError($this->l('Invalid num cms value'));
                     else{
                           Configuration::updateValue('MY_MODULE_NUM_CMS', $my_module_name);
                           $output .= $this->displayConfirmation($this->l('Settings updated'));
                     }
       }
       return $output.$this->displayForm();
}

La fonction getContent est une fonction pour enregistrer les variables de configuration et elle retourne un message (ou bien les variables sont enregistrés ou bien il y a une erreur). 
Tools::isSubmit est une fonction pour vérifier si le formulaire de configuration a été validé, si ce n’est pas le cas le formulaire va s’afficher vide,Tools::getValue c’est une fonction relative à Prestashop qui recupère le contenu du tableau GET et POST retourné par le formulaire.
displayError est une fonction de la classe Module qui affiche un message d’erreur, avec le styling css correspondant (box en rouge).l est une fonction qui gère la traduction des chaines de caractères, Si il n’ y a pas d’erreur, on va enregistrer la variable de configuration 'MY_MODULE_NUM_CMS' dans la table configuration avec la méthode Configuration::updateValue avec la valeur de la variable $my_module_name. Ensuite on va afficher un message de validation avec la fonction displayConfirmation qui retourne le code html adéquat (box en vert) en enresitrant dans la variable $output. Enfin on appelle la fonction displayForm, cette fonction va créer le code html du formulaire.

La fonction displayForm
public function displayForm(){
      $default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
      $fields_form[0]['form'] = array(
            'legend' => array(
            'title' => $this->l('Settings'),
            ),
            'input' => array(
                  array(
                       'type' => 'text',
                       'label' => $this->l('Configuration value'),
                       'name' => 'MY_MODULE_NUM_CMS',
                       'size' => 20,
                       'required' => true
                  )
             ),
            'submit' => array(
                  'title' => $this->l('Save'),
                  'class' => 'button'
            )
      );
      $helper = new HelperForm();

      $helper->module = $this;
      $helper->name_controller = $this->name;
      $helper->token = Tools::getAdminTokenLite('AdminModules');
      $helper->currentIndex =  AdminController::$currentIndex.'&configure='.$this->name;
      $helper->default_form_language = $default_lang;
      $helper->allow_employee_form_lang = $default_lang;
      $helper->title = $this->displayName;
      $helper->show_toolbar = true;        // false -> remove toolbar
      $helper->toolbar_scroll = true;      // yes -> Toolbar is always visible on the top of the screen.
      $helper->submit_action = 'submit'.$this->name;
      $helper->toolbar_btn = array(
           'save' =>                  array(
                       'desc' => $this->l('Save'),
                       'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.
                           '&token='.Tools::getAdminTokenLite('AdminModules'),
                  ),
                  array(
                      'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
                      'desc' => $this->l('Back to list')
                 )
           );
     $helper->fields_value['MYMODULE_NAME'] = Configuration::get('MYMODULE_NAME');
     return $helper->generateForm($fields_form);
}

On va clarifier le code ci dessus,

'input' => array(
      array(
           'type' => 'text',
           'label' => $this->l('Configuration value'),
           'name' => 'MY_MODULE_NUM_CMS',
           'size' => 20,
           'required' => true
      )
)

Le code ci dessus c'est pour créer un champs texte,

  • Type :peut avoir comme valeur 'text', 'select', 'textarea', 'radio', 'checkbox', 'file', 'shop', 'asso_shop', 'free', 'color'
  • Label : c’est le label du champs
  • Name : C’est le nom du champs (utilisé pour le traitement du formulaire),
  • Size : C’est la taille du champs
  • Required : champs booléen obligatoire (oui ou non)
  • Pour plus de détails voir ce lien http://doc.prestashop.com/display/PS16/Using+the+HelperForm+class
'submit'=> array(
    'title'=> $this->l('Save'),
    'class'=> 'btn btn-default pull-right'
)

C’est le champs submit du formulaire

$helper->currentIndex  // c’est l’url de la page de configuration, lors du click sur configurer dans la page des modules
$helper->submit_action // doit avoir l’attribut action pour la balise <submit> du formulaire.
$helper->toolbar_btn  // c’est pour afficher les boutons enregistrer et retour en bas de la page
$helper->fields_value['MYMODULE_NAME'] = Configuration::get('MYMODULE_NAME'); //C’est pour afficher la valeur enregistrée de la variable de configuration, s’elle n’a pas de valeur elle affiche un champs vide.
Les Hooks

Dans le module, on a enregistré 2 hooks, une pour l’appel des fichiers js et css actionAdminControllerSetMedia et une pour l’affichage du contenu d’une page CMS dans la page d’acceuil displayHome 

public function hookActionAdminControllerSetMedia(){
$num_cms = Tools::getValue('MY_MODULE_NUM_CMS');
    if($num_cms){
        $cms = new CMS($num_cms);
        $id_lang = $this->context->language->id;
        $contenu = $cms->content[$id_lang];
    } else
        $contenu = $this->l('Num CMS non assigné');
    $this->smarty->assign(
        array(
            'contenu' => $contenu
        )
    );
    return $this->display(__FILE__, 'mymodule.tpl');
}

Cette fonction va afficher le contenu de la page CMS (num à configurer) dans la page d'accueil.

Finalement, on créé le fichier mymodule.tpl dans views/templates/hook, et mettre dedans 

{$contenu}
Conclusion 

Pour la création d'un module hook en Prestashop 1.6, on doit enregistrer les hook correspondants dans la fonction install pour assigner des posotions au module, créer les fonctions de hooks pour assigner des variables smarty et appler le fichier TPL qui devrait être créé à l'avance.J'espère que j'étais le plus clair possible, n'hésitez pas à commenter si vous avez des questions.

Top