Цель модуля, который я сейчас разрабатываю, - добавить пользовательский тип изображения с именем "opengraph_image". Я добавил новый атрибут EAV через мой скрипт InstallData.php, который работает нормально. Теперь, когда я вхожу в бэкэнд Magento2 и изменяю продукт, я могу выбрать тип изображения "opengraph_image" при загрузке или редактировании изображений продукта.
Тем не менее, на веб-интерфейсе я хотел бы отобразить это изображение. Поэтому я создал файл etc / view.xml в моем модуле со следующим содержимым:
<?xml version="1.0"?>
<view xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Esites_SEO:etc/custom.xsd">
<media>
<images module="Magento_Catalog">
<image id="opengraph_image" type="opengraph_image">
<width>265</width>
<height>265</height>
</image>
</images>
</media>
</view>
Но теперь я получаю следующую ошибку:
Invalid XML in file /var/www/html/vhosts/magento2/app/code/Esites/SEO/etc/view.xml:
Element 'image', attribute 'type': [facet 'enumeration'] The value 'opengraph_image' is not an element of the set {'thumbnail', 'small_image', 'image', 'swatch_image', 'swatch_thumb'}.
Line: 5
Element 'image', attribute 'type': 'opengraph_image' is not a valid value of the local atomic type.
Line: 5
Причина в том, что он не загружает мой custom.xsd, расположенный в: app/code/Esites/SEO/etc/custom.xsd
где я определяю opengraph_image. Вместо этого он просто загружает файл XSD по умолчанию:vendor/magento/framework/Config/etc/view.xsd
Содержимое моего custom.xsd является копией (для целей тестирования) этого оригинального view.xsd, где я добавил следующее в строку 75:
<xs:enumeration value="opengraph_image"/>
Веб-интерфейс работает без ошибок, если я включу строку выше в исходный файл view.xsd. Я следовал за документацией по адресу : http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html, и мои пути строятся в соответствии с информацией на этой странице. Кэш очищается несколько раз.
Чего мне не хватает?
module="Magento_Catalog"
наmodule="Esites_SEO"
?Ответы:
Magento2 нагрузки по умолчанию view.xsd потому что ConfigView чтения с использованием
lib/internal/Magento/Framework/Config/SchemaLocator.php
и возвращает значение по умолчаниюview.xsd
Я смог переопределить его, выполнив следующие действия:
Создайте определение плагина в
{MODULE}/etc/di.xml
Создать плагин в {MODULE} /Model/Plugin/SchemaLocator.php
Обновление для Magento 2.0. версия
lib/internal/Magento/Framework/Config/etc/view.xsd
в{MODULE}/etc/view.xsd
Для Magento 2.1. версия, Копировать
Vendor/Magento/Framework/Config/etc/view.xsd
в{MODULE}/etc/view.xsd
* Редактировать{MODULE}/etc/view.xsd
и добавить новый типmedia_attribute
источник
Magento\Framework\Config\Dom\UrnResolver
как есть места, где он используется напрямую, а не через негоSchemaLocator
.Это похоже на недостаток дизайна в сочетании с ошибкой Magento 2. Я создал отчет об ошибке здесь: https://github.com/magento/magento2/issues/10161
Если вы используете построитель изображений непосредственно в шаблоне для вывода opengraph_image, лучшим решением будет передача пользовательских атрибутов (используя
Magento\Catalog\Block\Product\ImageBuilder::setAttributes
, или третий параметрMagento\Catalog\Block\Product\View::getImage
).Однако это не сработает (учитывая мой отчет об ошибках), поэтому вам все равно придется переопределить метод ImageBuilder,
create
чтобы передать эти атрибуты в помощник по каталогу.источник
Есть более простой способ, чем ответ Ярослава. Можно изменить параметры конструктора на SchemaLocator в файле di.xml вашего модуля. Подобно:
Нет необходимости в плагине.
источник
Вам не нужно изменять или переопределять
view.xsd
, этот файл только для проверки.Недавно я реализовал свое решение, выполнив следующее: Создайте атрибут каталога изображений (скажем, новый идентификатор атрибута 162). Создав атрибут, вы сможете применить его к любому изображению каталога. Теперь вы должны применить к нему правильную модель и видимость переднего конца. Вы можете сделать это программно или следуя этому руководству.
Откройте вашу базу данных с помощью phpMyAdmin или MySQL и попробуйте отразить любой системный атрибут, например small_image
Перейдите
www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml
и добавьте свой новый тип изображения:www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
У меня получилось навести курсор на изображение в списке товаров категории, надеюсь, это поможет.
источник