1

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

'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 正在加载,将布局搞砸。如何仅在错误操作中卸载引导程序?

4

1 回答 1

2

通常要卸载组件,您可以使用setComponent,将第二个参数作为null. 一个例子:

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

但是,在您的情况下,您正在使用的 bootstrap-extension 版本在加载组件后就已经注册了 css/js 1。因此,即使您卸载组件,仍会包含引导 css,并且仍会应用样式。

但是我们可以去掉bootstrap注册的css/js,从而去掉bootstrap组件的效果。最简单的方法是重置clientScript评论中已经讨论过的,最好的地方是reset这样:clientScriptactionError()

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

之所以会这样,是因为大部分register*注册 css/js 的函数都会在viewslayouts中遇到,所以任何注册的 css/js 都会被加载,但 bootstrap 会被省略。此外,您可能正在使用的任何小部件,只有在遇到它们时才会注册它们的 css/js render


1extensions/bootstrap/components/Bootstrap.phpinit()

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。

于 2013-02-02T04:24:30.677 回答