ขยาย complexType ที่ชื่อว่า“ imageType” ด้วยประเภทรูปภาพที่กำหนดเอง


22

เป้าหมายของโมดูลที่ฉันกำลังพัฒนาอยู่ก็คือการเพิ่มประเภทภาพที่กำหนดเองที่เรียกว่า "opengraph_image" ฉันเพิ่มคุณลักษณะ EAV ใหม่แม้ว่าสคริปต์ InstallData.php ของฉันซึ่งใช้งานได้ดี เมื่อฉันเข้าสู่ระบบแบ็กเอนด์ Magento2 และแก้ไขผลิตภัณฑ์ฉันสามารถเลือกประเภทภาพ "opengraph_image" ในขณะที่อัพโหลดหรือแก้ไขภาพผลิตภัณฑ์

อย่างไรก็ตามในส่วนหน้าฉันต้องการแสดงภาพนี้ ดังนั้นฉันจึงสร้างไฟล์ etc / view.xml ในโมดูลของฉันด้วยเนื้อหาดังต่อไปนี้:

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

แต่ตอนนี้ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

เหตุผลก็คือดูเหมือนว่าไม่ได้โหลด custom.xsd ของฉันอยู่ใน: app/code/Esites/SEO/etc/custom.xsdที่ฉันกำหนด opengraph_image ดูเหมือนว่าจะโหลดไฟล์ XSD เป็นค่าเริ่มต้นแทน:vendor/magento/framework/Config/etc/view.xsd

เนื้อหาของ custom.xsd ของฉันเป็นสำเนา (สำหรับจุดประสงค์ในการทดสอบ) ของ view.xsd ดั้งเดิมนี้ซึ่งฉันเพิ่มสิ่งต่อไปนี้ในบรรทัดที่ 75:

 <xs:enumeration value="opengraph_image"/>

ส่วนหน้าทำงานได้โดยไม่มีข้อผิดพลาดหากฉันรวมบรรทัดด้านบนไว้ในไฟล์ view.xsd ดั้งเดิม ฉันติดตามเอกสารเกี่ยวกับ: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/XSD-XML-validation.htmlและเส้นทางของฉันจะถูกสร้างตามข้อมูลในหน้านั้น ล้างแคชหลายครั้ง

ฉันพลาดอะไรไป


คุณลองเปลี่ยนmodule="Magento_Catalog" ไปmodule="Esites_SEO"ไหม?
Raphael ที่ Digital Pianism

คำตอบ:


9

โหลด Magento2 เริ่มต้นview.xsdเพราะ ConfigView อ่านใช้lib/internal/Magento/Framework/Config/SchemaLocator.phpและก็จะส่งกลับค่าเริ่มต้นview.xsd

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

ฉันสามารถลบล้างได้โดยทำตามขั้นตอนด้านล่าง:

  • สร้างส่วนขยายใหม่เช่นMagento_SampleMinimal
  • สร้างคำนิยามปลั๊กอิน {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>
  • สร้างปลั๊กอินใน {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;
        }
    }

    อัพเดท สำหรับ Magento 2.0 รุ่น

  • คัดลอกlib/internal/Magento/Framework/Config/etc/view.xsdไปยัง{MODULE}/etc/view.xsd

สำหรับ Magento 2.1 เวอร์ชั่น คัดลอกVendor/Magento/Framework/Config/etc/view.xsdไปที่{MODULE}/etc/view.xsd * แก้ไข{MODULE}/etc/view.xsdและเพิ่มประเภทใหม่media_attribute


คุณจริงจัง .. นี่เป็นวิธีเดียวหรือไม่ ดูเหมือน overkill และอาจไร้สาระที่คุณไม่สามารถเพิ่มภาพของคุณเองโดยไม่ได้เขียนทับ core XSD
Erfan

นั่นคือทางออกที่ถูกต้อง ขอบคุณมากสำหรับยาโรสลาฟนั้น
medina

ขอบคุณมาก! แต่ผมจะแนะนำการเขียนปลั๊กอินที่อยู่รอบ ๆที่มีสถานที่ที่ใช้งานได้โดยตรงแทนจะผ่านMagento\Framework\Config\Dom\UrnResolver SchemaLocator
quickshiftin

0

