Configurazione RequireJs condizionale (Caricare requestjs-config.js a livello di codice?)


15

Vorrei sostituire un componente RequireJs solo a determinate condizioni (ad esempio, in base alla configurazione). Esiste un modo per impedire programmaticamente il caricamento del mio modulo requirejs-config.jso un modo diverso per raggiungerlo?


1
hai trovato la soluzione a questo problema?
Stevensagaar,

@stevensagaar purtroppo no
Fabian Schmengler,

2
Se ne trovo uno, aggiungerò una risposta qui
Fabian Schmengler,

3
@Alex se esiste una soluzione per 2.2 o 2.3, sarei felice anche: D ha aggiornato i tag. Inoltre, grazie per la generosità!
Fabian Schmengler,

2
Hai provato a riscrivere la funzione getConfig in vendor / magento / framework / RequireJs / Config.php o hai bisogno di scrivere plug-in in requestjs requestjs.org/docs/plugins.html
Arshad M

Risposte:


5

Sulla base del commento di @Arshad M, è possibile aggiungere un di.xml con:

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

E in <Vendor> \ <ModuleName> \ RequireJs \ Config.php sovrascrive la funzione getConfig aggiungendo la propria condizione e il nome del modulo in cui non si desidera caricare i necessjs (probabilmente da 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;
    }
}

AGGIORNARE

Dopo i commenti di @Alex e @Daniel: è possibile creare un plug-in after per getFiles da Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated, quindi il nuovo di.xml con questo approccio sarebbe:

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

E in \ <Vendor> \ <ModuleName> \ Plugin \ RequireJs \ AfterFiles, puoi impostare le tue condizioni e il modulo in modo che i filejs non vengano caricati:

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

Bello! Penso che potremmo migliorarlo di $ fullConfig = parent :: getConfig () e quindi modificare $ fullConfig per copiare e incollare meno codice. Cosa pensi? Forse dovremmo creare un mini modulo FOSS su github per questo?
Alex,

1
Oppure è possibile riscrivere $ this-> fileSource-> getFiles? Solo per non copiare molto codice ...
Alex,

3
@Alex Potresti anche usare un plugin e usare un metodo aroundGetConfig()o afterGetConfig()per raggiungere il caricamento condizionale, quindi non dobbiamo sovrascriverlo
Daniel,

Sembra promettente, grazie! Ho già votato, lo proverò al più presto prima di accettare la risposta
Fabian Schmengler,

2
@Alex seguendo il tuo suggerimento ho creato un piccolo modulo in github, dove è possibile selezionare i moduli per disabilitare ijs tramite backend magento.
Dai
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.