Magento 2, як зберегти додане користувацьке поле у ​​вигляді групи клієнтів?


9

Додавши деякі спеціальні поля до форми групи клієнтів, використовуючи upgradeSchema.php.

Після цього я виявив, що вихідні поля, такі як код групи клієнтів та ідентифікатор податку, зберігаються за допомогою методів встановлення в наданому API. Він повністю відрізняється від Magento 1.X тим, що просто використовувати setXXX () для збереження.


Я спробував використовувати \ Magento \ Customer \ Api \ Data \ GroupInterface $ customerGroup-> setData ('program_type', $ programType); program_type відповідає стовпцю таблиці 'program_type' для збереження в базі даних, але не вдалося.
Ricky.C

Чи потрібно писати користувальницький API з getter та setter для збереження полів?
Ricky.C

Відповіді:


23

У цьому випадку слід використовувати механізм атрибутів розширення. Це дозволяє розширювати основні API на сторонні модулі. Загальні кроки для ввімкнення нового атрибуту розширення:

  1. Оголосити атрибут розширення, як описано в офіційних документах . Після очищення varта запуску <project_root>/bin/magento setup:di:compileвідповідний сеттер і гетьтер для цього нового атрибута повинні з'явитися в \Magento\Customer\Api\Data\GroupExtensionInterface(цей інтерфейс створено автоматично)
  2. Писати плагін для \Magento\Customer\Api\GroupRepositoryInterface::save, \Magento\Customer\Api\GroupRepositoryInterface::getById(і будь-яких інших методів обслуговування по мірі необхідності) , щоб зберегти / новий атрибут навантаження. Як розробник розширень, ви тільки знаєте, де цей атрибут повинен зберігатися, може бути будь-яка таблиця. Дивіться \Magento\Downloadable\Model\Plugin\AroundProductRepositorySave::aroundSaveяк приклад
  3. Якщо вам потрібно зробити цей атрибут видимим у колекції (щоб його можна було шукати / фільтрувати), оголосіть joinвузол. Якщо ні, то просто пропустіть це
  4. Отримайте доступ до власного атрибуту як:, $customerGroup->getExtensionAttributes()->getMyAttribute()де customerGroupреалізує \Magento\Customer\Api\Data\GroupInterface. setMyAttribute()можна також використовувати

Нижче наведено приклад конфігурації, до якої слід звернути увагу 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>

Я спробував додати extension_attributes.xml, але новий інтерфейс не створюється. ps Я видалив папку генерації і
попросив

Мій extension_attribute.xml: <? Xml version = "1.0"?> <config> <extension_attributes for = "Magento \ Customer \ Api \ Data \ GroupInterface"> <атрибут code = "group_domain" type = "string" /> </ extension_attributes> </config>
Ricky.C

Файл слід називати extension_attributes.xml (множина). Спробуйте викликати генерацію всіх автогенерованих об'єктів за допомогою CLI.
Олексій Паляруш

вибачте за друкарський текст вищевказаного коментаря, файл, який я маю, фактично є extension_attributes.xml
Ricky.C

Я гуглив, але нічого не знайшов. Чи можете ви повідомити мені, яку команду слід використовувати? Я новий учасник, який не знайомий із кліпом. Дякую.
Ricky.C

2

Не забувайте, що модулю потрібен register.phpфайл у ньому, і його потрібно використовувати, bin/magento module:enable VendorName_ModuleNameперш ніж він з’явиться!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.