Подтвердить что ты не робот

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

4b9b3361

Ответ 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']

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