Le but d'un module que je développe actuellement est d'ajouter un type d'image personnalisé appelé "opengraph_image". J'ai ajouté un nouvel attribut EAV via mon script InstallData.php qui fonctionne bien. Lorsque je me connecte maintenant au backend Magento2 et modifie un produit, je peux choisir le type d'image "opengraph_image" lors du téléchargement ou de la modification des images du produit.
Cependant, sur le frontend, je voudrais afficher cette image. J'ai donc créé un fichier etc / view.xml dans mon module avec le contenu suivant:
<?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>
Mais maintenant, j'obtiens l'erreur suivante:
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 raison en est qu'il ne semble pas charger mon custom.xsd situé dans: app/code/Esites/SEO/etc/custom.xsd
où je définis l'opengraph_image. Au lieu de cela, il semble simplement charger son fichier XSD par défaut:vendor/magento/framework/Config/etc/view.xsd
Le contenu de mon custom.xsd est une copie (à des fins de test) de ce view.xsd d'origine où j'ai ajouté ce qui suit à la ligne 75:
<xs:enumeration value="opengraph_image"/>
Le frontend fonctionne sans erreur si j'inclus la ligne ci-dessus dans le fichier view.xsd d'origine. J'ai suivi la documentation sur: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html et mes chemins sont construits selon les informations sur cette page. Le cache est effacé plusieurs fois.
Qu'est-ce que je rate?
module="Magento_Catalog"
pourmodule="Esites_SEO"
?Réponses:
Charges Magento2 par défaut view.xsd parce ConfigView Reader à l' aide
lib/internal/Magento/Framework/Config/SchemaLocator.php
et il retourne par défautview.xsd
J'ai pu le remplacer en suivant les étapes ci-dessous:
Créez la définition du plugin dans
{MODULE}/etc/di.xml
Créer un plugin dans {MODULE} /Model/Plugin/SchemaLocator.php
Mise à jour pour Magento 2.0. version
lib/internal/Magento/Framework/Config/etc/view.xsd
vers{MODULE}/etc/view.xsd
Pour Magento 2.1. version, copier
Vendor/Magento/Framework/Config/etc/view.xsd
vers{MODULE}/etc/view.xsd
* Modifier{MODULE}/etc/view.xsd
et ajouter un nouveau type demedia_attribute
la source
Magento\Framework\Config\Dom\UrnResolver
car il y a des endroits qui l'utilisent directement au lieu de le traverserSchemaLocator
.Cela semble être un défaut de conception, en combinaison avec un bug de Magento 2. J'ai créé un rapport de bogue ici: https://github.com/magento/magento2/issues/10161
Si vous utilisez le générateur d'image directement dans un modèle pour sortir l'image opengraph_image, une meilleure solution consiste à passer des attributs personnalisés (en utilisant
Magento\Catalog\Block\Product\ImageBuilder::setAttributes
, ou le troisième paramètre deMagento\Catalog\Block\Product\View::getImage
).Cependant, cela ne fonctionnera pas (compte tenu de mon rapport de bogue), vous devrez donc toujours remplacer la
create
méthode d' ImageBuilder pour transmettre ces attributs à l'aide d'image de catalogue.la source
Il existe un moyen plus simple que la réponse de Yaroslav. Il est possible de changer les paramètres du constructeur en SchemaLocator dans le di.xml de votre module. Comme:
Pas besoin de plugin.
la source
Vous n'avez pas besoin de modifier ou de remplacer
view.xsd
, ce fichier est juste pour la validation.J'ai récemment implémenté ma solution en procédant comme suit: Créez un attribut de catalogue d'images (disons que le nouvel attribut ID 162). Une fois que vous avez créé l'attribut, vous pourrez l'appliquer sur n'importe quelle image de catalogue. Vous devez maintenant lui appliquer le bon modèle et la bonne visibilité frontale. Vous pouvez le faire par programme ou en suivant ce guide.
Ouvrez votre base de données avec phpMyAdmin ou MySQL et essayez de refléter n'importe quel attribut système comme small_image
Accédez à
www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml
et ajoutez votre nouveau type d'image:www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
Cela a fonctionné pour moi pour une image de survol sur la liste des produits de la catégorie, espérons cette aide.
la source