Выгрузить загрузчик в окне ошибок основного контроллера сайта

Мой модуль администратора использует загрузчик:

'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.

Другие вопросы по тегам