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
- Surcharger un Block natif dans Magento 2
- Surcharger un Model natif dans Magento 2
(si ce n’est pas fait) Créer un nouveau Module
En ligne de commande:
1 |
$ n98-magerun2 dev:module:create [Name_Space] [Your_Module] |
…puis:
1 |
$ 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
:
1 2 3 4 |
<?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 balisepreference
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 estvendor/magento/module-catalog/Block/Product/ListProduct.php
. - l’attribut
type
de la balisepreference
déclare le chemin, à partir de la racine de votre projet et sans les deux premiers dossiersapp/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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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’attributtype
de la balisepreference
du fichierdi.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’attributfor
de la balisepreference
du fichierdi.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):
1 |
$ n98-magerun2 module:enable [Name_Space]_[Your_Module]; |
Puis à chaque modification dans le fichier di.xml
:
1 |
$ 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
:
1 2 3 4 |
<?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 balisepreference
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 estvendor/magento/module-catalog/Model/Product.php
. - l’attribut
type
de la balisepreference
déclare le chemin, à partir de la racine de votre projet et sans les deux premiers dossiersapp/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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?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’attributtype
de la balisepreference
du fichierdi.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’attributfor
de la balisepreference
du fichierdi.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):
1 |
$ n98-magerun2 module:enable [Name_Space]_[Your_Module]; |
Puis à chaque modification dans le fichier di.xml
:
1 |
$ n98-magerun2 setup:upgrade; n98-magerun2 setup:di:compile; n98-magerun2 cache:clean; n98-magerun2 cache:flush |