Розширення комплексного типу під назвою "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"/>

Frontend працює без помилок, якщо я включу рядок вище в оригінальний файл view.xsd. Я дотримувався документації на веб-сайті: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html і мої шляхи будуються відповідно до інформації на цій сторінці. Кеш очищається кілька разів.

Що я пропускаю?


Ви спробували перейти module="Magento_Catalog" на module="Esites_SEO"?
— Рафаель у Digital Pianism

Відповіді:


9

Magento2 завантажує за замовчуванням view.xsd, оскільки використовує програму ConfigView Reader 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

Це правильне рішення. Дякую купи за це Ярославу.
— medina

Це велике спасибі! Однак я б рекомендував писати плагін навколо, Magento\Framework\Config\Dom\UrnResolverоскільки є місця, які використовують його безпосередньо, а не перебирати SchemaLocator.
— скоромовка

0

Це здається вадою дизайну в поєднанні з помилкою Magento 2. Тут я створив звіт про помилки: https://github.com/magento/magento2/isissue/10161

Якщо ви використовуєте конструктор зображень безпосередньо в шаблоні для виведення opengraph_image, кращим рішенням є передача спеціальних атрибутів (з використанням Magento\Catalog\Block\Product\ImageBuilder::setAttributesабо третього параметра Magento\Catalog\Block\Product\View::getImage).

Однак це не спрацює (враховуючи мій повідомлення про помилку), тому вам все одно доведеться перекрити createметод ImageBuilder, щоб передати ці атрибути в Каталог помічників зображень.


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, цей файл призначений лише для перевірки.
Нещодавно я реалізував своє рішення, зробивши наступне: Створіть атрибут каталогу зображень (скажімо, що новий атрибут ID 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. Очистіть кеш, і ви побачите його на передній частині.

Для мене це спрацювало над наведенням зображення на лістинг продуктів категорії, сподіваюся, що це допоможе.


thx 7ochem, це моя перша реальна посада.
— JROCA22

Це рішення не працює, оскільки Magento активно перевіряє XSD
— barbazul

@barbazul, це лише в тому випадку, якщо ви перебуваєте в режимі розробника, якщо я пам'ятаю правильно ..
— Ерфан

@Erfan Це могло бути. Я не перевірив, чесно. Але все-таки це знак того, що це не так, як ви повинні це зробити, або що в цьому конкретному XSD щось не так
— barbazul

Можливо, це не найкраща практика, але це спрацювало для мене
— JROCA22
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.