Magento предоставляет два типа атрибутов, которые интеграторы могут использовать для расширения функциональности, предоставляемой из коробки:
- Пользовательские и EAV (атрибут Entity-Attribute-Value). Пользовательские атрибуты добавляются от имени продавца. Например, продавцу может потребоваться добавить атрибуты для описания продуктов, например формы или объема. Торговец может добавить эти атрибуты на панели администратора, и эти атрибуты могут быть отображены. Сведения об управлении настраиваемыми атрибутами см. В документации продавца. Пользовательские атрибуты — это подмножество атрибутов EAV. Объекты, которые используют атрибуты EAV, обычно хранят значения в нескольких таблицах MySQL. Модули Customer и Catalog имеют основные модели, которые используют атрибуты EAV. Другие модули, такие как ConfigurableProduct, GiftMessage и Tax, используют функциональность EAV из Catalog.
- Атрибуты расширения. Атрибуты расширения являются новыми в Magento 2. Они используются для расширения функциональности и часто используют более сложные типы данных, чем настраиваемые атрибуты. Эти атрибуты не отображаются в графическом интерфейсе.
EAV и пользовательские атрибуты
CustomAttributesDataInterface определяет методы, которые вызывают для получения и установки настраиваемых атрибутов, включая getCustomAttributes ().
Модуль имеет набор встроенных атрибутов, которые всегда доступны. Модуль Catalog имеет несколько атрибутов, которые определяются как атрибуты EAV, но рассматриваются как встроенные атрибуты. Эти атрибуты включают:
- attribute_set_id
- created_at
- group_price
- media_gallery
- name
- price
- sku
- status
- store_id
- tier_price
- type_id
- updated_at
- visibility
- weight
В случае, когда вызывается метод getCustomAttributes (), система возвращает только пользовательские атрибуты, которых нет в этом списке.
Модуль Customer не обрабатывает свои атрибуты EAV каким либо образом. В результате метод getCustomAttributes () возвращает все атрибуты EAV.
Атрибуты расширения
Используйте ExtensibleDataInterface для реализации атрибутов расширения. В вашем коде вы должны определить getExtensionAttributes () и setExtensionAttributes (* ExtensionInterface param).
public function getExtensionAttributes();
Скорее всего, вы захотите расширить интерфейсы, определенные в каталоге Api / Data модуля Magento.
Объявлять атрибуты расширения
Чтобы определить атрибуты расширения для модуля, вы должны создать файл <Module> /etc/extension_attributes.xml:
<config>
<extension_attributes for="Path\To\Interface">
<attribute code="name_of_attribute" type="datatype">
<resources>
<resource ref="permission"/>
</resources>
<join reference_table="" reference_field="" join_on_field="">
<field>fieldname</field>
</join>
</attribute>
</extension_attributes>
</config>
где:
Keyword | Description | Example |
---|---|---|
for | Полное имя типа с пространством имен, обрабатывающим расширения. Значение должно быть типом, который реализует `ExtensibleDataInterface`. Интерфейс может находиться в другом модуле. | Magento\Quote\Api\Data\TotalsInterface |
code | Имя атрибута. Имя атрибута должно быть в snake case (первая буква в каждом слове должна быть в нижнем регистре, каждое слово должно быть разделено символом подчеркивания). | gift_cards_amount_used |
type | Тип данных. Это может быть простой тип данных, такой как строка или целое число, или сложный тип, такой как интерфейс. | float |
ref | Необязательный. Ограничивает доступ к атрибуту расширения пользователям с указанным разрешением. | Magento_CatalogInventory::cataloginventory |
reference_table | Таблица, участвующая в операции соединения. Дополнительные сведения см. В разделе Поиск атрибутов расширения. | admin_user |
reference_field | Столбец в reference_table | user_id |
join_on_field | Столбец таблицы, связанный с интерфейсом, указанным в ключевом слове for, который будет использоваться в операции объединения. | store_id |
field | Одно или несколько полей присутствуют в интерфейсе, указанном в ключевом слове type.Вы можете указать ключевое слово column = «», чтобы определить столбец в reference_table для использования. Значение поля задает свойство на интерфейсе, который должен быть установлен. | <field column=»customer_group_code»>code</field> |
Поиск атрибутов расширения
Система использует директиву join для добавления внешних атрибутов в коллекцию и для обеспечения возможности фильтрации коллекции. Элемент join в файле extension_attributes.xml определяет, какие поля объектов и таблица базы данных / столбец будут использоваться в качестве источника поиска.
В следующем примере в Magento \ Catalog \ Api \ Data \ ProductInterface добавлен атрибут с именем stock_item типа Magento \ CatalogInventory \ Api \ Data \ StockItemInterface.
<extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
<attribute code="stock_item" type="Magento\CatalogInventory\Api\Data\StockItemInterface">
<join reference_table="cataloginventory_stock_item" reference_field="product_id" join_on_field="entity_id">
<field>qty</field>
</join>
</attribute>
</extension_attributes>
Когда вызывается метод getList (), он возвращает список ProductInterfaces. Когда он это делает, код заполняет Stock_item объединенной операцией, в которой свойство StocktytInterface qty происходит из таблицы cataloginventory_stock_item, где entity_Id продукта присоединен к столбцу cataloginventory_stock_item.product_id.
Аутентификация с расширением атрибута
Отдельные поля, определенные как атрибуты расширения, могут быть ограничены на основе существующих разрешений. Эта функция позволяет разработчикам расширений ограничивать доступ к данным. См. Обзор проверки подлинности веб-API для общей информации об аутентификации в Magento.
Следующий пример кода определяет stock_item в качестве атрибута расширения модуля CatalogInventory. CatalogInventory рассматривается как «стороннее расширение». Доступ к данным инвентаризации ограничен, так как количество товара на складе может быть закрытой информацией.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
<attribute code="stock_item" type="Magento\CatalogInventory\Api\Data\StockItemInterface">
<resources>
<resource ref="Magento_CatalogInventory::cataloginventory"/>
</resources>
</attribute>
</extension_attributes>
</config>
В этом примере атрибут stock_item ограничен только пользователями, у которых есть разрешение Magento_CatalogInventory :: cataloginventory. В результате анонимный или не прошедший проверку пользователь, отправивший запрос GET http: // <magento_base_url> / rest / V1 / products / <sku>, получит информацию о продукте, подобную следующему:
{
"sku": "tshirt1",
"price": "20.00",
"description": "New JSmith design",
"extension_attributes": {
"logo size": "small"
},
"custom_attributes": {
"artist": "James Smith"
}
}
Однако аутентифицированный пользователь с разрешением Magento_CatalogInventory :: cataloginventory получает дополнительное поле stock_item:
{
"sku": "tshirt1",
"price": "20.00",
"description": "New JSmith design",
"extension_attributes": {
"logo size": "small",
"stock_item" : {
"status" : "in_stock"
"quantity": 70
}
},
"custom_attributes": {
"artist": "James Smith"
}
}
Это работает только для атрибутов расширения (те атрибуты, которые определены в файле extension_attributes.xml). На остальной части возвращенных данных нет ограничений разрешений. Например, нет способа ограничить custom_attributes.
ExtensionInterfaces
ExtensionInterface будет пустым, если атрибуты расширения не были добавлены. В следующем примере в неизмененной установке будет генерироваться CustomerExtensionInterface, но она будет пустой:
interface CustomerExtensionInterface extends \Magento\Framework\Api\ExtensionAttributesInterface { }
Однако, если определено расширение, подобное следующему, интерфейс не будет пустым.
<extension_attributes for="Magento\Customer\Api\Data\CustomerInterface">
<attribute code="attributeName" type="Magento\Some\Type[]" />
</extension_attributes>