2013-02-01 4 views
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 загружается, закручивая компоновку. Как выгрузить загрузочный блок только в случае ошибки?

+2

Я не знаю, что это сработает, сделайте 'Yii :: app() -> clientScript-> reset()' inside' actionError() '. Это может очистить весь скрипт, зарегистрированный через 'clientScript' – dInGd0nG

+0

@ dInGd0nG как раз собирался добавить это как ответ, он будет работать –

+0

, но это проблема. Он очистит все зарегистрированные файлы скриптов. Мы хотим сбросить только файлы, зарегистрированные компонентом 'bootstrap' – dInGd0nG

ответ

2

В общем случае для разгрузки компонента вы можете использовать setComponent, передавая второй параметр как null. Пример:

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

Однако в вашем случае, версия бутстраповского-расширения вы используете, уже регистрирует CSS/JS, как только компонент загружается . Поэтому, даже если вы разгрузите компонент, bootstrap css все равно будет включен, и стили использования будут по-прежнему применяться.

Но мы можем удалить css/js, зарегистрированный bootstrap, и таким образом удалить эффект компонента начальной загрузки. Самый простой способ сделать это путем сброса clientScript, как уже обсуждалось в комментариях, и лучшее место для resetclientScript находится в actionError() так:

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

Почему это будет работать потому, что большинство функции register* для регистрации css/js будут встречаться в просмотрах и макетах, поэтому любые зарегистрированные css/js будут загружены, но бутстрап будет опущен. Кроме того, любые виджеты, которые вы могли бы использовать, будут регистрировать свои css/js только тогда, когда они встречаются render.


См Extensions/бутстраповских/компоненты/Bootstrap.php «s 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 явно.

Смежные вопросы