O objetivo de um módulo que estou desenvolvendo atualmente é adicionar um tipo de imagem personalizado chamado "opengraph_image". Eu adicionei um novo atributo EAV no meu script InstallData.php, que funciona bem. Quando agora faço login no back-end do Magento2 e altero um produto, posso escolher o tipo de imagem "opengraph_image" enquanto carrega ou edita imagens do produto.
No entanto, no front-end, eu gostaria de exibir esta imagem. Portanto, criei um arquivo etc / view.xml no meu módulo com o seguinte conteúdo:
<?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>
Mas agora eu recebo o seguinte erro:
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
O motivo é que ele não parece carregar meu custom.xsd localizado em: app/code/Esites/SEO/etc/custom.xsd
onde eu defino o opengraph_image. Em vez disso, parece carregar apenas o arquivo XSD padrão:vendor/magento/framework/Config/etc/view.xsd
O conteúdo do meu custom.xsd é uma cópia (para fins de teste) deste view.xsd original, onde adicionei o seguinte na linha 75:
<xs:enumeration value="opengraph_image"/>
O front-end funciona sem erros se eu incluir a linha acima no arquivo view.xsd original. Segui a documentação em: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html e meus caminhos são construídos de acordo com as informações nessa página. O cache é limpo várias vezes.
o que estou perdendo?
module="Magento_Catalog"
paramodule="Esites_SEO"
?Respostas:
O Magento2 carrega o view.xsd padrão porque o ConfigView Reader está usando
lib/internal/Magento/Framework/Config/SchemaLocator.php
e retorna o padrãoview.xsd
Consegui substituí-lo seguindo as etapas abaixo:
Crie a definição de plug-in em
{MODULE}/etc/di.xml
Crie um plugin no {MODULE} /Model/Plugin/SchemaLocator.php
Atualização para Magento 2.0. versão
lib/internal/Magento/Framework/Config/etc/view.xsd
para{MODULE}/etc/view.xsd
Para o Magento 2.1. versão, Copie
Vendor/Magento/Framework/Config/etc/view.xsd
para{MODULE}/etc/view.xsd
* Editar{MODULE}/etc/view.xsd
e adicione um novo tipo demedia_attribute
fonte
Magento\Framework\Config\Dom\UrnResolver
pois existem lugares que o usam diretamente em vez de passarSchemaLocator
.Isso parece ser uma falha de design, em combinação com um bug do Magento 2. Eu criei um relatório de erro aqui: https://github.com/magento/magento2/issues/10161
Se você estiver usando o construtor de imagens diretamente em um modelo para gerar a opengraph_image, uma solução melhor é passar atributos personalizados (usando
Magento\Catalog\Block\Product\ImageBuilder::setAttributes
ou o terceiro parâmetro deMagento\Catalog\Block\Product\View::getImage
).No entanto, como isso não funcionará (dado meu relatório de erros), você ainda precisará substituir o
create
método do ImageBuilder para passar esses atributos para o Auxiliar de Imagem do Catálogo.fonte
Existe uma maneira mais simples do que a resposta de Yaroslav. É possível alterar os parâmetros do construtor para SchemaLocator no di.xml do seu módulo. Gostar:
Não há necessidade de um plug-in.
fonte
Você não precisa modificar ou substituir
view.xsd
, este arquivo é apenas para validação.Eu recentemente implementei uma solução my, fazendo o seguinte: Crie um atributo de catálogo de imagens (digamos que o novo atributo ID 162). Depois de criar o atributo, você poderá aplicá-lo em qualquer imagem de catálogo. Agora você deve aplicar a ele o modelo certo e a visibilidade do front end. Você pode fazer isso de forma programática ou seguindo este guia.
Abra seu banco de dados com phpMyAdmin ou MySQL e tente espelhar qualquer atributo do sistema como small_image
Vá para
www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml
e adicione seu novo tipo de imagem:www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
Funcionou para mim para uma imagem instantânea na lista de produtos da categoria, espero que ajude.
fonte