Как использовать extension_attributes в Magento2

Ответы:

18

Предположим, мы создаем дату доставки заказа, когда клиент выбирает доставку, а затем клиент может выбрать дату доставки. Таким образом, вы можете создать атрибут расширения для \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface следующим образом


<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Checkout\Api\Data\ShippingInformationInterface">
        <attribute code="delivery_date" type="string"/>
    </extension_attributes>
</config>

Так что теперь вы можете получить доступ к этому значению при использовании \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface as di.

Таким образом, в этом случае Magento \ Checkout \ Model \ ShippingInformationManagement этот класс использует \ Magento \ Checkout \ Api \ Data \ ShippingInformationInterface в качестве параметров для метода saveAddressInformation. Таким образом, вы можете получить доступ следующим образом:


$extAttributes = $addressInformation->getExtensionAttributes();
$deliveryDate = $extAttributes->getDeliveryDate();

Для более подробной информации (Официальная документация Magento 2)

Вот пример:

extension_attributes

Выбрать значение атрибутов расширения

[Обновить]

Вы можете установить extension_attributes методом setExtensionAttributes . Следующий класс является примером: Нажмите здесь

Сохель Рана
источник
Так что же такое setExtensionAttributes?
Phoenix128_RiccardoT
Я обновил с реальным примером
Sohel Rana
Отлично, но здесь отсутствует одна вещь: где именно хранятся атрибуты расширения? Нужно ли предоставлять код для сохранения и извлечения атрибутов самостоятельно, или Magento может справиться с этим (как с настраиваемыми атрибутами)?
Мартин Уикман
Правильно ли я понимаю, что плагины обязательны для extension_attributesработы? Например, всегда ли мне нужно добавлять плагин afterLoadдля клиентов, если я хочу иметь пользовательский атрибут для клиентов? Мне кажется, это немного над головой ...
Гиль Беркерс
1
@MartinWickman: да, разработчик несет ответственность за реализацию логики для извлечения и сохранения данных атрибута расширения. Концепция заключается в том, что у вас есть некоторые, возможно, сложные данные, введенные вашим модулем для сущностей продуктов, и эти данные могут поступать из одной или нескольких таблиц базы данных или другого источника данных, это не должно иметь значения. Используя систему плагинов, предназначайтесь для загрузки методов ProductRepository (например, afterGet, afterGetList). Здесь вы извлекаете свои данные (откуда угодно) и добавляете их в ExtensionAttributes сущности. Это кажется трудным, но очень гибким и мощным.
Джон Холл