Das Ziel eines Moduls, das ich gerade entwickle, ist das Hinzufügen eines benutzerdefinierten Bildtyps mit dem Namen "opengraph_image". Ich habe ein neues EAV-Attribut über mein InstallData.php-Skript hinzugefügt, das einwandfrei funktioniert. Wenn ich mich jetzt im Magento2-Backend anmelde und ein Produkt ändere, kann ich beim Hochladen oder Bearbeiten von Produktbildern den Bildtyp "opengraph_image" auswählen.
Am Frontend möchte ich jedoch dieses Bild anzeigen. Aus diesem Grund habe ich in meinem Modul eine etc / view.xml-Datei mit folgendem Inhalt erstellt:
<?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>
Aber jetzt bekomme ich folgenden Fehler:
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
Der Grund dafür ist, dass meine custom.xsd anscheinend nicht geladen wird. Sie befindet sich in: app/code/Esites/SEO/etc/custom.xsd
wo ich das opengraph_image definiere. Stattdessen scheint es nur die Standard-XSD-Datei zu laden:vendor/magento/framework/Config/etc/view.xsd
Der Inhalt meiner custom.xsd ist eine Kopie (zu Testzwecken) dieser ursprünglichen view.xsd, wobei ich in Zeile 75 Folgendes hinzugefügt habe:
<xs:enumeration value="opengraph_image"/>
Das Frontend funktioniert fehlerfrei, wenn ich die obige Zeile in die ursprüngliche view.xsd-Datei einbinde. Ich habe die Dokumentation unter http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html befolgt und meine Pfade werden gemäß den Informationen auf dieser Seite erstellt. Der Cache wird mehrmals geleert.
Was vermisse ich?
module="Magento_Catalog"
zumodule="Esites_SEO"
?Antworten:
Magento2 lädt standardmäßig view.xsd, da ConfigView Reader verwendet
lib/internal/Magento/Framework/Config/SchemaLocator.php
und es standardmäßig zurückgibtview.xsd
Ich konnte es überschreiben, indem ich die folgenden Schritte befolge:
Erstellen Sie die Plugin-Definition in
{MODULE}/etc/di.xml
Erstelle ein Plugin in {MODULE} /Model/Plugin/SchemaLocator.php
Update für Magento 2.0. Ausführung
lib/internal/Magento/Framework/Config/etc/view.xsd
nach{MODULE}/etc/view.xsd
Für Magento 2.1. Version, Kopieren
Vendor/Magento/Framework/Config/etc/view.xsd
nach{MODULE}/etc/view.xsd
* Bearbeiten{MODULE}/etc/view.xsd
und neuen Typ hinzufügen vonmedia_attribute
quelle
Magento\Framework\Config\Dom\UrnResolver
da es Orte gibt, die es direkt verwenden, anstatt es zu durchlaufenSchemaLocator
.Dies scheint ein Designfehler in Kombination mit einem Magento 2-Fehler zu sein. Ich habe hier einen Fehlerbericht erstellt: https://github.com/magento/magento2/issues/10161
Wenn Sie den Image Builder direkt in einer Vorlage verwenden, um das opengraph_image auszugeben, ist es eine bessere Lösung, benutzerdefinierte Attribute (mit
Magento\Catalog\Block\Product\ImageBuilder::setAttributes
oder dem dritten Parameter vonMagento\Catalog\Block\Product\View::getImage
) zu übergeben.Dies funktioniert jedoch nicht (aufgrund meines Fehlerberichts), sodass Sie die ImageBuilder-
create
Methode immer noch überschreiben müssen , um diese Attribute an den Catalog Image Helper zu übergeben.quelle
Es gibt einen einfacheren Weg als Jaroslaws Antwort. Es ist möglich, die Konstruktorparameter in der Datei di.xml Ihres Moduls in SchemaLocator zu ändern. Mögen:
Kein Plugin erforderlich.
quelle
Sie müssen
view.xsd
diese Datei weder ändern noch überschreiben . Sie dient lediglich der Validierung.Ich habe kürzlich eine meiner Lösungen folgendermaßen implementiert: Erstellen Sie ein Image-Katalog-Attribut (beispielsweise die neue Attribut-ID 162). Sobald Sie das Attribut erstellt haben, können Sie es auf jedes Katalogbild anwenden. Jetzt müssen Sie darauf das richtige Modell und die richtige Sichtbarkeit des Frontends anwenden. Sie können dies programmgesteuert oder anhand dieser Anleitung tun.
Öffnen Sie Ihre Datenbank mit phpMyAdmin oder MySQL und versuchen Sie, alle Systemattribute wie small_image zu spiegeln
Gehen Sie zu
www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xml
und fügen Sie Ihren neuen Bildtyp hinzu:www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
Es funktionierte für mich für ein Schwebebild auf der Kategorie Produktliste, hoffe diese Hilfe.
quelle