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.