4

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

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

但我真的明白这不是好办法......

4

4 回答 4

6

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

但是一些主要的 css 和 scipts,并没有改变跨主题,我会放入主控制器(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(在评论中)指出使用' beforeRender '而不是'beforeAction'。

查看更多:了解视图渲染流程

于 2012-04-05T10:17:41.653 回答
2

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

public function init()
{
  Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js'); 
  parent::init();
}
于 2012-04-05T09:53:48.613 回答
2

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

于 2012-12-06T15:57:07.593 回答
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/

于 2012-04-05T09:24:24.300 回答