2015-06-01 5 views
6

Ich mache eine Web-App auf Yii2 Framework. Definiert (erweitert) neue AssetBundleYii2 Asset-Bundle - einzelne Dateiposition

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

Wenn gemacht, CSS-Dateien werden in <head>-Tag und JS-Dateien am unteren Rand des <body> Tag veröffentlicht. Es ist okay.
Aber ich möchte eine einzige be_in_head_tag.js Datei im Tag veröffentlicht werden. Und wenn ich $jsOptions verwende, verschiebt es alle JS-Dateien in das -Tag.
Ist es möglich, Optionen nur für eine Datei zu erstellen?

Antwort

5

Eine der Varianten machen die Datei in eine eigene Anlageklasse:

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

Und eine Abhängigkeit zu Ihrer Basisklasse hinzufügen, wie:

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

Ich dachte, es kann sich in der Basisklasse konfiguriert werden. Aber es scheint der einzige Weg zu sein. Danke für Ihre Antwort – spargapis

+0

Zazu, danke. – frops

0

Ich weiß nicht, ob ein Beamter es Art und Weise, es zu tun (wahrscheinlich nicht, weil es die Spezifikation des options Objekts übermäßig kompliziert machen würde), jedoch gibt es einen anderen einfacheren Weg verglichen mit der angenommenen Antwort, die nicht erfordert, dass Sie einen anderen AssetBundle erstellen.

Alles, was Sie tun müssen, ist ein weiteres Array erstellen, zum Beispiel:

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

Dann überschreiben die registerAssetFiles Funktion wie so:

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