सशर्त आवश्यकताएँJs विन्यास (लोड आवश्यकता-config.js प्रोग्रामेटिक रूप से?)


15

मैं केवल कुछ शर्तों (उदाहरण के लिए, कॉन्फ़िगरेशन पर आधारित) पर एक आवश्यकता के घटक को बदलना चाहूंगा। क्या मेरे मॉड्यूल requirejs-config.jsया इसे प्राप्त करने के लिए एक अलग तरीके से प्रोग्राम को लोड करने से रोकने का कोई तरीका है?


1
क्या आपको इस समस्या का हल मिला?
स्टीवंसागेर


2
अगर मुझे एक मिलता है, तो मैं यहां एक जवाब
जोड़ूंगा

3
@ यदि कोई 2.2 या 2.3 का समाधान है तो मुझे भी खुशी होगी: D ने टैग्स को अपडेट किया। इसके अलावा, इनाम के लिए धन्यवाद!
फैबियन शेंगलर

2
आप विक्रेता में getConfig समारोह को फिर से लिखने / Magento / रूपरेखा / RequireJs / config.php करने की कोशिश की है या आप requirejs में लिखने प्लगइन्स की जरूरत requirejs.org/docs/plugins.html
अरशद एम

जवाबों:


5

@ अरशद एम टिप्पणी के आधार पर, आप एक 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">

    <preference for="Magento\Framework\RequireJs\Config" type="<Vendor>\<ModuleName>\RequireJs\Config"/>

</config>

और <विक्रेता> \ <मॉड्यूलनाम> \ आवश्यकताएँ \ कॉन्फिग में। अपनी स्थिति और मॉड्यूल नाम को जोड़ने के लिए getConfig फ़ंक्शन को ओवरराइड करें जो आप चाहते हैं कि लोड नहीं किया जाए (संभवतः ScopeChigigterterter से):

   <?php

namespace <Vendor>\<ModuleName>\RequireJs;

use Magento\Framework\Filesystem\File\ReadFactory;
use Magento\Framework\View\Asset\Minification;
use Magento\Framework\View\Asset\RepositoryMap;

class Config extends \Magento\Framework\RequireJs\Config
{
    /**
     * @var \Magento\Framework\RequireJs\Config\File\Collector\Aggregated
     */
    private $fileSource;
    /**
     * @var ReadFactory
     */
    private $readFactory;
    /**
     * @var \Magento\Framework\Code\Minifier\AdapterInterface
     */
    private $minifyAdapter;
    /**
     * @var Minification
     */
    private $minification;
    /**
     * @var \Magento\Framework\View\DesignInterface
     */
    private $design;

    public function __construct(\Magento\Framework\RequireJs\Config\File\Collector\Aggregated $fileSource, \Magento\Framework\View\DesignInterface $design, ReadFactory $readFactory, \Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\Code\Minifier\AdapterInterface $minifyAdapter, Minification $minification, RepositoryMap $repositoryMap)
    {
        parent::__construct($fileSource, $design, $readFactory, $assetRepo, $minifyAdapter, $minification, $repositoryMap);
        $this->fileSource = $fileSource;
        $this->readFactory = $readFactory;
        $this->minifyAdapter = $minifyAdapter;
        $this->minification = $minification;
        $this->design = $design;
    }

    public function getConfig()
    {
        $distributedConfig = '';
        $customConfigFiles = $this->fileSource->getFiles($this->design->getDesignTheme(), self::CONFIG_FILE_NAME);
        foreach ($customConfigFiles as $file) {
            //Your condition
            if(true){
                if($file->getModule() == "Vendor_ModuleName"){
                    continue;
                }
            }

            /** @var $fileReader \Magento\Framework\Filesystem\File\Read */
            $fileReader = $this->readFactory->create($file->getFileName(), \Magento\Framework\Filesystem\DriverPool::FILE);
            $config = $fileReader->readAll($file->getName());


            $distributedConfig .= str_replace(
                ['%config%', '%context%'],
                [$config, $file->getModule()],
                self::PARTIAL_CONFIG_TEMPLATE
            );
        }

        $fullConfig = str_replace(
            ['%function%', '%usages%'],
            [$distributedConfig],
            self::FULL_CONFIG_TEMPLATE
        );


        if ($this->minification->isEnabled('js')) {
            $fullConfig = $this->minifyAdapter->minify($fullConfig);
        }

        return $fullConfig;
    }
}

अपडेट करें

@ एलेक्स और @ डैनियल की टिप्पणियों के बाद: आप मैगेंटो \ फ्रेमवर्क \ आवश्यकताएँ \ विन्यास \ फ़ाइल \ कलेक्टर \ एग्रीगेट से गेटफाइल्स के लिए एक प्लगइन बना सकते हैं, इसलिए इस दृष्टिकोण के साथ नया 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\RequireJs\Config\File\Collector\Aggregated">
        <plugin name="requirejsConfigPlugin"
                type="<Vendor>\<ModuleName>\Plugin\RequireJs\AfterFiles"
                sortOrder="100"
        />
    </type>
</config>

और \ <विक्रेता> \ <मॉड्यूलनाम> \ प्लगिन \ आवश्यकताएँ \ AfterFiles पर, आप अपनी स्थिति और मॉड्यूल सेट कर सकते हैं कि आवश्यकताएं लोड नहीं होंगी:

<?php

namespace <Vendor>\<ModuleName>\Plugin\RequireJs;

class AfterFiles
{
    public function afterGetFiles(
        \Magento\Framework\RequireJs\Config\File\Collector\Aggregated $subject,
        $result
    ){
        //Your condition
        if(true) {
            foreach ($result as $key => &$file) {
                //Module to exclude
                if ($file->getModule() == "Vendor_OtherModuleName") {
                    unset($result[$key]);
                }
            }
        }
        return $result;
    }
}

अच्छा! मुझे लगता है कि हम $ fullConfig = जनक :: getConfig () द्वारा सुधार कर सकते हैं और फिर कम कोड को कॉपी और पेस्ट करने के लिए $ fullConfig को संशोधित कर सकते हैं। तुम क्या सोचते हो? हो सकता है कि हमें इसके लिए जीथब पर एक मिनी-फॉस-मॉड्यूल बनाना चाहिए?
एलेक्स

1
या $ यह कर सकते हैं-> fileSource-> getFiles के बजाय फिर से लिखा जा सकता है? बस बहुत कोड की नकल नहीं करने के लिए ...
एलेक्स

3
@ एलेक्स आप एक प्लगइन का उपयोग कर aroundGetConfig()सकते हैं afterGetConfig()और सशर्त लोडिंग को प्राप्त करने के लिए एक विधि या विधि का उपयोग कर सकते हैं, फिर हमें इसे अधिलेखित करने की आवश्यकता नहीं है
डैनियल

होनहार लग रहा है, धन्यवाद! मैंने पहले ही
उत्थान

2
@ आपके सुझाव पर अमल करते हुए मैंने जीथब में एक छोटा मॉड्यूल बनाया, जहां आप मैग्नेटो बेंड के माध्यम से रिक्वायरज को निष्क्रिय करने के लिए मॉड्यूल का चयन कर सकते हैं। इसे देखें और शायद योगदान github.com/MNGemignani/magento2_requirejs_disable
gemig_hol
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.