एक कस्टम छवि प्रकार के साथ "इमेजटेप" नाम के कॉम्प्लेक्स टाइप का विस्तार करना


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

इसका कारण यह है app/code/Esites/SEO/etc/custom.xsdकि मैं अपने 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"?
राफेल डिजिटल पियानिज़्म

जवाबों:


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 लगता है, और शायद हास्यास्पद है कि आप कोर XSD के बिना अपनी खुद की छवि नहीं जोड़ सकते हैं
Erfan

यही सही उपाय है। धन्यवाद उस यारोस्लाव के लिए ढेर।
22

यह बहुत धन्यवाद! हालाँकि, मैं प्लगिन को चारों ओर लिखने की सलाह दूंगा Magento\Framework\Config\Dom\UrnResolverक्योंकि ऐसी जगहें हैं जो सीधे जाने के बजाय इसका उपयोग करती हैं SchemaLocator
क्विकशिफ्टिन

0

यह एक डिजाइन दोष लगता है, एक Magento 2 बग के साथ संयोजन में। मैंने यहाँ एक बग रिपोर्ट बनाई है: https://github.com/magento/magento2/issues/10161

यदि आप opengraph_image को आउटपुट करने के लिए सीधे एक टेम्पलेट में इमेज बिल्डर का उपयोग कर रहे हैं, तो एक बेहतर समाधान कस्टम विशेषताओं (उपयोग करना Magento\Catalog\Block\Product\ImageBuilder::setAttributes, या तीसरे पैरामीटर Magento\Catalog\Block\Product\View::getImage) में पास करना है।

हालाँकि, यह काम नहीं करेगा (मेरा बगरेपोर्ट दिया गया है), इसलिए आपको createकैटलॉग इमेज हेल्पर को उन विशेषताओं में पास करने के लिए इमेजब्यूस्टल की विधि को अभी भी ओवरराइड करना होगा।


0

यारोस्लाव के उत्तर की तुलना में एक सरल तरीका है। अपने मॉड्यूल के 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>

कोई प्लगइन की जरूरत है।


खबरदार, यह समाधान केवल तभी काम करता है जब आपके पास स्कीमालेक्टर में तर्क के रूप में $ $ वास्तविक है। Magento 2 संस्करण पर निर्भर करता है।
पोल रावलतीरा

-1

आपको संशोधित या ओवरराइड करने की आवश्यकता नहीं है view.xsd, यह फ़ाइल केवल सत्यापन के लिए है।
मैंने हाल ही में निम्न करके अपना समाधान लागू किया है: एक छवि कैटलॉग विशेषता बनाएं (मान लें कि नई विशेषता आईडी 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. अपना कैश साफ़ करें और आप इसे फ्रंट एंड पर देखेंगे।

इसने श्रेणी उत्पाद लिस्टिंग पर एक होवर छवि के लिए मेरे लिए काम किया, आशा है कि यह मदद करेगा।


thx 7ochem, यह मेरी पहली वास्तविक पोस्ट है।
JROCA22

यह समाधान काम नहीं करता है क्योंकि Magento सक्रिय रूप से XSD
बारबज़ुल

@barbazul केवल तभी यदि आप डेवलपर मोड में हैं यदि मैं सही ढंग से याद करूं ..
Erfan

@ इरफान यह हो सकता है। मैंने ईमानदारी से जाँच नहीं की है। लेकिन फिर भी, यह एक संकेत है कि यह नहीं है कि आप इसे कैसे करने वाले हैं या यह कि विशेष रूप से XSD में कुछ गड़बड़ है
barbazul

शायद यह सबसे अच्छा अभ्यास नहीं है, लेकिन मेरे लिए यह काम किया
JROCA22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.