Extender el complexType llamado "imageType" con un tipo de imagen personalizada

22

El objetivo de un módulo que estoy desarrollando actualmente es agregar un tipo de imagen personalizada llamada "opengraph_image". Agregué un nuevo atributo EAV a través de mi script InstallData.php que funciona bien. Cuando ahora inicio sesión en el backend de Magento2 y modifico un producto, puedo elegir el tipo de imagen "opengraph_image" al cargar o editar imágenes del producto.

Sin embargo, en la interfaz me gustaría mostrar esta imagen. Por lo tanto, creé un archivo etc / view.xml en mi módulo con el siguiente contenido:

<?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>

Pero ahora me sale el siguiente error:

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

La razón es que no parece cargar mi custom.xsd ubicado en: app/code/Esites/SEO/etc/custom.xsddonde defino opengraph_image. En cambio, parece cargar su archivo XSD predeterminado:vendor/magento/framework/Config/etc/view.xsd

El contenido de mi custom.xsd es una copia (para fines de prueba) de este view.xsd original donde agregué lo siguiente en la línea 75:

 <xs:enumeration value="opengraph_image"/>

La interfaz funciona sin errores si incluyo la línea anterior en el archivo view.xsd original. Seguí la documentación en: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html y mis rutas se compilan de acuerdo con la información de esa página. La memoria caché se borra varias veces.

¿Qué me estoy perdiendo?

langezwieper
fuente
¿Intentaste cambiar module="Magento_Catalog" a module="Esites_SEO"?
Raphael en Digital Pianism

Respuestas:

9

Cargas Magento2 defecto view.xsd porque ConfigView lector usando lib/internal/Magento/Framework/Config/SchemaLocator.phpy vuelve por defectoview.xsd

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

Pude anularlo siguiendo los pasos a continuación:

  • Crear una nueva extensión, por ejemplo Magento_SampleMinimal
  • Cree la definición del complemento en {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>
  • Crear un complemento en {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;
        }
    }

    Actualización para Magento 2.0. versión

  • Copiar lib/internal/Magento/Framework/Config/etc/view.xsda{MODULE}/etc/view.xsd

Para Magento 2.1. versión, CopiarVendor/Magento/Framework/Config/etc/view.xsda{MODULE}/etc/view.xsd * Editar{MODULE}/etc/view.xsdy agregar un nuevo tipo demedia_attribute

Yaroslav Voronoy
fuente
¿Hablas en serio? ¿Es esta la única forma? Parece excesivo, y probablemente ridículo que no pueda agregar su propia imagen sin sobrescribir el núcleo XSD
Erfan
Esa es la solución correcta. Muchas gracias por ese Yaroslav.
medina
¡Esto es genial, gracias! Sin embargo, recomendaría escribir el complemento Magento\Framework\Config\Dom\UrnResolverya que hay lugares que lo usan directamente en lugar de pasar SchemaLocator.
quickshiftin
0

Esto parece ser un defecto de diseño, en combinación con un error de Magento 2. He creado un informe de error aquí: https://github.com/magento/magento2/issues/10161

Si está utilizando el generador de imágenes directamente en una plantilla para generar la imagen gráfica abierta, una mejor solución es pasar atributos personalizados (utilizando Magento\Catalog\Block\Product\ImageBuilder::setAttributes, o el tercer parámetro de Magento\Catalog\Block\Product\View::getImage).

Sin embargo, eso no funcionará (dado mi informe de errores), por lo que aún tendrá que anular el createmétodo de ImageBuilder para pasar esos atributos al Ayudante de imagen de catálogo.

Erfan
fuente
0

Hay una manera más simple que la respuesta de Yaroslav. Es posible cambiar los parámetros del constructor a SchemaLocator en di.xml de su módulo. Me gusta:

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

No es necesario un complemento.

David Stone
fuente
Tenga cuidado, esa solución funciona solo si tiene $ realPath como argumento en SchemaLocator. Depende de la versión de Magento 2.
Pol Ravalitera
-1

No necesita modificar o anular view.xsd, este archivo es solo para validación.
Recientemente he implementado mi solución haciendo lo siguiente: Crear un atributo de catálogo de imágenes (digamos que el nuevo ID de atributo 162). Una vez que haya creado el atributo, podrá aplicarlo en cualquier imagen de catálogo. Ahora debe aplicarle el modelo correcto y la visibilidad frontal. Puede hacerlo mediante programación o siguiendo esta guía.

  1. Abra su base de datos con phpMyAdmin o MySQL e intente reflejar cualquier atributo del sistema como 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. Ve www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmly agrega tu nuevo tipo de imagen:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. Actualice los archivos de plantilla agregando el nuevo tipo de imagen en www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. Limpie su caché y lo verá en la parte frontal.

Me funcionó para una imagen flotante en la lista de productos de la categoría, espero esta ayuda.

JROCA22
fuente
THX 7ochem, es mi primera publicación real.
JROCA22
Esta solución no funciona ya que Magento está validando activamente el XSD
barbazul
@barbazul eso es solo si estás en modo desarrollador si recuerdo correctamente ..
Erfan
@Erfan Podría ser. No lo he comprobado, sinceramente. Pero aún así, es una señal de que no es así como se supone que debes hacerlo o que hay algo mal en ese XSD en particular
barbazul
Tal vez no sea la mejor práctica, pero funcionó para mí
JROCA22