Question

J'ai ajouté des champs personnalisés au formulaire de groupe de clients en utilisant upgradeSchema.php.

Après cela, j'ai découvert que les champs d'origine tels que le code du groupe client et le numéro d'identification fiscale étaient enregistrés à l'aide de méthodes de définition dans l'API fournie.C'est complètement différent de Magento 1.X qui utilise simplement setXXX() pour enregistrer.

Était-ce utile?

La solution

Le mécanisme des attributs d’extension doit être utilisé dans ce cas.Il permet l'extension des API de base par des modules tiers.Étapes génériques pour activer un nouvel attribut d'extension :

  1. Déclarez l'attribut d'extension comme décrit dans le documents officiels.Après avoir effacé var et courir <project_root>/bin/magento setup:di:compile, le setter et le getter correspondants pour ce nouvel attribut devraient apparaître dans \Magento\Customer\Api\Data\GroupExtensionInterface (cette interface est générée automatiquement)
  2. Écrire des plugins pour \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById (et toute autre méthode de service si nécessaire) pour enregistrer/charger un nouvel attribut.En tant que développeur d'extensions, vous seul savez où cet attribut doit être stocké, peut-être n'importe quelle table.Voir \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSave par exemple
  3. Si vous devez rendre cet attribut visible dans la collection (pour le rendre consultable/filtrable), déclarez join nœud.Si ce n'est pas le cas, sautez ceci
  4. Accédez à votre attribut personnalisé en tant que : $customerGroup->getExtensionAttributes()->getMyAttribute(), où customerGroup met en oeuvre \Magento\Customer\Api\Data\GroupInterface. setMyAttribute() peut également être utilisé

Ci-dessous l'exemple de configuration à mettre en place VendorName/ModuleName/etc/extension_attributes.xml

<?xml version="1.0"?>
<config>
    <extension_attributes for="Magento\Customer\Api\Data\GroupInterface">
        <!--Data interface can be used as a type of attribute, see example in CatalogInventory module-->
        <attribute code="name_of_attribute" type="string">
            <resources>
                <resource ref="VendorName_ModuleName::someAclNode"/>
            </resources>
            <!--Join is optional, only if you need to have added attribute visible in groups list-->
            <join reference_table="table_where_attribute_is_stored" reference_field="group_id_field_in_that_table" join_on_field="group_id">
                <field>name_of_added_attribute_field_in_that_table</field>
            </join>
        </attribute>
    </extension_attributes>
</config>

Autres conseils

N'oubliez pas qu'un module a besoin d'un register.php fichier dedans, et vous devez utiliser bin/magento module:enable VendorName_ModuleName avant qu'il n'apparaisse !

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top