Logo de Béjean Développement

Les bases d'un module Magento 2

Au sein de Magento, un module vous permet de personnaliser votre boutique en ligne, en ajoutant des fonctionnalités, en modifiant le comportement d'une fonctionnalité existante...

Un module est un ensemble de fichiers regroupés dans un dossier.

Périmètre d'un module

Un module peut être défini pour être utilisé dans le backoffice, frontoffice, les crons, les API (REST ou SOAP) et/ou le GraphQL.

Création du module

Lors du développement de votre module, il est recommandé de le créer dans le dossier app/code.

Pour le développement de mon modèle de base, j'ai créé les dossiers NicolasBejean/Master dans le dossier app/code pour avoir le résultat suivant :

.
├─ app
|  └─ code
|     └─ NicolasBejean
|        └─ Master
├─ ...

En plus de cela, il faut ajouter 2 fichiers indispensables pour que le module soit reconnu lors de son installation.

Fichier registration.php

Dans le dossier Master, il faut créer le fichier registration.php avec le contenu suivant :

<?php
use \Magento\Framework\Component\ComponentRegistrar;

ComponentRegistrar::register(
    ComponentRegistrar::MODULE,
    'NicolasBejean_Master',
    __DIR__
);

Le fichier utilise la classe ComponentRegistrar que vous pouvez retrouver dans les vendors : vendor/magento/framework/Component/ComponentRegistrar.php.

Lors de l'enregistrement d'un module, Magento a besoin de 3 éléments, le type de module, son nom, puis son le chemin du module.

Cette classe contient 5 constantes pour définir le type du module : module, library, theme, language et setup.

Voici quelques exemples de module ayant des types différents :

  • module : vendor/magento/module-cms/registration.php
  • library : vendor/magento/framework/registration.php
  • theme : vendor/magento/theme-frontend-luma/registration.php
  • language : vendor/magento/language-fr_fr
  • setup : vendor/magento/magento2-base/setup/src/Magento/Setup/registration.php

Hormis le module magento/setup, on remarque qu'il existe une règle de nommage pour chaque dossier.

Voici le lien vers la documentation de Magento 2 pour plus de détails.

Fichiers module.xml, theme.xml ou language.xml

Nous aurons un fichier à créer en fonction du besoin : module.xml, theme.xml ou language.xml.

Les fichiers XML de Magento 2 ont une structure définie par des fichiers XSD :

  • module.xml : vendor/magento/framework/Module/etc/module.xsd
  • theme.xml : vendor/magento/framework/Config/etc/theme.xsd
  • package.xml : vendor/magento/framework/App/Language/package.xsd

Les fichiers theme.xml et language.xml, doivent être créé à la racine du module, soit au même niveau que le fichier registration.php.

Pour le fichier module.xml, il doit être créé dans un dossier nommé etc au sein du module avec le contenu suivant :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="NicolasBejean_Master" setup_version="1.1.6" />
</config>

Ce fichier contient un noeud <config> avec le chemin vers le fichier XSD correspondant au type de module que l'on souhaite développer. Puis un noeud enfant, unique, nommée <module> contenant le nom de notre module ainsi que sa version, qui doit contenir uniquement des chiffres avec ou non des points.

Il est possible de définir la séquence de chargement d'un module en ajoutant un ou plusieurs noeuds enfant nommé <sequence> au noeud <module>. Par exemple, pour exporter des données de commandes et des données clients, le contenu du fichier sera le suivant :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="NicolasBejean_Master" setup_version="1.1.6">
        <sequence>
            <module name="Magento_Sales"/>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

Voici le lien vers la documentation de Magento 2 pour plus de détails.

Fichier composer.json

Ce fichier n'est pas indispensable mais il est fortement recommandé de le créer.

Il permet d'installer votre module via la commande composer.

Le fichier doit contenir plusieurs informations name, description, type, version, require, license etr autoload, par exemple :

{
  "name": "nicolasbejean/module-master",
  "description": "Base de travail pour le développement d'un module Magento 2",
  "type": "magento2-module",
  "version": "1.1.6",
  "require": {
    "php": ">=7.3",
    "magento/framework": ">=102"
  },
  "license": [
    "GPL-3.0-only"
  ],
  "autoload": {
    "psr-4": {
      "NicolasBejean\\Master\\": ""
    },
    "files": [
      "registration.php"
    ]
  }
}

Le nom du package correspond au dossier où il sera installé dans vendor.

Voici le lien vers la documentation de Magento 2 pour plus de détails.

Si vous souhaitez installer un module depuis un dépôt GIT, vous devez lancer 2 commandes : composer config repositories.nicolasbejean-master git https://lab.frogg.it/bejean-developpement/magento-2/modules/master.git pour vous permettre d'indiquer à Composer l'URL vers le dépôt Git du module à installer. Cette commande va ajouter une entrée dans la tableau repositories du fichier composer.json de votre projet :

...,
"repositories": {
    "0": {
        "type": "composer",
        "url": "https://repo.magento.com/"
    },
    "nicolasbejean-master": {
        "type": "git",
        "url": "https://lab.frogg.it/bejean-developpement/magento-2/modules/master.git"
    }
},
...

Puis la commande : composer require nicolasbejean/module-master pour installer le module. La valeur après require doit correspondre à la valeur du name du fichier composer.json du module.

Installation du module

Pour installer votre module, il faut lancer 1 commande : bin/magento setup:upgrade. Cette commande va enregistrer votre module dans la table setup_module de la base de données, puis dans le fichier app/etc/config.php.

Dans la table, il est enregistré la version du module au moment où la commande bin/magento setup:upgrade est lancée. Tandis que le fichier app/etc/config.php contient l'état d'activation du module.

Pour contrôler l'activation de votre module, vous pouvez lancer la commande : bin/magento module:status NicolasBejean_Master.

Voici le lien vers la documentation de Magento 2 pour plus de détails.