การกำหนดค่า RequireJs แบบมีเงื่อนไข (โหลด requirejs-config.js โดยทางโปรแกรมหรือไม่)


15

ฉันต้องการแทนที่คอมโพเนนต์ RequireJs ตามเงื่อนไขบางอย่างเท่านั้น (เช่นตามการกำหนดค่า) มีวิธีใดที่จะป้องกันไม่ให้โหลดโมดูลของฉันrequirejs-config.jsหรือวิธีอื่นเพื่อให้บรรลุโดยทางโปรแกรมหรือไม่


1
คุณพบวิธีแก้ปัญหานี้หรือไม่?
stevensagaar

@stevensagaar ขออภัยไม่ใช่
Fabian Schmengler

2
ถ้าฉันเจอฉันจะเพิ่มคำตอบที่นี่
Fabian Schmengler

3
@Alex ถ้ามีวิธีแก้ปัญหาสำหรับ 2.2 หรือ 2.3 ฉันก็มีความสุขเช่นกัน: D อัปเดตแท็ก นอกจากนี้ขอขอบคุณสำหรับความโปรดปราน!
Fabian Schmengler

2
คุณลองเขียนใหม่ฟังก์ชั่น getConfig ในผู้ขาย / magento / framework / RequireJs / Config.php หรือคุณต้องเขียนปลั๊กอินใน requirejs requirejs.org/docs/plugins.html
Arshad M

คำตอบ:


5

จากความคิดเห็น @Arshad M คุณสามารถเพิ่ม 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>

และใน <Vendor> \ <ModuleName> \ RequireJs \ Config.php จะแทนที่ฟังก์ชัน getConfig ที่เพิ่มเงื่อนไขของคุณและชื่อโมดูลที่คุณไม่ต้องการโหลด requirejs (อาจมาจาก ScopeConfigInterface):

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

UPDATE

หลังจากความคิดเห็นจาก @Alex และ @Daniel: คุณสามารถสร้างปลั๊กอินหลังจากสำหรับ getFiles จาก Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated ดังนั้น 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>

และที่ \ <ผู้ขาย> \ <ชื่อโมดูล> \ Plugin \ RequireJs \ AfterFiles คุณสามารถตั้งค่าเงื่อนไขและโมดูลของคุณที่ requirejs จะไม่โหลด:

<?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 = parent :: getConfig () จากนั้นแก้ไข $ fullConfig เพื่อคัดลอกและวางรหัสที่น้อยลง คุณคิดอย่างไร? บางทีเราควรสร้าง mini-FOSS-module บน github เพื่อสิ่งนี้?
อเล็กซ์

1
หรือ $ this-> fileSource-> getFiles สามารถเขียนใหม่ได้หรือไม่ เพียงเพื่อไม่คัดลอกไปยังรหัสมาก ...
อเล็กซ์

3
@Alex คุณสามารถใช้ปลั๊กอินและใช้aroundGetConfig()หรือafterGetConfig()วิธีการเพื่อให้ได้การโหลดแบบมีเงื่อนไขจากนั้นเราก็ไม่จำเป็นต้องเขียนทับมันอีกต่อไป
Daniel

ดูมีแนวโน้มขอบคุณ! ฉัน upvoted แล้วจะลองโดยเร็วก่อนที่จะยอมรับคำตอบ
Fabian Schmengler

2
@Alex ตามคำแนะนำของคุณฉันทำโมดูลขนาดเล็กใน Github ซึ่งคุณสามารถเลือกโมดูลเพื่อปิดใช้งาน requirejs ผ่านทางวีโอไอพีแบ็กเอนด์ ตรวจสอบและอาจมีส่วนร่วม github.com/MNGemignani/magento2_requirejs_disable
gemig_hol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.