Yii 全局注册ClientScript的最佳方式?

Yii 全局注册ClientScript的最佳方式?,yii,Yii,我想在全球范围内注册用户脚本,使其在整个网站上都可用。现在,我在控制器中的每个操作中插入: Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js'); 但我真的明白这不是个好办法…你可以这样做: 1.创建私有属性$\u assetsUrl; 2.然后在模块或控制器中 public function getAssetsUrl() { if ($this->

我想在全球范围内注册用户脚本,使其在整个网站上都可用。现在,我在控制器中的每个操作中插入:

Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
但我真的明白这不是个好办法…

你可以这样做: 1.创建私有属性$\u 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;
}

希望这是有用的,另请参见此链接。您可以这样做:在具有路径保护的/components/controller.php的基本控制器类中启动init函数

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

如果您希望在项目中使用主题,我会在布局文件(views/layouts/my layout file.php)中放置一些css和脚本。因为如果你改变主题,你将使用另一个css,有时可能是另一个脚本,所以你不想把它混合在一起

但是一些主要的css和SCIPT并没有改变accross主题,我会把它们放在mainController(protected/components/Controller.php) 所有其他控制器(/protected/controllers/)都将扩展该类控制器

class PageController extends Controller {
所以,若你们的所有控制器都在父类上使用,你们可以只编辑父类并添加如下内容

public function beforeRender( $view ) {
    ...
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
    ...
    return true;
}
现在,您的所有操作都将使用相同的脚本

编辑:@realtebo(在评论中)指出在采取行动之前使用“而不是”


查看更多信息:

我认为注册全局js和css文件的最佳方法是在某个BaseController的beforeRender()方法(而不是beforeAction()-因为如果渲染json或xml,这可能会破坏您的结构)中注册它们。

哦,这听起来更准确!谢谢@realtebo