2015-06-01 3 views
6

Я делаю веб-приложение на основе Yii2. Определено (расширенный) новый AssetBundleyii2 пакет активов - позиция одного файла

class NeonAsset extends AssetBundle { 
    public $sourcePath = '@app/themes/neon/'; 

    public $css = [ 
    'css/font-icons/entypo/css/entypo.css', 
    '...', 
    '...'   
    ]; 

    public $js = [ 
     'js/be_in_head_tag.js', 
     '...', 
     '...', 
    ]; 
} 

При визуализации, CSS файлы были опубликованы в <head> теге, и JS-файлы в нижней части <body> тега. Все хорошо.
Но я хочу, чтобы один be_in_head_tag.js файл был опубликован в теге <head>. И когда я использую $jsOptions, он перемещает все JS-файлы в тег <head>.
Можно ли делать опции только для одного файла?

ответ

5

Один из вариантов сделать этот файл в отдельный класс активов:

class HeadPublishAsset extends AssetBundle { 
    public $sourcePath = '@app/themes/neon/'; 
    public $js = ['js/be_in_head_tag.js']; 
    public $jsOptions = ['position' => \yii\web\View::POS_HEAD]; 
} 

И добавить зависимость к вашему базовому классу, как:

class NeonAsset extends AssetBundle { 
    ... 
    public $depends = ['app\assets\HeadPublishAsset']; 
    ... 
} 
+0

Я думал, что он может быть сконфигурирован в самом базовом классе. Но, похоже, это единственный способ. Спасибо за ваш ответ – spargapis

+0

Зазу, спасибо. – frops

0

Я не знаю, если есть официальный (возможно, это не так, как если бы спецификация объекта options была чрезмерно сложной), однако есть еще один более простой способ по сравнению с принятым ответом, который не требует создания другого AssetBundle.

Все, что вам нужно сделать, это создать другой массив, например:

public $head_js = 
[ 
    "path/to/src.js" 
]; 

Затем переопределить функцию registerAssetFiles следующим образом:

public function registerAssetFiles($view) 
{ 
    foreach($this->head_js as $js) 
    { 
    $options = []; 
    $options["position"] = \yii\web\View::POS_HEAD; 
    $url = Url::to($this->baseUrl . "/" . $js); 
    $view->registerJsFile($url, $options); 
    } 

    parent::registerAssetFiles($view); 
} 
Смежные вопросы