2015-06-01 62 views
6

我正在Yii2框架上做一个Web应用程序。定义(扩展)新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

Zazu,谢谢。 – 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); 
}