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.


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>

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.