全局注册ClientScript的最佳方式?

时间:2012-04-05 08:31:53

标签: yii

我想全局注册用户脚本,以便在整个站点上可用。现在我插入控制器中的每个动作:

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

但实际上我明白这不是好方法......

4 个答案:

答案 0 :(得分:6)

如果您期待在项目中使用主题,我会在布局文件中放置一些CSS和脚本( views / layouts / my-layout-file.php )。因为如果您更改主题,您将使用另一个css,有时可能会使用其他脚本,因此您不希望将它们混合在一起。

但是一些主要的css和scipts,并没有改变主题,我会把主要的控制器(protected / components / Controller.php) 所有其他控制器(/ protected / controllers /)将扩展此类Controller

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 :(得分:2)

您可以这样做:在具有路径保护的基本控制器类中启动init函数/ components / controller.php

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

你可以这样做: 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/