2012-04-05 56 views
4

我想在全球範圍內註冊用戶腳本,以便遍佈整個網站。現在,我插入的每一個動作在我的控制器:全球註冊ClientScript的最佳方式?

Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js'); 

但實際上據我所知,這不是好辦法...

回答

6

如果你期待着使用主題在你的項目中,我會放一些CSS和佈局文件腳本(的意見/佈局/我的佈局,file.php)。因爲如果你改變了主題,你將會使用另一個CSS,有時候可能還會使用其他腳本,所以你不想將它們混合在一起。

但是一些主要的CSS和scipts,這並沒有改變翻過的主題,我會把在主控制器(保護/組件/ Controller.php這樣) 和所有其他控制器(/保護/控制器/)將延長這個類控制器

class PageController extends Controller { 

所以,如果使用的父類所有的控制器,您可以編輯剛剛父類,並添加像這樣

public function beforeRender($view) { 
    ... 
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js'); 
    ... 
    return true; 
} 

和所有的行動將現在正在使用相同的腳本。

編輯:@realtebo(在評論中)指出使用'beforeRender'而不是'beforeAction'。

查看更多:Understanding the view rendering flow

+1

這是一個錯誤的選擇!最好在beforeRender – realtebo 2013-05-10 18:49:23

+0

上這樣做哦,這聽起來很像,看起來更準確!謝謝@realtebo – 2013-05-11 07:33:01

0

U可以這樣做:1。 創建私有屬性$ _assetsUrl; 2.然後模塊或控制器

public function getAssetsUrl() 
{ 
    if ($this->_assetsUrl===null) 
    { 
     $assetsPath = $this->basePath.DIRECTORY_SEPARATOR.'assets'; 
     $this->_assetsUrl = Yii::app()->assetManager->publish($assetsPath,false,-1,YII_DEBUG); 
     if (Yii::app()->theme!==null && is_dir($assetsPath.DIRECTORY_SEPARATOR.Yii::app()->theme->name)) 
      $this->_assetsUrl .= DIRECTORY_SEPARATOR.Yii::app()->theme->name; 
    } 
    return $this->_assetsUrl; 
} 

希望這是有用的,也看到這個鏈接http://www.yiiframework.com/wiki/148/understanding-assets/

2

你可以這樣做:具有路徑保護/組件啓動初始化函數在基控制器類/controller.php

public function init() 
{ 
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js'); 
    parent::init(); 
} 
2

註冊全球js和css文件,我認爲是註冊他們beforeRender()方法(而不是在beforeAction()的最好方法 - 因爲如果你渲染JSON或XML這可能會破壞你的結構)的一些BaseController。