นี่ดูเหมือนจะเป็นข้อบกพร่องในการออกแบบร่วมกับข้อบกพร่อง Magento 2 ฉันได้สร้างรายงานข้อผิดพลาดที่นี่: https://github.com/magento/magento2/issues/10161

หากคุณใช้ตัวสร้างรูปภาพโดยตรงในเทมเพลตเพื่อส่งออก opengraph_image ทางออกที่ดีกว่าคือการส่งผ่านแอตทริบิวต์ที่กำหนดเอง (โดยใช้ Magento\Catalog\Block\Product\ImageBuilder::setAttributesหรือพารามิเตอร์ที่สามของMagento\Catalog\Block\Product\View::getImage)

อย่างไรก็ตามนั่นใช้ไม่ได้ (ให้ bugreport ของฉัน) ดังนั้นคุณจะยังต้องแทนที่createวิธีการของ ImageBuilder เพื่อส่งต่อไปยังแอตทริบิวต์เหล่านั้นไปที่ Catalog Image Helper


0

มีวิธีที่ง่ายกว่าคำตอบของยาโรสลาฟ เป็นไปได้ที่จะเปลี่ยนพารามิเตอร์คอนสตรัคเตอร์เป็น SchemaLocator ในโมดูล di.xml ของคุณ ชอบ:

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

ไม่จำเป็นต้องใช้ปลั๊กอิน


ระวังโซลูชันนั้นจะทำงานเฉพาะเมื่อคุณมี $ realPath เป็นอาร์กิวเมนต์ใน SchemaLocator ขึ้นอยู่กับรุ่น Magento 2
Pol Ravalitera

-1

คุณไม่จำเป็นต้องแก้ไขหรือลบล้างview.xsdไฟล์นี้เป็นเพียงการตรวจสอบความถูกต้อง
เมื่อเร็ว ๆ นี้ฉันได้ติดตั้งโซลูชันของฉันโดยทำสิ่งต่อไปนี้: สร้างแอตทริบิวต์แคตตาล็อกรูปภาพ (สมมติว่าแอตทริบิวต์ใหม่ ID 162) เมื่อคุณสร้างแอททริบิวคุณจะสามารถนำไปใช้กับภาพแคตตาล็อกใด ๆ ตอนนี้คุณต้องนำไปใช้กับรูปแบบที่ถูกต้องและการมองเห็นส่วนหน้า คุณสามารถทำได้โดยทางโปรแกรมหรือทำตามคำแนะนำนี้

  1. เปิดฐานข้อมูลของคุณด้วย phpMyAdmin หรือ MySQL และลองทำมิเรอร์แอททริบิวของระบบเช่น 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. ไปที่www_root/magento2_root/app/design/frontend/Theme/package/etc/view.xmlและเพิ่มประเภทภาพใหม่ของคุณ:

        <image id="opengraph_image" type="opengraph_image">
            <width>265</width>
            <height>265</height>
        </image>
  3. อัปเดตไฟล์เทมเพลตโดยการเพิ่มประเภทภาพใหม่ www_root/magento2_root/app/design/frontend/Theme/package/Magento_Catalog/templates/product/
  4. ทำความสะอาดแคชของคุณและคุณจะเห็นมันในส่วนหน้า

มันทำงานสำหรับฉันสำหรับภาพโฮเวอร์ในรายการผลิตภัณฑ์หมวดหมู่หวังว่าจะช่วยได้


ขอบคุณ 7ochem มันเป็นโพสต์แรกของฉัน
JROCA22

วิธีนี้ไม่ได้ผลเนื่องจาก Magento กำลังตรวจสอบ XSD อย่างแข็งขัน
barbazul

@barbazul นั่นก็ต่อเมื่อคุณอยู่ในโหมดนักพัฒนาซอฟต์แวร์ถ้าฉันจำได้ถูกต้อง ..
Erfan

@Erfan มันอาจจะเป็น ฉันไม่ได้ตรวจสอบด้วยความสัตย์จริง แต่ถึงกระนั้นก็เป็นสัญญาณว่ามันไม่ใช่วิธีที่คุณควรจะทำหรือว่ามีบางอย่างผิดปกติใน XSD นั้น
barbazul

อาจไม่ใช่วิธีปฏิบัติที่ดีที่สุด แต่ใช้งานได้สำหรับฉัน
JROCA22
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.