Konfigurasi RequireJs bersyarat (Memuat RequirejJ-config.js secara terprogram?)

15

Saya ingin mengganti komponen RequireJs hanya pada kondisi tertentu (misalnya, berdasarkan konfigurasi). Apakah ada cara untuk mencegah pemrograman memuat modul saya requirejs-config.jsatau cara lain untuk mencapainya?

Fabian Schmengler
sumber
1
apakah Anda menemukan solusi untuk masalah ini?
stevensagaar
@stevensagaar sayangnya tidak
Fabian Schmengler
2
Jika saya menemukannya, saya akan menambahkan jawaban di sini
Fabian Schmengler
3
@Alex jika ada solusi untuk 2.2 atau 2.3 Saya akan senang juga: D memperbarui tag. Juga, terima kasih atas hadiahnya!
Fabian Schmengler
2
Sudahkah Anda mencoba menulis ulang fungsi getConfig di vendor / magento / framework / RequireJs / Config.php atau Anda perlu menulis plugins di Requirejs Requirejs.org/docs/plugins.html
Arshad M

Jawaban:

5

Berdasarkan komentar @Arshad M, Anda dapat menambahkan di.xml dengan:

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

Dan di <Vendor> \ <ModuleName> \ RequireJs \ Config.php timpa fungsi getConfig dengan menambahkan kondisi Anda dan nama modul yang tidak Anda inginkan agar load dimuat (mungkin dari 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;
    }
}

MEMPERBARUI

Setelah komentar dari @Alex dan @Daniel: Anda dapat membuat plugin after untuk getFiles dari Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated, jadi di.xml baru dengan pendekatan ini adalah:

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

Dan di \ <Vendor> \ <ModuleName> \ Plugin \ RequireJs \ AfterFiles, Anda dapat mengatur kondisi dan modul Anda yang tidak akan memuat load:

<?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;
    }
}
gemig_hol
sumber
Bagus! Saya pikir kita bisa memperbaikinya dengan $ fullConfig = parent :: getConfig () dan kemudian memodifikasi $ fullConfig untuk menyalin & menempel lebih sedikit kode. Bagaimana menurut anda? Mungkin kita harus membuat modul mini-FOSS di github untuk ini?
Alex
1
Atau bisakah $ this-> fileSource-> getFiles ditulis ulang? Hanya untuk tidak menyalin ke banyak kode ...
Alex
3
@Alex Anda juga bisa menggunakan plugin dan menggunakan metode aroundGetConfig()atau afterGetConfig()untuk mencapai pemuatan bersyarat maka kita tidak perlu menimpanya
Daniel
Terlihat menjanjikan, terima kasih! Saya sudah terbalik, akan mencobanya sesegera mungkin sebelum menerima jawabannya
Fabian Schmengler
2
@Alex mengikuti saran Anda, saya membuat modul kecil di github, di mana Anda dapat memilih modul untuk menonaktifkan requirejs melalui backend magento. Lihat dan berkontribusi di github.com/MNGemignani/magento2_requirejs_disable
gemig_hol