Prestashop : Les bases d’un module CRUD

Cet article va présenter comment créer un « module de test » pour prestashop. L’objectif étant d’avoir une base de code sur laquelle on pourra partir pour ensuite répondre à des demandes plus concrètes. Ce module va créer une table dans la base de donnée et ajouter un menu dans le tableau d’administration de prestashop. Lors du clic sur ce menu on aura la possibilité de lire la table correspondante, y insérer/modifier ou supprimer des lignes. (CRUD)

Cet article contiendra peu d’explications (en dehors des commentaires dans le code) car il va surtout me servir de référence pour de prochains articles. Vous pouvez aussi consulter cet artice (en anglais) un peu plus détaillé : https://www.amauri.eng.br/en/blog/2016/03/developing-a-simple-module-with-crud-for-prestashop/

Pour commencer nous créons dans le dossier « modules » de prestashop notre dossier « moduletest » et dans ce dossier le fichier « moduletest.php » suivant :

//pour éviter un accès direct à ce fichier.
if (!defined('_PS_VERSION_')) {
    exit;
}

//on appelle le fichier de ce module "/classes/ModuleTestTableTest.php" que l'on va créer dans la partie suivante.
require_once dirname(__FILE__) . '/classes/ModuleTestTableTest.php';

class Moduletest extends Module
{
    //constructeur du module avec les informations à personnaliser.
    public function __construct(){
        $this->name = 'moduletest';
        $this->tab = 'administration';
        $this->version = '0.1.0';
        $this->author = 'auteur de test';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = array('min' => '1.7', 'max' => _PS_VERSION_);

        parent::__construct();

        $this->displayName = $this->l('Nom du module de test');
        $this->description = $this->l('Description du module de test.');
    }

    //fonction d'installation du module
    public function install(){
        return parent::install() && $this->installSql() && $this->installTab();
    }

    //fonction de désinstallation du module
    public function uninstall(){
        return parent::uninstall() && $this->uninstallSql() && $this->uninstallTab();
    }

    //création de la table dans la base de données.
    protected function installSql(){
        $sqlCreate = "CREATE TABLE `" . _DB_PREFIX_ . ModuleTestTableTest::$definition["table"] . "` (
                `"
. ModuleTestTableTest::$definition["primary"] . "` int(11) unsigned NOT NULL AUTO_INCREMENT,
                `champ_varchar_test` varchar(255) DEFAULT NULL,
                `champ_date_test` DATETIME NOT NULL,
                `champ_int_test` int(11) unsigned NOT NULL,
                PRIMARY KEY (`"
. ModuleTestTableTest::$definition["primary"] . "`)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
;
        return Db::getInstance()->execute($sqlCreate);
    }

    //suppression de la table dans la base de données
    protected function uninstallSql(){
        $sql = "DROP TABLE " . _DB_PREFIX_ . ModuleTestTableTest::$definition["table"];
        return Db::getInstance()->execute($sql);
    }

    //création de l'onglet dans le menu de l'administration
    protected function installTab(){
        $tab = new Tab();
        $tab->class_name = 'AdminModuleTest';
        $tab->module = $this->name;
        $tab->icon = 'settings_applications';
        $tab->id_parent = (int) Tab::getIdFromClassName('DEFAULT');
        //
        $languages = Language::getLanguages();
        foreach ($languages as $lang) {
            $tab->name[$lang['id_lang']] = $this->displayName;
        }
        try {
            $tab->save();
        } catch (Exception $e) {
            echo $e->getMessage();
            return false;
        }

        return true;
    }

    //suppression de l'onglet dans le menu de l'admnistration.
    protected function uninstallTab(){
        $idTab = (int) Tab::getIdFromClassName('AdminModuleTest');
        if ($idTab) {
            $tab = new Tab($idTab);
            try {
                $tab->delete();
            } catch (Exception $e) {
                echo $e->getMessage();
                return false;
            }
        }
        return true;
    }
}

Créons maintenant le fichiers « /classes/ModuleTestTableTest.php » appelé au début du fichiers précédent. Ce fichier va hériter de « ObjectModel » de prestashop afin que l’on puisse gérer les données de façon « native » par la suite. Il va simplement servir à définir la table et les champs que notre module va ajouter à la base de données, et permettre ensuite de manipuler ces données.

