Estensione di complexType denominato "imageType" con un tipo di immagine personalizzato


22

L'obiettivo di un modulo che sto attualmente sviluppando è quello di aggiungere un tipo di immagine personalizzato chiamato "opengraph_image". Ho aggiunto un nuovo attributo EAV attraverso il mio script InstallData.php che funziona bene. Quando accedo ora al backend Magento2 e modifico un prodotto, posso scegliere il tipo di immagine "opengraph_image" durante il caricamento o la modifica delle immagini del prodotto.

Tuttavia, sul frontend vorrei visualizzare questa immagine. Pertanto ho creato un file etc / view.xml nel mio modulo con il seguente contenuto:

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

Ma ora ricevo il seguente errore:

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

Il motivo è che non sembra caricare il mio custom.xsd che si trova in: app/code/Esites/SEO/etc/custom.xsddove definisco opengraph_image. Invece sembra semplicemente caricare il suo file XSD predefinito:vendor/magento/framework/Config/etc/view.xsd

Il contenuto del mio custom.xsd è una copia (a scopo di test) di questo view.xsd originale in cui ho aggiunto quanto segue alla riga 75:

 <xs:enumeration value="opengraph_image"/>

Il frontend funziona senza errori se includo la riga sopra nel file view.xsd originale. Ho seguito la documentazione su: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html e i miei percorsi sono costruiti in base alle informazioni in quella pagina. La cache viene cancellata più volte.

Cosa mi sto perdendo?


Hai provato a cambiare module="Magento_Catalog" in module="Esites_SEO"?
Raffaello al Pianismo digitale,

Risposte:


9

Carichi Magento2 di default view.xsd perché ConfigView Reader utilizzando lib/internal/Magento/Framework/Config/SchemaLocator.phpe ritorna di defaultview.xsd

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

Sono stato in grado di ignorarlo seguendo i passaggi seguenti:

  • Crea una nuova estensione, ad esempio Magento_SampleMinimal
  • Crea la definizione del plugin 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>
  • Crea 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;
        }
    }

    Aggiornamento per Magento 2.0. versione

  • Copia lib/internal/Magento/Framework/Config/etc/view.xsdin{MODULE}/etc/view.xsd

Per Magento 2.1. versione, CopiaVendor/Magento/Framework/Config/etc/view.xsdin{MODULE}/etc/view.xsd * Modifica{MODULE}/etc/view.xsde aggiungi un nuovo tipo dimedia_attribute


Sei serio ... È questo l'unico modo? Sembra eccessivo e probabilmente ridicolo che non puoi aggiungere la tua immagine senza sovrascrivere il nucleo XSD
Erfan,

Questa è la soluzione giusta. Grazie mille per quello Yaroslav.
medina,

Questo è fantastico grazie! Tuttavia, consiglierei di scrivere il Plugin in Magento\Framework\Config\Dom\UrnResolverquanto ci sono posti che lo usano direttamente invece di passare SchemaLocator.
cambio rapido il

0

Questo sembra essere un difetto di progettazione, in combinazione con un bug di Magento 2. Ho creato una segnalazione di bug qui: https://github.com/magento/magento2/issues/10161

Se stai utilizzando il generatore di immagini direttamente in un modello per produrre opengraph_image, una soluzione migliore è passare attributi personalizzati (usando Magento\Catalog\Block\Product\ImageBuilder::setAttributeso il terzo parametro di Magento\Catalog\Block\Product\View::getImage).

Tuttavia, ciò non funzionerà (dato il mio report bug), quindi dovrai comunque sostituire il createmetodo di ImageBuilder per passare quegli attributi al Catalog Image Helper.


0

C'è un modo più semplice della risposta di Yaroslav. È possibile modificare i parametri del costruttore in SchemaLocator nel di.xml del modulo. Piace:

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

Non è necessario un plug-in.


Attenzione, quella soluzione funziona solo se hai $ realPath come argomento in SchemaLocator. Dipende dalla versione di Magento 2.
Pol Ravalitera,

-1

Non è necessario modificare o sostituire view.xsd, questo file è solo per la convalida.
Di recente ho implementato una mia soluzione procedendo come segue: Crea un attributo del catalogo immagini (diciamo che il nuovo attributo ID 162). Una volta creato l'attributo, sarai in grado di applicarlo su qualsiasi immagine del catalogo. Ora devi applicare ad esso il modello giusto e la visibilità frontale. Puoi farlo a livello di codice o seguendo questa guida.

  1. Apri il tuo database con phpMyAdmin o MySQL e prova a eseguire il mirroring di qualsiasi attributo di sistema come small_image

    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. Vai a www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmle aggiungi il tuo nuovo tipo di immagine:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. Aggiorna i file modello aggiungendo il nuovo tipo di immagine www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. Pulisci la cache e la vedrai sul front-end.

Ha funzionato per me per un'immagine al passaggio del mouse sulla categoria di prodotti, spero che questo aiuto.


thx 7ochem, è il mio primo vero post.
JROCA22,

Questa soluzione non funziona poiché Magento sta convalidando attivamente l'XSD
barbazul

@barbazul è solo se sei in modalità sviluppatore se ricordo bene ..
Erfan,

@Erfan Potrebbe essere. Non ho controllato, onestamente. Tuttavia, è un segno che non è come dovresti farlo o che c'è qualcosa di sbagliato in quel particolare XSD
barbazul,

Forse non è la migliore pratica ma ha funzionato per me
JROCA22
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.