我想全局注册用户脚本,以便在整个站点上可用。现在我插入控制器中的每个动作:
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
但实际上我明白这不是好方法......
答案 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'。
答案 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)
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/