Testé fonctionnel Magento 2.3
Sources: www.magestore.com – Overriding Block, Model In Magento 2 – Magento 2.3, Surcharger une classe native magento2 (Model, Block, Helper, Action…).
(si ce n’est pas fait) Créer un nouveau Module
En ligne de commande:
|
$ n98-magerun2 dev:module:create [Name_Space] [Your_Module] |
…puis:
|
$ n98-magerun2 module:enable [Name_Space]_[Your_Module]; |
Surcharger un Block natif dans Magento 2
Convention: dans l’exemple ci-dessous, nous surchargeons le Block Magento\Catalog\Block\Product\ListProduct.php
.
Créer le fichier di.xml
dans app/code/[Name_Space]/[Your_Module]/etc
:
|
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Catalog\Block\Product\ListProduct" type="[Name_Space]\[Your_Module]\Block\Rewrite\Product\ListProduct" /> </config> |
Dans le fichier ci-dessus:
- l’attribut
for
de la balise preference
déclare le namespace + \ + le nom de la classe du Block initial avec, en dernier, le libellé du fichier sans l’extension *.php
. Dans notre exemple, le chemin vers le fichier natif est vendor/magento/module-catalog/Block/Product/ListProduct.php
.
- l’attribut
type
de la balise preference
déclare le chemin, à partir de la racine de votre projet et sans les deux premiers dossiers app/code/
, vers le Block qui surcharge avec, en dernier, le libellé du fichier sans l’extension *.php
Créer le fichier Block ListProduct.php
dans app/code/[Name_Space]/[Your_Module]/Block/Rewrite/Product
:
|
<?php namespace [Name_Space]\[Your_Module]\Block\Rewrite\Product; class ListProduct extends \Magento\Catalog\Block\Product\ListProduct { public function _getProductCollection() { } } |
Dans le fichier ci-dessus:
- le
namespace
déclare le chemin vers le Block qui surcharge, cette fois-ci sans le nom du fichier. Ici, on peut reprendre une partie de la valeur déclarée pour l’attribut type
de la balise preference
du fichier di.xml
(sans le nom du fichier à la fin, donc…)
- le libellé de la
class
déclarée reprend celui du fichier qui surcharge (le libellé du fichier qu’on est justement en-train de créer ou d’éditer) sans l’extension *.php
- le chemin déclaré après
extends
est celui vers le Block initial avec, en dernier, le libellé du fichier sans l’extension *.php
. Ici, on peut reprendre l’intégralité de la valeur déclarée pour l’attribut for
de la balise preference
du fichier di.xml
, mais ATTENTION: il faut impérativement rajouter un anti-slash \
devant ce dernier!
Commandes Magerun à exécuter impérativement:
A la création de votre module (la première fois):
|
$ n98-magerun2 module:enable [Name_Space]_[Your_Module]; |
Puis à chaque modification dans le fichier di.xml
:
|
$ n98-magerun2 setup:upgrade; n98-magerun2 setup:di:compile; n98-magerun2 cache:clean; n98-magerun2 cache:flush |
Surcharger un Model natif dans Magento 2
Convention: dans l’exemple ci-dessous, nous surchargeons le Model Magento\Catalog\Model\Product.php
.
Créer le fichier di.xml
dans app/code/[Name_Space]/[Your_Module]/etc
:
|
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Catalog\Model\Product" type="[Name_Space]\[Your_Module]\Model\Rewrite\Catalog\Product" /> </config> |
Dans le fichier ci-dessus:
- l’attribut
for
de la balise preference
déclare le namespace + \ + le nom de la classe du Model initial avec, en dernier, le libellé du fichier sans l’extension *.php
. Dans notre exemple, le chemin vers le fichier natif est vendor/magento/module-catalog/Model/Product.php
.
- l’attribut
type
de la balise preference
déclare le chemin, à partir de la racine de votre projet et sans les deux premiers dossiers app/code/
, vers le Model qui surcharge avec, en dernier, le libellé du fichier sans l’extension *.php
Créer le fichier Model Product.php
dans app/code/[Name_Space]/[Your_Module]/Model/Rewrite/Catalog
:
|
<?php namespace [Name_Space]\[Your_Module]\Model\Rewrite\Catalog; class Product extends \Magento\Catalog\Model\Product { public function isSalable() { } } |
Dans le fichier ci-dessus:
- le
namespace
déclare le chemin vers le Model qui surcharge, cette fois-ci sans le nom du fichier. Ici, on peut reprendre une partie de la valeur déclarée pour l’attribut type
de la balise preference
du fichier di.xml
(sans le nom du fichier à la fin, donc…)
- le libellé de la
class
déclarée reprend celui du fichier qui surcharge (le libellé du fichier qu’on est justement en-train de créer ou d’éditer) sans l’extension *.php
- le chemin déclaré après
extends
est celui vers le Model initial avec, en dernier, le libellé du fichier sans l’extension *.php
. Ici, on peut reprendre l’intégralité de la valeur déclarée pour l’attribut for
de la balise preference
du fichier di.xml
, mais ATTENTION: il faut impérativement rajouter un anti-slash \
devant ce dernier!
Commandes Magerun à exécuter impérativement:
A la création de votre module (la première fois):
|
$ n98-magerun2 module:enable [Name_Space]_[Your_Module]; |
Puis à chaque modification dans le fichier di.xml
:
|
$ n98-magerun2 setup:upgrade; n98-magerun2 setup:di:compile; n98-magerun2 cache:clean; n98-magerun2 cache:flush |