Ajouter un nouveau type de produit dans Magento 2

magento2

Magento dispose de nombreux types de produit qui permettent de générer des catalogues complets et adaptés aux besoins des vendeurs. Il en est de même pour la version 2 de la solution E-Commerce.

Si chaque type définit un comportement et des attributs qui lui sont propres, il est parfois nécessaire de créer un nouveau type afin de répondre à de nouveaux besoins.

Cet article décrit comment déclarer un nouveau type de produit et comment lui associer un comportement qui lui est propre. Le code est basé sur la version 2.1.2 de Magento.

Création du module

Dans un premier temps, nous allons déclarer un module Catalog dans notre namespace Netapsys. Les types de produit sont associés au module Catalog de Magento que l'on retrouvera dans le répertoire vendor/magento/module-catalog.

Pour cette raison, nous allons créer un module qui va étendre les fonctionnalités du module Catalog natif.

Commençons par déclarer le module :

<?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="Netapsys_Catalog" setup_version="0.0.1">
		<sequence>
			<module name="Magento_Catalog" />
		</sequence>
	</module>
</config>
App/code/Netapsys/Catalog/etc/module.xml

Le nœud sequence ci-dessus définit la dépendance de notre nouveau module au module Catalog natif.

Il est également nécessaire de mettre en place un fichier registration.php dans le module, qui permettra d'enregistrer le module via la classe ComponentRegistrar de Magento 2.

<?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Netapsys_Catalog',
    __DIR__
);
app/code/Netapsys/Catalog/registration.php

Ajout du nouveau type de produit

Ensuite, pour créer notre nouveau type de produit, il suffit de 2 étapes. La première est de déclarer ce type dans un fichier product_types.xml au sein de notre module.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Catalog/etc/product_types.xsd">
    <type name="mynewproducttype" label="My New Product Type" modelInstance="Netapsys\Catalog\Model\Product\Type\MyNewProductType" indexPriority="70" sortOrder="70"></type>
</config>
app/code/Netapsys/Catalog/etc/product_types.xml

Ici, nous avons déclaré un nouveau type de produit qui sera identifié par le code mynewproducttype.

Nous allons ensuite lui associer un model qui le rendra fonctionnel. Ce model correspond à l'attribut modelInstance de notre déclaration XML.

<?php

namespace Netapsys\Catalog\Model\Product\Type;

use Magento\Catalog\Model\Product\Type\AbstractType;
use Magento\Catalog\Model\Product;

class MyNewProductType extends AbstractType
{
    const TYPE_CODE = 'mynewproducttype';
    
    public function deleteTypeSpecificData(Product $product)
    {
        
    }
}
app/code/Netapsys/Catalog/Model/Product/Type/MyNewProductType.php

Notre nouvelle classe étend la classe AbstractType de Magento. Cette classe ne contient qu'une seule fonction abstraite deleteTypeSpecificData qui permet de supprimer certaines données d'un produit standard. Ici nous allons simplement implémenter la fonction mais la laisser vide car nous ne souhaitons rien modifier à ce niveau-là.

La déclaration de la constante TYPE_CODE permettra de faire la distinction entre les types de produits facilement lors de futurs traitements.

Ajout d'attributs système

En fonction des besoins de votre boutique, nous allons ensuite associer des attributs produit à ce nouveau type.

Pour ce faire, nous allons mettre en place un script d'installation pour le module.

<?php

namespace Netapsys\Catalog\Setup;

use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Eav\Setup\EavSetupFactory;
use Netapsys\Catalog\Model\Product\Type\MyNewProductType;
use Magento\Catalog\Model\Product;

class InstallData implements InstallDataInterface
{
    /**
     * @var EavSetupFactory
     */
    private $_eavSetupFactory;
    
    /**
     * @param EavSetupFactory $eavSetupFactory
     */
    public function __construct(EavSetupFactory $eavSetupFactory)
    {
        $this->_eavSetupFactory = $eavSetupFactory;
    }
    
    /**
     * Install data
     * @param ModuleDataSetupInterface $setup
     * @param ModuleContextInterface $context
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        // get an instance of eavSetup
        $eavSetup = $this->_eavSetupFactory->create(['setup' => $setup]);
        
        // array with attributes we want to add to our product type
        $attributes = [
            'cost',
            'price',
            'special_price',
            'special_from_date',
            'special_to_date',
            'weight',
            'tax_class_id'
        ];
        
        foreach ($attributes as $attribute) {
            // get array with product types applied to this attribute
            $applyToProductTypes = explode(',', $eavSetup->getAttribute(Product::ENTITY, $attribute, 'apply_to'));
            // add new product type to product type list
            $applyToProductTypes[] = MyNewProductType::TYPE_CODE;
            // apply to attribute
            $eavSetup->updateAttribute(Product::ENTITY, $attribute, 'apply_to', implode(',', $applyToProductTypes));
        }
    }
}
app/code/Netapsys/Catalog/Setup/InstallData.php

Dans le constructeur, il est nécessaire d'injecter la dépendance EavSetup, qui nous permet de gérer les attributs dans le script d'installation. On déclare ensuite un tableau avec la liste des attributs à ajouter, ici tous les attributs relatifs au prix, au poids et aux taxes. Pour chacun de ses attributs, nous ajoutons notre nouveau type de produit dans la liste des types associés à l'attribut.

Si vous souhaitez ajouter d'autres attributs produit, vous pouvez vous référer à la liste des attributs disponible dans l'administration de Magento 2 sous Stores > Attributes > Product. Cette étape n'est toutefois pas obligatoire si vous ne souhaitez pas modifier les attributs de notre nouveau type de produit.

Installation du module

Il est ensuite nécessaire d'installer notre module en ligne de commandes.

Placez-vous au niveau de la racine du projet Magento et entrez la commande suivante :

php bin/magento setup:upgrade

Une fois installé, vous aurez accès à notre nouveau type de produit dans l'administration.

FireShot Capture 1 - Catalog _ Inve__ - http___store.shm.local_shmadm_catal

Utilisation du nouveau type de produit

A partir de ces modifications vous pouvez réécrire certaines classes associées aux types de produit comme \Magento\Catalog\Model\Product\Type\Price.

Vous pouvez également appliquer des logiques spécifiques en testant le type de votre produit :

<?php

/**
...
...
...
**/

use Netapsys\Catalog\Model\Product\Type\MyNewProductType;

/**
…
…
…
*/

if($product->getTypeId() == MyNewProductType::TYPE_CODE) {
    /** do something special **/
}

Conclusion

On a pu voir que la création de nouveaux types de produits est simple avec Magento 2.

L’intérêt d'un nouveau type de produit est de pouvoir mettre en place un nouveau comportement. Il est également utile pour faciliter la création d'un produit, lors de laquelle on pourra automatiser la mise en place de certaines données.

Laisser un commentaire

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

Captcha *

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