Я пишу небольшую JS-библиотеку для bootstrap-collapse. У меня проблема: когда страница генерируется с использованием виджета Yii2 Collapse
, в самом конце <body>
пишется что-то вроде этого:
jQuery(function ($) {
jQuery('#w0').collapse();
jQuery('#w1').collapse();
jQuery('#w2').collapse();
jQuery('#w3').collapse();
jQuery('#w4').collapse();
});
Это происходит потому, что метод 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...
}
Это работает, но, кажется, так плохо ...
Есть ли другие способы решения проблемы?