Magento 2 jak zapisać niestandardowe pole dodane w postaci grupy klientów?

9

Dodałem kilka niestandardowych pól do formularza grupy klientów, używając upgradeSchema.php.

Po tym stwierdziłem, że oryginalne pola, takie jak kod grupy klientów i identyfikator podatkowy, są zapisywane przy użyciu metod ustawiających w podanym interfejsie API. Zupełnie różni się od Magento 1.X, który po prostu używa setXXX () do zapisywania.

Ricky.C
źródło
Próbowałem użyć \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('typ_programu', $ programType); typ_programu odpowiada kolumnie tabeli „typ_programu”, aby zapisać go w bazie danych, ale nie powiódł się.
Ricky.C,
Czy powinienem napisać niestandardowy interfejs API z narzędziem pobierającym i ustawiającym, aby zapisać pola?
Ricky.C,

Odpowiedzi:

23

W takim przypadku należy zastosować mechanizm atrybutów rozszerzeń. Umożliwia rozszerzenie podstawowych interfejsów API o moduły innych firm. Ogólne kroki włączania nowego atrybutu rozszerzenia:

  1. Zadeklaruj atrybut rozszerzenia zgodnie z opisem w oficjalnych dokumentach . Po wyczyszczeniu vari uruchomieniu <project_root>/bin/magento setup:di:compileodpowiedni setter i getter dla tego nowego atrybutu powinien pojawić się w \Magento\Customer\Api\Data\GroupExtensionInterface(ten interfejs jest generowany automatycznie)
  2. Wtyczki do zapisu \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(i wszelkie inne metody service jak to konieczne), aby zapisać / nowy atrybut obciążenia. Jako programista rozszerzeń tylko Ty wiesz, gdzie ten atrybut powinien być przechowywany, może to być dowolna tabela. Zobacz \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSavejako przykład
  3. Jeśli chcesz, aby ten atrybut był widoczny w kolekcji (aby można go było przeszukiwać / filtrować), zadeklaruj joinwęzeł. Jeśli nie, pomiń to
  4. Uzyskaj dostęp do niestandardowego atrybutu jako:, $customerGroup->getExtensionAttributes()->getMyAttribute()gdzie customerGroupimplementuje \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()można również użyć

Poniżej znajduje się przykład konfiguracji, którą należy wprowadzić 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
źródło
Próbowałem dodać plik extension_attributes.xml, ale nie został wygenerowany nowy interfejs. ps
Usunąłem
Mój rozszerzenie_atrybut.xml: <? Xml wersja = "1.0"?> <konfiguracja <<rozszerzenie_atrybutów = = „Magento \ Customer \ Api \ Data \ GroupInterface”> <kod atrybutu = „domena_grupy” typ = „ciąg” /> </ extension_attributes> </config>
Ricky.C
Plik powinien mieć nazwę rozszerzenie_atrybuty.xml (liczba mnoga). Spróbuj wywołać generowanie wszystkich automatycznie generowanych encji za pomocą CLI.
Alex Paliarush,
przepraszam za literówkę do powyższego komentarza, plik, który mam, to rozszerzenie_atrybuty.xml
Ricky.C
Znalazłem google, ale nic nie znalazłem. Czy możesz dać mi znać, którego polecenia należy użyć? Jestem nowym przybyszem, który nie zna Cli. Dzięki.
Ricky.C
2

Nie zapominaj, że moduł potrzebuje register.phppliku i musisz go użyć, bin/magento module:enable VendorName_ModuleNamezanim się pojawi!

GuruBob
źródło