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