Bedingte RequireJs-Konfiguration (RequireJs-config.js programmgesteuert laden?)

14

Ich möchte eine RequireJs-Komponente nur unter bestimmten Bedingungen ersetzen (z. B. basierend auf der Konfiguration). Gibt es eine Möglichkeit, das Laden meines Moduls programmgesteuert zu verhindern requirejs-config.jsoder eine andere Möglichkeit, dies zu erreichen?

Fabian Schmengler
quelle
1
Haben Sie die Lösung für dieses Problem gefunden?
Stevensagaar
@ Stevensagaar leider nicht
Fabian Schmengler
2
Wenn ich eine finde, füge ich hier eine Antwort hinzu
Fabian Schmengler
3
@Alex, wenn es eine Lösung für 2.2 oder 2.3 gibt, würde ich mich auch freuen: D hat die Tags aktualisiert. Danke auch für die Prämie!
Fabian Schmengler
2
Haben Sie versucht, die getConfig-Funktion in vendor / magento / framework / RequireJs / Config.php umzuschreiben, oder müssen Sie Plugins in requirejs requirejs.org/docs/plugins.html
Arshad M

Antworten:

4

Basierend auf dem @ Arshad M-Kommentar können Sie eine di.xml hinzufügen mit:

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

Und überschreiben Sie in <Vendor> \ <ModuleName> \ RequireJs \ Config.php die Funktion getConfig und fügen Sie Ihre Bedingung und den Modulnamen hinzu, unter dem die RequireJs nicht geladen werden sollen (wahrscheinlich von 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;
    }
}

AKTUALISIEREN

Nach Kommentaren von @Alex und @Daniel: Sie können ein After-Plugin für getFiles aus Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated erstellen. Die neue di.xml mit diesem Ansatz wäre also:

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

Und unter \ <Vendor> \ <ModuleName> \ Plugin \ RequireJs \ AfterFiles können Sie Ihre Bedingung und Ihr Modul festlegen, dass die RequireJs nicht geladen werden:

<?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
quelle
Nett! Ich denke, wir könnten das durch $ fullConfig = parent :: getConfig () verbessern und dann $ fullConfig ändern, um weniger Code zu kopieren und einzufügen. Was denkst du? Vielleicht sollten wir dafür ein Mini-FOSS-Modul auf Github machen?
Alex
1
Oder kann stattdessen $ this-> fileSource-> getFiles umgeschrieben werden? Nur um nicht zu viel Code zu kopieren ...
Alex
3
@Alex Sie können auch ein Plugin und eine aroundGetConfig()oder afterGetConfig()-Methode verwenden, um das bedingte Laden zu erreichen, dann müssen wir es nicht überschreiben
Daniel
Sieht vielversprechend aus, danke! Ich habe bereits abgestimmt, werde es so schnell wie möglich ausprobieren, bevor ich die Antwort akzeptiere
Fabian Schmengler
2
@Alex Auf Ihren Vorschlag hin habe ich ein kleines Modul in Github erstellt, in dem Sie die Module auswählen können, um die Requiredjs über das Magento-Backend zu deaktivieren. Schau es
dir an