Magento 2 comment enregistrer un champ personnalisé ajouté sous forme de groupe de clients?

9

J'ai ajouté des champs personnalisés au formulaire de groupe de clients à l'aide de upgradeSchema.php.

Après cela, j'ai constaté que les champs d'origine tels que le code de groupe de clients et l'ID de taxe étaient enregistrés à l'aide des méthodes de définition dans l'API fournie. Il est complètement différent de Magento 1.X qui utilise simplement setXXX () pour enregistrer.

Ricky.C
la source
J'ai essayé d'utiliser \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType); type_programme correspond à la colonne de table 'type_programme' à enregistrer dans la base de données, mais a échoué.
Ricky.C
Dois-je écrire une API personnalisée avec getter et setter pour enregistrer les champs?
Ricky.C

Réponses:

23

Le mécanisme des attributs d'extension doit être utilisé dans ce cas. Il permet l'extension des API principales 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 les documents officiels . Après effacement varet exécution <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. Écrivez 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 le 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::aroundSavecomme exemple
  3. Si vous devez rendre cet attribut visible dans la collection (pour le rendre consultable / filtrable), déclarez joinnode. Sinon, sautez cela
  4. Accédez à votre attribut personnalisé en tant que:, $customerGroup->getExtensionAttributes()->getMyAttribute()customerGroupimplémente \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()peut également être utilisé

Voici un exemple de configuration qui devrait être mis à 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>
Alex Paliarush
la source
J'ai essayé d'ajouter l'extension_attributes.xml, mais aucune nouvelle interface n'est générée. ps J'ai supprimé le dossier de génération et invoqué une opération .....
Ricky.C
Mon extension_attribute.xml: <? Xml version = "1.0"?> <config> <extension_attributes for = "Magento \ Customer \ Api \ Data \ GroupInterface"> <attribute code = "group_domain" type = "string" /> </ extension_attributes> </config>
Ricky.C
Le fichier doit être appelé extension_attributes.xml (pluriel). Essayez d'appeler la génération de toutes les entités générées automatiquement à l'aide de CLI.
Alex Paliarush
désolé pour la faute de frappe sur le commentaire ci-dessus, le fichier que j'ai en fait est extension_attributes.xml
Ricky.C
J'ai googlé mais je n'ai rien trouvé. Pouvez-vous me faire savoir quelle commande utiliser? Je suis un nouveau venu qui ne connaît pas le cli. Merci.
Ricky.C
2

N'oubliez pas qu'un module a besoin d'un register.phpfichier et que vous devez l'utiliser bin/magento module:enable VendorName_ModuleNameavant qu'il n'apparaisse!

GuruBob
la source