Расширение complexType с именем «imageType» с помощью пользовательского типа изображения

22

Цель модуля, который я сейчас разрабатываю, - добавить пользовательский тип изображения с именем "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, и мои пути строятся в соответствии с информацией на этой странице. Кэш очищается несколько раз.

Чего мне не хватает?

langezwieper
источник
Вы пытались перейти module="Magento_Catalog" на module="Esites_SEO"?
Рафаэль на цифровом пианизме

Ответы:

9

Magento2 нагрузки по умолчанию view.xsd потому что ConfigView чтения с использованием lib/internal/Magento/Framework/Config/SchemaLocator.phpи возвращает значение по умолчаниюview.xsd

$this->schema = $urnResolver
    ->getRealPath('urn:magento:framework:Config/etc/view.xsd');`

Я смог переопределить его, выполнив следующие действия:

  • Создайте новое расширение, например, Magento_SampleMinimal
  • Создайте определение плагина в {MODULE}/etc/di.xml

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="Magento\Framework\Config\SchemaLocator">
            <plugin name="SampleMinimal_SchemaLocator" type="Magento\SampleMinimal\Model\Plugin\SchemaLocator" sortOrder="1"/>
        </type>
    </config>
  • Создать плагин в {MODULE} /Model/Plugin/SchemaLocator.php

    <?php
    namespace Magento\SampleMinimal\Model\Plugin;
    
    use Magento\TestFramework\ObjectManager;
    
    class SchemaLocator
    {
        /**
         * After Get Schema
         *
         * @param \Magento\Framework\Config\SchemaLocator $schemaLocator
         * @param string $result
         * @return array
         */
        public function afterGetSchema(\Magento\Framework\Config\SchemaLocator $schemaLocator, $result)
        {
            $result = sprintf(realpath(__DIR__ . '/../../etc/view.xsd'));
            return $result;
        }
    }

    Обновление для 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

Ярослав Вороной
источник
Ты серьезно .. Это единственный способ? Кажется излишним, и, вероятно, смешным, что вы не можете добавить свой собственный образ, не переписав ядро ​​XSD
Erfan
Это правильное решение. Спасибо огромное за это Ярослав.
Медина
Это здорово, спасибо! Тем не менее, я бы порекомендовал написать плагин, так Magento\Framework\Config\Dom\UrnResolverкак есть места, где он используется напрямую, а не через него SchemaLocator.
quickshiftin
0

Это похоже на недостаток дизайна в сочетании с ошибкой 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чтобы передать эти атрибуты в помощник по каталогу.

Erfan
источник
0

Есть более простой способ, чем ответ Ярослава. Можно изменить параметры конструктора на SchemaLocator в файле di.xml вашего модуля. Подобно:

<type name="Magento\Framework\Config\SchemaLocator" >
    <arguments>
        <argument name="realPath" xsi:type="string">urn:magento:module:VendorName_ModuleName:etc/view.xsd</argument>
    </arguments>
</type>

Нет необходимости в плагине.

Дэвид Стоун
источник
Помните, что это решение работает, только если у вас есть аргумент $ realPath в SchemaLocator. Зависит от версии Magento 2.
Пол Равалитера
-1

Вам не нужно изменять или переопределять view.xsd, этот файл только для проверки.
Недавно я реализовал свое решение, выполнив следующее: Создайте атрибут каталога изображений (скажем, новый идентификатор атрибута 162). Создав атрибут, вы сможете применить его к любому изображению каталога. Теперь вы должны применить к нему правильную модель и видимость переднего конца. Вы можете сделать это программно или следуя этому руководству.

  1. Откройте вашу базу данных с помощью phpMyAdmin или MySQL и попробуйте отразить любой системный атрибут, например small_image

    use magento2_database_name;
    SELECT * FROM  `eav_attribute`;
    UPDATE `magento2_database_name`.`eav_attribute` SET `frontend_model` = 'Magento\\Catalog\\Model\\Product\\Attribute\\Frontend\\Image' WHERE  `eav_attribute`.`attribute_id` =162;
    SELECT * FROM  `catalog_eav_attribute`;
    UPDATE `magento2_database_name`.`catalog_eav_attribute` SET `is_visible` = '1', 'using_in_product_listing' = '1' WHERE `catalog_eav_attribute`.`attribute_id` =162;
  2. Перейдите www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmlи добавьте свой новый тип изображения:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. Обновите файлы шаблона, добавив новый тип изображения на www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. Очистите кеш, и вы увидите его на переднем крае.

У меня получилось навести курсор на изображение в списке товаров категории, надеюсь, это поможет.

JROCA22
источник
thx 7ochem, это мой первый настоящий пост.
JROCA22
Это решение не работает, так как Magento активно
проверяет
@barbazul, это только если вы в режиме разработчика, если я правильно помню ...
Эрфан
@ Эрфан Это может быть. Я не проверял, честно. Но, тем не менее, это признак того, что это не то, как вы должны это делать, или что в этом конкретном XSD что-то не так
barbazul
Может быть, это не лучшая практика, но она сработала для меня
JROCA22