Cấu hình RequireJs có điều kiện (Tải requestjs-config.js theo chương trình?)


14

Tôi chỉ muốn thay thế một thành phần RequireJs trong một số điều kiện nhất định (ví dụ: dựa trên cấu hình). Có cách nào để lập trình ngăn chặn việc tải mô-đun của tôi requirejs-config.jshoặc một cách khác để đạt được nó không?


1
bạn đã tìm ra giải pháp cho vấn đề này chưa?
stevensagaar

@stevensagaar tiếc là không
Fabian Schmengler

2
Nếu tôi tìm thấy một, tôi sẽ thêm một câu trả lời ở đây
Fabian Schmengler

3
@Alex nếu có giải pháp cho 2.2 hoặc 2.3 Tôi cũng sẽ vui: D đã cập nhật các thẻ. Ngoài ra, cảm ơn vì tiền thưởng!
Fabian Schmengler

2
Các bạn đã thử viết lại getConfig chức năng trong vendor / magento / framework / RequireJs / config.php hoặc bạn cần phải ghi plugins trong requirejs requirejs.org/docs/plugins.html
Arshad M

Câu trả lời:


4

Dựa trên nhận xét @Arshad M, bạn có thể thêm một tệp di.xml với:

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

Và trong <Nhà cung cấp> \ <ModuleName> \ RequireJs \ Config.php ghi đè chức năng getConfig thêm điều kiện của bạn và tên mô-đun mà bạn không muốn yêu cầu được tải (có thể từ 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;
    }
}

CẬP NHẬT

Sau khi nhận xét từ @Alex và @Daniel: Bạn có thể tạo plugin sau cho getFiles từ Magento \ Framework \ RequireJs \ Config \ File \ Collector \ Aggregated, do đó, tệp di.xml mới với cách tiếp cận này sẽ là:

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

Và tại \ <Nhà cung cấp> \ <ModuleName> \ Plugin \ RequireJs \ AfterFiles, bạn có thể đặt điều kiện và mô-đun của mình rằng các yêu cầu sẽ không được tải:

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

Đẹp! Tôi nghĩ rằng chúng tôi có thể cải thiện điều đó bằng $ fullConfig = Parent :: getConfig () và sau đó sửa đổi $ fullConfig để sao chép và dán ít mã hơn. Bạn nghĩ sao? Có lẽ chúng ta nên tạo một mô-đun FOSS nhỏ trên github cho việc này?
Alex

1
Hoặc có thể viết lại $ this-> fileSource-> getFiles không? Chỉ để không sao chép vào nhiều mã ...
Alex

3
@Alex Bạn cũng có thể sử dụng một plugin và sử dụng một aroundGetConfig()hoặc afterGetConfig()phương thức để đạt được tải có điều kiện thì chúng ta không phải ghi đè lên nó
Daniel

Có vẻ đầy hứa hẹn, cảm ơn bạn! Tôi đã được nâng cấp, sẽ dùng thử càng sớm càng tốt trước khi chấp nhận câu trả lời
Fabian Schmengler

2
@Alex theo đề xuất của bạn Tôi đã tạo một mô-đun nhỏ trong github, nơi bạn có thể chọn các mô-đun để vô hiệu hóa các yêu cầu thông qua phụ trợ magento. Hãy xem thử và có thể đóng góp github.com/MNGemignani/magento2_Vquirejs_disable
gemig_hol 16/12/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.