2012-08-05 27 views
11

Quiero mostrar la página de error 404 para eso he hecho el archivo error404.php en mi carpeta protected/view/system.YII cómo manejar la página de error 404 personalizada junto con otras páginas de error

Por defecto que tengo Sitecontroller y contenía función de acción de error de la siguiente manera

public function actionError() 
{ 
    if($error=Yii::app()->errorHandler->error) 
    { 

     if(Yii::app()->request->isAjaxRequest) 
      echo $error['message']; 
     else 
      $this->render('error', $error); 
    } 
} 

dentro config archivo principal se define como

'errorHandler'=>array(
     // use 'site/error' action to display errors 
     'errorAction'=>'site/error', 
    ), 

mi problema es que tengo que personalizar la página 404 solamente, el resto del error necesito manejar la forma en que lo maneja la función de error del controlador del sitio. Pero no pude encontrar una manera de hacer eso. Si supongo quito 'errorAction' => 'sitio/error', de la configuración principal, entonces sí muestra el error 404 llamando

 throw new CHttpException(404, 'Page not found'); 

pero haciendo que sólo puedo ver la página sin la disposición también otros errores personalizados se tratan igual que 404 mientras que no lo son. Leí el manual muchas veces, pero todavía no puedo resolverlo.

Respuesta

9

Use este código para 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); 
} 

En las vistas y/o Zona crear error404.php de errores 404 y error.php para el resto.

o puede definir parámetro en la configuración de errores te gusta de manejar de manera diferente y comprobar el código de error en contra de ella:

$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); 
} 

gestor de errores funciona así: cuando HttpException surgen, componente comprobará si hay alguna valor en errorAcción propiedad y, si hay alguna, ejecutará la acción de este controlador. Si no hay un valor establecido para la propiedad errorAction, se mostrará la vista de error de la carpeta del sistema. Por lo tanto, no es necesario mezclar vistas de error desde la carpeta de vista del sistema y la carpeta de visualización del controlador.

+0

tuve que cambiarlo a este 'if ($ error = Yii :: app() -> errorHandler-> error ['code']) '' error-> code' era dándome errores. También 'getViewFile' me está dando este error. 'CWebApplication y sus comportamientos no tienen un método o cierre llamado" getViewFile ". (/Aplicaciones/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266) '¿Alguna idea? – user2636556

+0

el mensaje de error para 'error-> código' es' Aviso: tratando de obtener la propiedad de no objeto en /Aplicaciones/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php en la línea 48' @Boris – user2636556

+0

Usted tienen razón. No hay un método getViewFile en la clase de la aplicación. Debe llamar al método del controlador: $ this-> getViewFile (...) –

3

Siempre que se produzcan errores, se invoca el error de acción en siteController. se puede personalizar la ruta de error en esa acción, puede hacer algo como esto:

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

quiere decir proporcionar si la condición else else dentro de la vista de error y luego agregar vistas parciales en consecuencia? (Pensé que debería ser una automática si estoy usando error404.php dentro del directorio del sistema. ??? – wolvorinePk

+0

sí ... no estoy seguro de que funcione con las actualizaciones automáticas ... vea las actualizaciones. – bingjie2680

+0

en el tutorial y la actualización del documento que tiene no hay suficiente información al respecto. Necesito manejar los errores predeterminados, así como mi propio error de personalización para Custom 404 o 405 páginas. Para eso agregué error404.php en mi directorio de sistema y para manejar los errores predeterminados estoy usando el archivo de configuración interno para el nuevo controlador controlador del sistema. Pero algo no funciona de la manera que quiero – wolvorinePk

1

no se puede hacer esto con .htaccess? Personalmente, creo una carpeta de "errores" con todos los archivos html php que contiene los mensajes de error y modifico .htaccess para llamar a esas páginas al encontrar el error.

Enlaces:

http://www.javascriptkit.com/howto/htaccess2.shtml

http://www.addedbytes.com/for-beginners/error-documents-for-beginners/

Ejemplos:

crear un archivo .htaccess en el directorio desea que las páginas de error a ser llamados y en el texto archivo, escriba la siguiente línea:

ErrorDocument 404  /404.html 

asumiendo que hay una página llamada 404.html en el mismo directorio, cuando se genera un error 404 página no encontrada, se llamará a la página 404.html.

Las mismas obras con otros códigos de error:

ErrorDocument 500  /500error.html 

asumiendo un error 500 se creó y existe un archivo 500error.html en el mismo directorio.

+0

, sé ho hacer eso usando htaccess, pero estoy aprendiendo YII y mi sistema requiere que lo use a través del yii. Amablemente si tienes alguna idea de cómo hacerlo eso usando yii porque incluso su tutorial es muy vago y no da una visión más amplia. Ayúdenme chicos ... – wolvorinePk

1

En las últimas versiones del marco (Estoy trabajando con 1.14) usan:

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

porque de error es una matriz.

Cuestiones relacionadas