我想在全球范围内注册用户脚本,以便在整个站点上可用。现在我在我的控制器中插入每个动作:
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
但我真的明白这不是好办法......
我想在全球范围内注册用户脚本,以便在整个站点上可用。现在我在我的控制器中插入每个动作:
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
但我真的明白这不是好办法......
如果您期待在项目中使用主题,我会将一些 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'。
查看更多:了解视图渲染流程
您可以这样做:在具有路径 protected/components/controller.php 的基本控制器类中启动 init 函数
public function init()
{
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
parent::init();
}
我认为注册全局 js 和 css 文件的最佳方法是在某些 BaseController 的 beforeRender() 方法中注册它们(而不是在 beforeAction() 中 - 因为如果你渲染 json 或 xml 这可能会破坏你的结构)。
你可以这样做: 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/