Erweitern des complexType mit dem Namen "imageType" mit einem benutzerdefinierten Bildtyp

22

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

langezwieper
quelle
Haben Sie versucht Wechsel module="Magento_Catalog" zu module="Esites_SEO"?
Raphael bei Digital Pianism

Antworten:

9

Magento2 lädt standardmäßig view.xsd, da ConfigView Reader verwendet lib/internal/Magento/Framework/Config/SchemaLocator.phpund es standardmäßig zurückgibtview.xsd

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

Ich konnte es überschreiben, indem ich die folgenden Schritte befolge:

  • Erstellen Sie eine neue Erweiterung, zum Beispiel Magento_SampleMinimal
  • Erstellen Sie die Plugin-Definition in {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>
  • Erstelle ein Plugin in {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;
        }
    }

    Update für Magento 2.0. Ausführung

  • Kopieren lib/internal/Magento/Framework/Config/etc/view.xsdnach{MODULE}/etc/view.xsd

Für Magento 2.1. Version, KopierenVendor/Magento/Framework/Config/etc/view.xsdnach{MODULE}/etc/view.xsd * Bearbeiten{MODULE}/etc/view.xsdund neuen Typ hinzufügen vonmedia_attribute

Jaroslaw Woronoi
quelle
Ist das dein Ernst? Ist das der einzige Weg? Scheint übertrieben und wahrscheinlich lächerlich, dass Sie kein eigenes Image hinzufügen können, ohne Core XSD zu überschreiben
Erfan
Das ist die richtige Lösung. Vielen Dank für diesen Jaroslaw.
Medina
Das ist toll, danke! Ich würde jedoch empfehlen, das Plugin herumzuschreiben, Magento\Framework\Config\Dom\UrnResolverda es Orte gibt, die es direkt verwenden, anstatt es zu durchlaufen SchemaLocator.
Quickshiftin
0

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::setAttributesoder dem dritten Parameter von Magento\Catalog\Block\Product\View::getImage) zu übergeben.

Dies funktioniert jedoch nicht (aufgrund meines Fehlerberichts), sodass Sie die ImageBuilder- createMethode immer noch überschreiben müssen , um diese Attribute an den Catalog Image Helper zu übergeben.

Erfan
quelle
0

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:

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

Kein Plugin erforderlich.

David Stone
quelle
Beachten Sie, dass diese Lösung nur funktioniert, wenn Sie $ realPath als Argument in SchemaLocator haben. Hängt von der Magento 2 Version ab.
Pol Ravalitera
-1

Sie müssen view.xsddiese 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.

  1. Öffnen Sie Ihre Datenbank mit phpMyAdmin oder MySQL und versuchen Sie, alle Systemattribute wie small_image zu spiegeln

    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. Gehen Sie zu www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmlund fügen Sie Ihren neuen Bildtyp hinzu:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. Aktualisieren Sie die Vorlagendateien, indem Sie den neuen Bildtyp hinzufügen www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. Bereinigen Sie Ihren Cache und Sie werden es am Frontend sehen.

Es funktionierte für mich für ein Schwebebild auf der Kategorie Produktliste, hoffe diese Hilfe.

JROCA22
quelle
thx 7ochem, es ist mein erster richtiger post.
JROCA22,
Diese Lösung funktioniert nicht, da Magento den XSD
barbazul
@barbazul das ist nur, wenn Sie im Entwicklermodus sind, wenn ich mich richtig erinnere ..
Erfan
@Erfan Es könnte sein. Ich habe ehrlich gesagt nicht nachgesehen.
Trotzdem
Vielleicht ist es nicht die beste Vorgehensweise, aber es hat für mich
funktioniert