2015-06-01 17 views
6

Robię aplikację internetową na framework Yii2. Zdefiniowane (rozszerzony) nowy AssetBundlePakiet zasobów Yii2 - pozycja pojedynczego pliku

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', 
     '...', 
     '...', 
    ]; 
} 

Kiedy renderowane, pliki CSS są publikowane w <head> tagu oraz pliki JS na dole <body> tagu. Jest w porządku.
Ale chcę, aby pojedynczy plik be_in_head_tag.js został opublikowany w tagu <head>. I kiedy używam $jsOptions przenosi wszystkie pliki JS do znacznika <head>.
Czy można ustawić opcje tylko dla jednego pliku?

Odpowiedz

5

Jednym z wariantów uczynić ten plik do osobnej klasy aktywów:

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

i dodać zależność do klasy bazowej jak:

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

myślałem może być skonfigurowany w samej klasie bazowej. Ale wydaje się, że to jedyny sposób. Dzięki za odpowiedź – spargapis

+0

Zazu, dziękuję. – frops

0

Nie wiem, czy istnieje oficjalny sposób robienia tego (prawdopodobnie nie dlatego, że specyfikacja obiektu options byłaby nadmiernie skomplikowana), ale jest jeszcze łatwiejszy sposób w porównaniu z zaakceptowaną odpowiedzią, która nie wymaga tworzenia kolejnego AssetBundle.

Wszystko, co musisz zrobić, to utworzyć kolejną tablicę, na przykład:

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

następnie zastąpić funkcja registerAssetFiles tak:

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