YII, как обрабатывать пользовательскую страницу ошибки 404 вместе с другими страницами ошибок
Я хочу отобразить страницу ошибок 404, для которой я сделал файл error404.php в моей защищенной/view/системной папке.
По умолчанию у меня есть Sitecontroller и он содержит функцию действия с ошибкой, как показано ниже
public function actionError()
{
if($error=Yii::app()->errorHandler->error)
{
if(Yii::app()->request->isAjaxRequest)
echo $error['message'];
else
$this->render('error', $error);
}
}
внутри основного файла конфигурации он определяется как
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
Моя проблема в том, что мне нужно настроить только страницу 404, остальную часть ошибки мне нужно обрабатывать так, как она обрабатывается функцией ошибки sitecontroller. Но я не мог найти способ сделать это. Если предположим, что я удаляю 'errorAction' = > 'site/error', из основной конфигурации, то он показывает ошибку 404, вызывая
throw new CHttpException(404, 'Page not found');
но при этом я могу видеть только страницу без макета, а другие пользовательские ошибки обрабатываются так же, как и 404, пока они не являются. Я читал руководство много раз, но я все еще не могу его решить.
Ответы
Ответ 1
Используйте этот код для actionError:
$app = Yii::app();
if( $error = $app->errorHandler->error->code )
{
if( $app->request->isAjaxRequest )
echo $error['message'];
else
$this->render( 'error' . ( $this->getViewFile( 'error' . $error ) ? $error : '' ), $error );
}
В представлениях/сайте создайте error404.php для 404 ошибок и error.php для остальных.
Или вы можете определить параметр в конфигурации для ошибок, с которыми вам нравится обращаться по-разному, и проверить код ошибки на него:
$app = Yii::app();
if( $error = $app->errorHandler->error->code )
{
if( Yii::app()->request->isAjaxRequest )
echo $error['message'];
else
$this->render( 'error' . ( in_array( $error, $app->params[ 'customErrorPages' ] ) ? $error : '' ), $error );
}
Обработчик ошибок работает следующим образом: при возникновении httpexception компонент проверяет, есть ли какое-либо значение в свойстве errorAction, и если оно есть, запустит это действие контроллера. Если для свойства errorAction нет установленного значения, отобразится представление ошибки из системной папки. Поэтому нет необходимости смешивать представления ошибок из папки системного вида и папки просмотра контроллера.
Ответ 2
При возникновении ошибок вызывается ошибка действия в siteController. вы можете настроить маршрут ошибки в этом действии, вы можете сделать что-то вроде этого:
if(404==Yii::app()->errorHandler->error->code){
//go to custome error page
else
//code default error.php
Ответ 3
Не можете ли вы сделать это с .htaccess? Лично я создаю папку "errors" со всеми html файлами php, в которых содержатся сообщения об ошибках, и модифицируйте .htaccess, чтобы вызывать эти страницы при попадании на ошибку.
Ссылки
http://www.javascriptkit.com/howto/htaccess2.shtml
http://www.addedbytes.com/for-beginners/error-documents-for-beginners/
<сильные > Примеры:
Создайте файл .htaccess в каталоге, который вы хотите вызвать страницы ошибок, и в текстовом файле, напишите следующую строку:
ErrorDocument 404 /404.html
Предполагая, что в том же каталоге есть страница с именем 404.html, когда будет обнаружена ошибка 404 страницы, будет вызываться страница 404.html.
То же самое работает с другими кодами ошибок:
ErrorDocument 500 /500error.html
при условии, что была создана ошибка 500, и файл 500error.html существует в том же каталоге.
Ответ 4
В последних версиях фреймворка (я работаю с 1.14) используйте:
Yii::app()->errorHandler->error['code']
потому что ошибка - это массив.