Как отбросить уже отрисованные представления в Yii

#php #yii #error-handling

#php #yii #обработка ошибок

Вопрос:

У меня есть функция обработки ошибок, которая привязана следующим образом:

 Yii::app()->attachEventHandler('onError',array($this,'handleError'));
Yii::app()->attachEventHandler('onException',array($this,'handleError'));
  

Теперь эта функция отображает представление с описанием ошибки:

 public function handleError(CEvent $event) {
    // simplified
    $event->handled = true;
    $this->render("/main/error");
}
  

Однако часто часть представления уже отрисована, и это не отменяет этого — на самом деле, это переводит представление с ошибкой В старое представление, что приводит к нарушению HTML и макета.

Есть ли способ отбросить то, что уже было отрисовано, и продолжить работу с чистой страницей?

Я пытался ob_end_clean() , но это не имело никакого значения.

Ответ №1:

К черту это, глупый Yii.

Не будем рисковать очередным перекати-полем.

Хитрость заключается в использовании

 while (@ob_end_clean()) {}
  

Потому что, по-видимому, используется несколько буферов.

Ответ №2:

Если я вас понял, у меня есть идея:

Создайте закрытую переменную в классе, к которому принадлежит ваш обработчик, например.:

 private $_errorCaught = false;
  

и в вашем обработчике добавьте проверку на это:

 public function handleError(CEvent $event) {
    // simplified
    $event->handled = true;
    // if we didn't get any error
    if(!$this->_errorCaugth)
    {
        $this->_errorCaught = true;
        $this->render("/main/error");
    }
    else
        $this->renderPartial("/main/error");
}
  

Другой вариант: перенаправление на страницу ошибки.