Magento 2 Wie speichere ich ein benutzerdefiniertes Feld, das in Form einer Kundengruppe hinzugefügt wurde?

9

Ich habe der Form der Kundengruppe mithilfe von einige benutzerdefinierte Felder hinzugefügt upgradeSchema.php.

Danach stellte ich fest, dass die ursprünglichen Felder wie Kundengruppencode und Steuer-ID mithilfe von Setter-Methoden in der bereitgestellten API gespeichert werden. Es ist völlig anders als Magento 1.X, das nur setXXX () zum Speichern verwendet.

Ricky.C
quelle
Ich habe versucht, \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType) zu verwenden. program_type entspricht der Tabellenspalte 'program_type', die in der Datenbank gespeichert werden soll, ist jedoch fehlgeschlagen.
Ricky.C
Sollte ich eine benutzerdefinierte API mit Getter und Setter schreiben, um die Felder zu speichern?
Ricky.C

Antworten:

22

In diesem Fall sollte der Mechanismus für Erweiterungsattribute verwendet werden. Es ermöglicht die Erweiterung von Kern-APIs durch Module von Drittanbietern. Allgemeine Schritte zum Aktivieren eines neuen Erweiterungsattributs:

  1. Deklarieren Sie das Erweiterungsattribut wie in den offiziellen Dokumenten beschrieben . Nach dem Löschen varund Ausführen <project_root>/bin/magento setup:di:compilesollte der entsprechende Setter und Getter für dieses neue Attribut in angezeigt werden \Magento\Customer\Api\Data\GroupExtensionInterface(diese Schnittstelle wird automatisch generiert).
  2. Write - Plugins für \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(und alle anderen Service - Methoden je nach Bedarf) zu speichern / laden neues Attribut. Als Erweiterungsentwickler wissen nur Sie, wo dieses Attribut gespeichert werden soll, möglicherweise eine beliebige Tabelle. Siehe \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSaveals Beispiel
  3. Wenn Sie dieses Attribut in der Sammlung sichtbar machen müssen (um es durchsuchbar / filterbar zu machen), deklarieren Sie den joinKnoten. Wenn nicht, überspringen Sie dies einfach
  4. Greifen Sie auf Ihr benutzerdefiniertes Attribut zu als : $customerGroup->getExtensionAttributes()->getMyAttribute(), wo customerGroupimplementiert \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()kann auch verwendet werden

Unten finden Sie ein Beispiel für die Konfiguration, die vorgenommen werden sollte 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
quelle
Ich habe versucht, die Datei extension_attributes.xml hinzuzufügen, aber es wird keine neue Schnittstelle generiert. ps Ich habe den Generierungsordner gelöscht und eine Operation aufgerufen .....
Ricky.C
Meine 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
Die Datei sollte extension_attributes.xml (Plural) heißen. Versuchen Sie, die Generierung aller automatisch generierten Entitäten mithilfe der CLI aufzurufen.
Alex Paliarush
Entschuldigung für den Tippfehler auf dem obigen Kommentar, die Datei, die ich tatsächlich habe, ist extension_attributes.xml
Ricky.C
Ich habe gegoogelt, aber nichts gefunden. Können Sie mir mitteilen, welcher Befehl verwendet werden soll? Ich bin ein Neuling, der dem Cli nicht vertraut ist. Vielen Dank.
Ricky.C
2

Vergessen Sie nicht, dass ein Modul eine register.phpDatei benötigt , die Sie verwenden müssen, bin/magento module:enable VendorName_ModuleNamebevor sie angezeigt wird!

GuruBob
quelle