全球登记ClientScript的最好方法?(Best way of global register

2019-07-28 19:38发布

我想在全球范围内注册用户脚本,可用在所有的部位。 现在,我插在我的控制器的每一个动作:

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

但实际上据我所知,这不是好办法...

Answer 1:

如果你正期待着在你的项目中使用的主题,我会把在布局文件( 意见/布局/我的布局-file.php)一些CSS和脚本。 因为如果你改变主题,你将使用另一个CSS,也许有时另一个脚本,这样你就不会想它混合在一起。

但是一些主要的CSS和scipts,那没有翻过的主题改变,我会把在主控制器 (保护/组件/ Controller.php这样)和所有其他控制器(/保护/控制器/)将扩展此类控制器

class PageController extends Controller {

所以,如果使用的父类所有的控制器,您可以编辑刚刚父类,并添加这样的事

public function beforeRender( $view ) {
    ...
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl . '/js/script.js');
    ...
    return true;
}

和你的所有行动将现在使用相同的脚本。

编辑 :@realtebo(在评论)指出,使用“ beforeRender ”而不是“beforeAction”。

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



Answer 2:

你可以这样做:具有路径保护/组件/ Controller.php这样启动初始化函数在基控制器类

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


Answer 3:

最好的办法注册全球js和css文件,我认为是他们注册在beforeRender()方法(而不是在beforeAction() - 因为如果你渲染JSON或XML这可能会破坏你的结构)的一些BaseController的。



Answer 4:

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



文章来源: Best way of global registering ClientScript?
标签: yii