//on définis les champs correspondant à ceux utilisé dans la fonction "installSql" du fichier "moduletest.php"
class ModuleTestTableTest extends ObjectModel {
    public $id;
    public $champ_varchar_test;
    public $champ_date_test;
    public $champ_int_test;
    public static $definition = array(
        'table' => 'module_test',
        'primary' => 'id_module_test',
        'multilang' => false,
        'fields' => array(
            'champ_varchar_test' => array(
                'type' => self::TYPE_STRING,
                'required' => true
            ),
            'champ_date_test' => array(
                'type' => self::TYPE_DATE,
                'required' => true
            ),
            'champ_int_test' => array(
                'type' => self::TYPE_INT,
                'required' => true
            ),
        )
    );
}

Il nous faut maintenant créer le « ModuleAdminControllerCore » nous permettant de gérer le données du module. Il nous faut créer le fichier « /controllers/admin/AdminModuleTest.php » (voir le nom indiqué dans les fonctions « installTab » et « uninstallTab » du fichier « moduletest.php ». Ce fichier hérite de « ModuleAdminControllerCore » et il nous reste peu de chose à faire pour que tout fonctionne :

//on appelle ici aussi notre classe "ObjectModel" que l'on va utiliser.
require_once _PS_MODULE_DIR_ . 'moduletest/classes/ModuleTestTableTest.php';

class AdminModuleTestController extends ModuleAdminControllerCore {

    //configuration de l'objet a utilisé et des champ à affiché
    public function __construct() {
        $this->bootstrap = true; //Gestion de l'affichage en mode bootstrap
        $this->table = ModuleTestTableTest::$definition['table']; //Table de l'objet
        $this->identifier = ModuleTestTableTest::$definition['primary']; //Clé primaire de l'objet
        $this->className = ModuleTestTableTest::class; //Classe de l'objet
        $this->lang = false; //Flag pour dire si utilisation de langues ou non
        $this->_defaultOrderBy = ModuleTestTableTest::$definition['primary'];
        //Appel de la fonction parente
        parent::__construct();
        //Liste des champs de l'objet à afficher dans la liste
        $this->fields_list = array(
            'id_module_test' => array(//nom du champ sql
                'title' => $this->module->l('ID'), //Titre
                'align' => 'center', // Alignement
                'class' => 'fixed-width-xs', //classe css de l'élément
            ),
            'champ_varchar_test' => array(
                'title' => $this->module->l('Texte'),
                'align' => 'left',
            ),
            'champ_date_test' => array(
                'title' => $this->module->l('Date'),
                'align' => 'left',
            ),
            'champ_int_test' => array(
                'title' => $this->module->l('Numéro'),
                'align' => 'left',
            ),
        );
    }

    //configuration du formulaire d'ajout/edition d'une ligne de la tabler
    //utiliser l'URL de votre admin + "index.php?controller=AdminPatterns" pour a liste des champs disponibles
    public function renderForm() {
        $this->fields_form = [
            'legend' => [
                'title' => $this->l('General Information'),
            ],
            'input' => [
                [
                    'type' => 'text',
                    'label' => $this->l('Texte'),
                    'name' => 'champ_varchar_test',
                    'required' => true,
                ],
                [
                    'type' => 'datetime',
                    'label' => $this->l('Date'),
                    'name' => 'champ_date_test',
                    'required' => true,
                ],
                [
                    'type' => 'text',
                    'label' => $this->l('Numéro'),
                    'name' => 'champ_int_test',
                    'required' => true,
                ],
            ],
            'submit' => [
                'title' => $this->l('Save'),
            ],
        ];
        return parent::renderForm();
    }

    //permet d'ajouter le bouton de suppression pour chaque ligne
    public function renderList() {
        $this->addRowAction('delete');
        return parent::renderList();
    }

}

Le module de type CRUD est maintenant opérationnel, on va regarder comment améliorer tout ça dans des articles à venir.

2 réflexions sur « Prestashop : Les bases d’un module CRUD »

  1. Ping : Prestashop : Modifier la liste d'un "AdminController" grâce au hook "action' . $this->controller_name . 'ListingResultsModifier" - Pense bête d'un développeur web

  2. BK

    Merci Manu. Tes explications sont parfaites ! et elles marchent.
    Tu devrait te faire embaucher chez Prestashop pour leur expliquer comment faire une doc compréhensible;

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.