Memperluas tipe kompleks bernama "imageType" dengan tipe gambar khusus

22

Tujuan dari modul yang saya kembangkan saat ini adalah untuk menambahkan jenis gambar khusus yang disebut "opengraph_image". Saya menambahkan atribut EAV baru melalui skrip InstallData.php saya yang berfungsi dengan baik. Ketika saya sekarang masuk ke backend Magento2 dan mengubah produk saya dapat memilih jenis gambar "opengraph_image" saat mengunggah atau mengedit gambar produk.

Namun, di frontend saya ingin menampilkan gambar ini. Karena itu saya membuat file etc / view.xml dalam modul saya dengan konten berikut:

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

Tapi sekarang saya mendapatkan kesalahan berikut:

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

Alasannya adalah sepertinya tidak memuat custom.xsd saya terletak di: di app/code/Esites/SEO/etc/custom.xsdmana saya mendefinisikan opengraph_image. Sebaliknya tampaknya hanya memuat file XSD default:vendor/magento/framework/Config/etc/view.xsd

Konten custom.xsd saya adalah salinan (untuk tujuan pengujian) dari view.xsd asli ini di mana saya menambahkan yang berikut pada baris 75:

 <xs:enumeration value="opengraph_image"/>

Frontend tidak berfungsi tanpa kesalahan jika saya menyertakan baris di atas dalam file view.xsd yang asli. Saya mengikuti dokumentasi di: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.html dan jalur saya dibuat sesuai dengan informasi pada halaman itu. Cache dihapus beberapa kali.

Apa yang saya lewatkan?

langezwieper
sumber
Apakah Anda mencoba mengubah module="Magento_Catalog" ke module="Esites_SEO"?
Raphael di Digital Pianism

Jawaban:

9

Beban Magento2 bawaan view.xsd karena ConfigView Pembaca menggunakan lib/internal/Magento/Framework/Config/SchemaLocator.phpdan mengembalikan standarview.xsd

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

Saya dapat menimpanya dengan mengikuti langkah-langkah di bawah ini:

  • Buat ekstensi baru misalnya Magento_SampleMinimal
  • Buat definisi plugin di {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>
  • Buat plugin di {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;
        }
    }

    Perbarui untuk Magento 2.0. versi

  • Salin lib/internal/Magento/Framework/Config/etc/view.xsdke{MODULE}/etc/view.xsd

Untuk Magento 2.1. versi, SalinVendor/Magento/Framework/Config/etc/view.xsdke{MODULE}/etc/view.xsd * Edit{MODULE}/etc/view.xsddan tambahkan tipe barumedia_attribute

Yaroslav Voronoy
sumber
Apakah Anda serius .. Apakah ini satu-satunya cara? Tampaknya berlebihan, dan mungkin konyol bahwa Anda tidak dapat menambahkan gambar Anda sendiri tanpa menimpa inti XSD
Erfan
Itu solusi yang tepat. Terima kasih banyak untuk Yaroslav itu.
medina
Ini bagus, terima kasih! Namun, saya akan merekomendasikan untuk menulis Plugin sekitar Magento\Framework\Config\Dom\UrnResolverkarena ada tempat yang menggunakannya secara langsung alih-alih melalui SchemaLocator.
quickshiftin
0

Ini tampaknya menjadi cacat desain, dikombinasikan dengan bug Magento 2. Saya telah membuat laporan bug di sini: https://github.com/magento/magento2/issues/10161

Jika Anda menggunakan pembuat gambar langsung di templat untuk menampilkan opengraph_image, solusi yang lebih baik adalah meneruskan atribut khusus (menggunakan Magento\Catalog\Block\Product\ImageBuilder::setAttributes, atau parameter ketiga Magento\Catalog\Block\Product\View::getImage).

Namun, itu tidak akan berhasil (diberi laporan bug saya), jadi Anda masih harus mengganti metode ImageBuilder createuntuk meneruskan atribut-atribut tersebut ke Katalog Image Helper.

Erfan
sumber
0

Ada cara yang lebih sederhana daripada jawaban Yaroslav. Dimungkinkan untuk mengubah parameter konstruktor ke SchemaLocator di di.xml modul Anda. Seperti:

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

Tidak perlu untuk Plugin.

David Stone
sumber
Hati-hati, solusi itu hanya berfungsi jika Anda memiliki $ realPath sebagai argumen di SchemaLocator. Tergantung pada versi Magento 2.
Pol Ravalitera
-1

Anda tidak perlu memodifikasi atau mengganti view.xsd, file ini hanya untuk validasi.
Saya baru-baru ini mengimplementasikan solusi saya dengan melakukan hal berikut: Buat atribut katalog gambar (katakanlah bahwa atribut ID baru 162). Setelah Anda membuat atribut, Anda akan dapat menerapkannya pada gambar katalog apa pun. Sekarang Anda harus menerapkan padanya model yang tepat dan visibilitas ujung depan. Anda dapat melakukannya secara terprogram atau mengikuti panduan ini.

  1. Buka database Anda dengan phpMyAdmin atau MySQL dan cobalah untuk mencerminkan atribut sistem apa pun seperti 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. Pergi ke www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmldan tambahkan jenis gambar baru Anda:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. Perbarui file template dengan menambahkan tipe gambar baru www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. Bersihkan cache Anda dan Anda akan melihatnya di ujung depan.

Ini bekerja untuk saya untuk mengarahkan gambar pada daftar produk kategori, harap bantuan ini.

JROCA22
sumber
thx 7ochem, Ini postingan pertamaku.
JROCA22
Solusi ini tidak berfungsi karena Magento aktif memvalidasi XSD
barbazul
@barbazul itu hanya jika Anda berada dalam mode pengembang jika saya ingat dengan benar ..
Erfan
@ Erfan Bisa jadi. Aku belum memeriksanya, jujur. Tapi tetap saja, itu adalah pertanda bahwa Anda tidak seharusnya melakukannya atau ada sesuatu yang salah dalam XSD khusus itu
barbazul
Mungkin ini bukan praktik terbaik tetapi berhasil bagi saya
JROCA22