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.xsd
donde 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?
module="Magento_Catalog"
amodule="Esites_SEO"
?Respuestas:
Cargas Magento2 defecto view.xsd porque ConfigView lector usando
lib/internal/Magento/Framework/Config/SchemaLocator.php
y vuelve por defectoview.xsd
Pude anularlo siguiendo los pasos a continuación:
Cree la definición del complemento en
{MODULE}/etc/di.xml
Crear un complemento en {MODULE} /Model/Plugin/SchemaLocator.php
Actualización para Magento 2.0. versión
lib/internal/Magento/Framework/Config/etc/view.xsd
a{MODULE}/etc/view.xsd
Para Magento 2.1. versión, Copiar
Vendor/Magento/Framework/Config/etc/view.xsd
a{MODULE}/etc/view.xsd
* Editar{MODULE}/etc/view.xsd
y agregar un nuevo tipo demedia_attribute
fuente
Magento\Framework\Config\Dom\UrnResolver
ya que hay lugares que lo usan directamente en lugar de pasarSchemaLocator
.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 deMagento\Catalog\Block\Product\View::getImage
).Sin embargo, eso no funcionará (dado mi informe de errores), por lo que aún tendrá que anular el
create
método de ImageBuilder para pasar esos atributos al Ayudante de imagen de catálogo.fuente
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:
No es necesario un complemento.
fuente
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.
Abra su base de datos con phpMyAdmin o MySQL e intente reflejar cualquier atributo del sistema como small_image
Ve
www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml
y agrega tu nuevo tipo de imagen:www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
Me funcionó para una imagen flotante en la lista de productos de la categoría, espero esta ayuda.
fuente