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

时间:2013-02-01 14:12:00

标签: php twitter-bootstrap yii yii-modules

我的管理模块正在使用bootstrap:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

但是我们可以删除bootstrap注册的css / js,从而消除bootstrap组件的影响。最简单的方法是重置评论中已经讨论过的clientScriptclientScript actionError() public function actionError() { if($error=Yii::app()->errorHandler->error) { Yii::app()->clientScript->reset(); // ... more code ... } } 的最佳位置就像register*一样:

render

为什么这会起作用是因为,视图布局中会遇到注册css / js的大多数init()函数,所以在那里注册的任何css / js都会被加载,但是bootstrap将被省略。此外,您可能正在使用的任何小部件仅在if ($this->coreCss !== false) $this->registerCoreCss(); if ($this->responsiveCss !== false) $this->registerResponsiveCss(); if ($this->yiiCss !== false) $this->registerYiiCss(); if ($this->enableJS !== false) $this->registerCoreScripts(); 遇到它们时才会注册其css / js。


1 参见 extensions / bootstrap / components / Bootstrap.php 的{{1}}:

{{1}}

对于扩展的较新版本(自1.0.1版),您必须明确注册css / js。