Как правильно зарегистрировать свой js-код в проекте yii2 после встроенного скрипта? - PullRequest
0 голосов
/ 16 января 2019

Я пишу небольшую JS-библиотеку для bootstrap-collapse. У меня проблема: когда страница генерируется с использованием виджета Yii2 Collapse, в самом конце <body> пишется что-то вроде этого:

jQuery(function ($) {
    jQuery('#w0').collapse();
    jQuery('#w1').collapse();
    jQuery('#w2').collapse();
    jQuery('#w3').collapse();
    jQuery('#w4').collapse();
});

enter image description here

Это происходит потому, что метод run из Collapse виджета содержит следующий код:

public function run()
    {
        //Method from BootstrapWidgetTrait
        $this->registerPlugin('collapse');
        return implode("\n", [
            Html::beginTag('div', $this->options),
            $this->renderItems(),
            Html::endTag('div')
        ]) . "\n";
    }

    //Code from BootstrapWidgetTrait
    protected function registerPlugin($name)
    {
        $view = $this->getView();

        BootstrapPluginAsset::register($view);

        $id = $this->options['id'];

        if ($this->clientOptions !== false) {
            $options = empty($this->clientOptions) ? '' : Json::htmlEncode($this->clientOptions);
            $js = "jQuery('#$id').$name($options);";
            $view->registerJs($js);
        }

        $this->registerClientEvents();
    }

Это влияет на работу моей библиотеки.
Если я зарегистрирую свою js-библиотеку с помощью $this->registerJsFile(), код будет выше, чем код, зарегистрированный с помощью $this->registerJs()

Конечно, я также могу использовать метод $this->registerJs() и зарегистрировать свой JS-код в конце скрипта, который создается при инициализации виджета, но я думаю, что этот метод выглядит плохо. Любые идеи о том, как сделать это более правильно?

UPD:
Я придумал такое решение:
Я переопределяю метод registerAssetFiles () в файле MyJsLibraryAsset.php следующим образом:

public function registerAssetFiles($view)
{
    parent::registerAssetFiles($view);
    $view->registerJs('funcName()');
}

А внутри моего файла MyLibrary.js я обертываю весь код в функции funcName () следующим образом:

function funcName() {
    //here all my code...
}

Это работает, но, кажется, так плохо ... Есть ли другие способы решения проблемы?

1 Ответ

0 голосов
/ 16 января 2019

Насколько я понимаю, создаваемый плагин зависит от одного из плагинов начальной загрузки с именем yii\bootstrap\Collapse, и для управления любой зависимостью для компонентов начальной загрузки js необходимо добавить эту зависимость в свой файл assetManager.

Как мне это сделать, я помещу пользовательский код в js-файл и перечислю его в $js переменную в AssetBundle, а затем добавлю зависимость от yii\bootstrap\BoottrapPluginAsset, чтобы мой js-файл с пользовательским кодом был всегда загружается после js-файла загрузочного плагина.

См. Приведенный ниже класс с одним файлом CSS и файлом test.js, в котором будет собственный код, который вы пишете

class AppAsset extends AssetBundle
{
    /**
     * @var string
     */
    public $basePath = '@webroot';
    /**
     * @var string
     */
    public $baseUrl = '@web';
    /**
     * @var array
     */
    public $css = [
        'css/site.css',
    ];
    /**
     * @var array
     */
    public $js = [
        'js/test.js',
    ];

    /**
     * @var array
     */
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
        'yii\bootstrap\BootstrapPluginAsset',
    ];
}

После того, как вы выполнили все настройки, как указано выше, зарегистрируйте файл Asset в макете и затем просмотрите исходный код, вы увидите файлы, загруженные, как показано ниже, где test.js всегда будет загружаться после bootstrap.js file

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...