Выгрузить загрузчик в окне ошибок основного контроллера сайта
Мой модуль администратора использует загрузчик:
'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 ответ
В общем, чтобы выгрузить компонент, вы можете использовать setComponent
, передавая второй параметр как null
, Пример:
Yii::app()->getModule('admin')->setComponent('bootstrap', null);
Однако в вашем случае используемая вами версия загрузочного расширения уже регистрирует css/js, как только загружается компонент 1. Поэтому, даже если вы выгружаете компонент, загрузочный css все равно будет включен, и стили стиля конечно же будут применены.
Но мы можем удалить css/js, зарегистрированный в bootstrap, и таким образом удалить эффект компонента начальной загрузки. Самый простой способ сделать это, сбросив clientScript
как уже обсуждалось в комментариях, и лучшее место для reset
clientScript
находится в actionError()
вот так:
public function actionError() {
if($error=Yii::app()->errorHandler->error) {
Yii::app()->clientScript->reset();
// ... more code ...
}
}
Почему это будет работать, потому что, большинство register*
функции для регистрации css/js будут встречаться в видах и макетах, поэтому любые зарегистрированные здесь css/js будут загружены, но начальная загрузка будет опущена. Более того, любые виджеты, которые вы можете использовать, будут регистрировать свои css/js только тогда, когда они встречаются render
,
1 Смотрите расширения /bootstrap/components/Bootstrap.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.