Вопрос

Я не уверен, что такое docs говорим.

Я знаю, что они используются для добавления атрибутов (сложных или нет) через etc/extension_attributes.xml, и мне удалось сделать процесс компиляции создать интерфейс с автоматически генерировать пользовательские методы, но это об этом.

Давайте возьмем, например, пару интерфейсов: GitHub Link 1 и Github Link 2 . Как я могу использовать атрибуты расширения, чтобы добавить определенные атрибуты в одном из этих интерфейсов? Я не заинтересован в сложных присоединениях. Просто добавление скалярного атрибута, скажем, «attr1» типа string.

Интерфейсы Data - это шлюз к данным модели модели ..., поэтому мне нужно понимать, как работает расширение этих интерфейсов, чтобы правильно использовать систему. Я часто получаю интерфейс Data в качестве параметра вместо фактической модели, и это нормально. Но я немного запутался тем, как работают расширения.

Это было полезно?

Решение

Атрибут расширения

- это способ расширить интерфейс. Давайте возьмем в качестве примера первой ссылки, которую вы предоставили ProductattributemediaGalleryentryInterface. Если вы посмотрите на методы, вы увидите, что он имеет этот метод

/**
 * Retrieve existing extension attributes object or create a new one.
 *
 * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface|null
 */
public function getExtensionAttributes();
.

Примечание Тип @return Тип метода ProductattributemediaGalleryentRyibutionInteriverface - это интерфейс, который был бы повторно сгенерирован, если вы определяете атрибут расширения для ProductattributemediaGalleryentryInterFace (по умолчанию сгенерировано пустым без методов). Имя зарегистрированного вами атрибута будет использоваться для создания методов интерфейса.

Давайте предположим, что вы добавили attr1 типа string. То, что вы можете сделать после того, как интерфейс регенерирован, - это получить доступ к этому из экземпляра интерфейса.

$entity = $objectManager->get('..\ProductAttributeMediaGalleryEntryInterface')
$entity->getExtensionAttributes()->getAttr1();
.

Чтобы установить атрибут, вам нужно будет создавать интеграцию атрибутов расширения

$extension = $objectManager->get('..\ProductAttributeMediaGalleryEntryExtensionInterface')
$extension->setAttr1('value');
$entity->setExtensionAttributes($extension)
.

Последний - это сценарий по умолчанию, его можно упростить в зависимости от того, как реализован расширенные интерфейс и родительский интерфейс.

[Обновлено]

Пользовательские атрибуты и атрибуты расширения служат различными целями.

пользовательские атрибуты необходимы для представления атрибутов EAV объекта. Большинство атрибутов EAV являются динамическими: они могут быть добавлены после развертывания Magento через Admin UI. Вот почему вы не можете получить код Auto-завершения для атрибутов EAV: вы не знаете обо всех них заранее.

Однако, как разработчик расширения, вы точно знаете о некоторых атрибутах - те, которые вы создали во время разработки. Это может быть новое поле в базе данных, поле в связанной базе данных или атрибута EAV. Вы можете зарегистрировать их как атрибут расширения, потому что они никогда не меняются, если не изменится кодовая база. Вы можете получить код Auto-завершения для них.

Другие советы

Для завершения ответа @eugenetulika, нам нужно создать /etc/extionsion_attributes.xml:

<?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\Catalog\Api\Data\ProductInterface">
        <attribute code="attr1" type="string" />
    </extension_attributes>
</config>
.

Тогда вы можете установить новый атрибут с методом SetaTTR1 (), как ниже:

/** @var ProductExtension $extensionAttributes */
$extensionAttributes = $product->getExtensionAttributes();
$extensionAttributes->setAttr1('super data');
$product->setExtensionAttributes($extensionAttributes);
.

Надеюсь, это может помочь кому-то тоже :)

будет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top