在主站点控制器的错误视图中卸载引导程序


Unload bootstrap in error view of main site controller

我的管理模块正在使用引导程序:

'admin'=>array(
        'preload'=>array('bootstrap'),
        'components'=>array(
            'bootstrap'=>array(
                'class'=>'ext.bootstrap.components.Bootstrap',
            ),
        )
    ),

但它也使用主站点的错误处理程序:

public function init() {
    $this->setImport(array(
        'admin.models.*',
        'admin.components.*',
    ));
    Yii::app()->setComponents(array(
       'errorHandler'=>array('errorAction'=>'site/error'),
    ));
    $this->layout = 'admin';
}

问题是,当生成错误时,引导 css 正在加载以拧紧布局。如何在错误操作中卸载引导程序?

一般来说,要卸载组件,可以使用setComponent,将第二个参数作为null传递。举个例子:

Yii::app()->getModule('admin')->setComponent('bootstrap', null);

但是,在您的情况下,您使用的引导扩展版本已经在组件加载后立即注册了 css/js 1。因此,即使您卸载组件,引导 css 仍将包含在内,当然样式仍将被应用。

但是我们可以删除引导程序注册的 css/js,从而消除引导组件的影响。最简单的方法是重置clientScript,如注释中已经讨论的那样,reset clientScript的最佳位置是在actionError()中,如下所示:

public function actionError() {
    if($error=Yii::app()->errorHandler->error) {
        Yii::app()->clientScript->reset();
        // ... more code ...
    }
} 

为什么会这样做是因为,大多数注册 css/js 的register*函数都会在视图布局中遇到,因此在那里注册的任何 css/js 都会被加载,但引导程序将被省略。此外,您可能正在使用的任何小部件只有在遇到render时才会注册它们的 css/js。


1请参阅扩展/引导/组件/引导.php init()

if ($this->coreCss !== false)
    $this->registerCoreCss();
if ($this->responsiveCss !== false)
    $this->registerResponsiveCss();
if ($this->yiiCss !== false)
    $this->registerYiiCss();
if ($this->enableJS !== false)
    $this->registerCoreScripts();

对于较新版本(从 1.0.1 开始)的扩展,您必须显式注册 css/js。