Création d'attributs produits Magento 2 via setup
C’est quelle clé que je dois mettre pour la propriété
is_user_defined
dans mon setup ??
Il arrive fréquemment que pour un site Magento 2 la création d’attributs produits supplémentaires devient nécessaire. On va donc commencer par créer son petit module pour y mettre un joli Setup dont le contenu devrait ressembler grosso modo à :
On définit l’entité sur laquelle l’attribut sera créé, le code de l’attribut, et un tableau de configuration de l’attribut. Mais comment on connait les clés à mettre dans ce tableau ?
En base de données, certaines de ces clés se trouvent dans la table eav_attribute
, les autres dans catalog_eav_attribute
.
Par exemple on retrouve is_user_defined
.
Par contre si vous avez fait attention, dans le tableau que j’ai passé à la fonction addAttribute
, c’est bien la clé user_defined
que j’ai défini à true
. Comment expliquer la disparition du is_ ?
Et comment expliquer que d’autres clés possèdent bien le is_ (is_html_allowed_on_front
) ?
Mapping
Cela se fait en fait via un système de mapping de clés.
Pour l’entité Product, la classe responsable du mapping est \Magento\Catalog\Model\ResourceModel\Setup\PropertyMapper
,
ainsi que \Magento\Eav\Model\Entity\Setup\PropertyMapper
.
Pour l’entité Customer, il faudra plutôt aller voir du côté de \Magento\Customer\Model\ResourceModel\Setup\PropertyMapper
.
Ces classes de mapping servent à définir des valeurs par défaut pour certaines propriétés d’attributs.
Et comme vous le voyez, elles servent également à changer user_defined
en is_user_defined
pour le stockage en bdd.
Ne cherchez pas, à mon avis il n’y a aucune logique, il faut juste faire attention de définir les bonnes clés lors de la création de l’attribut…
Type Swatch Text et Swatch Image
Magento 2 introduit des nouveaux types d’attributs intitulés Swatch.
Pour créer un attribut de ce type via un setup, il faut ruser un petit peu.
En effet, on ne peut pas définir l’attribut de type swatch_text
par exemple directement avec la fonction addAttribute
, ça ne fonctionnera pas.
Après une petite recherche, la définition d’un attribut de type swatch se trouve dans les additional_data
de l’attribut.
Cependant, si vous essayez de définir la clé additional_data
dans la création de l’attribut,
les données ne seront pas prises en compte car le mapping (qu’on a vu juste au-dessus) va supprimer la clé.
L’astuce est de créer son attribut puis de mettre à jour la propriété additional_data
:
Vous pouvez regarder la différence entre la fonction addAttribute
et updateAttribute
de \Magento\Eav\Setup\EavSetup
.
La première fait appel aux mappers alors que la deuxième non.