我的管理模块正在使用引导程序:
'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。