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, пока они не являются. Я читал руководство много раз, но я все еще не могу его решить.

Используйте этот код для 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 нет установленного значения, отобразится представление ошибки из системной папки. Поэтому нет необходимости смешивать представления ошибок из папки системного представления и папки просмотра контроллера.

Всякий раз, когда возникают ошибки, вызывается ошибка действия в siteController. вы можете настроить маршрут ошибки в этом действии, вы можете сделать что-то вроде этого:

 if(404==Yii::app()->errorHandler->error->code){ //go to custome error page else //code default error.php 

Не можете ли вы сделать это с .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 существует в том же каталоге.

В последних версиях структуры (я работаю с 1.14) используйте:

 Yii::app()->errorHandler->error['code'] 

потому что ошибка – это массив.