Errores 404 con Ajax (y jQuery) en CakePHP

Reading time ~3 minutes

En este tutorial aprenderéis a gestionar los errores de CakePHP con y sin Ajax.

Lo primero de todo que tenéis que hacer es poner el debug a cero en vuestro fichero core.php, ya que con debug > 0 no funcionaría.

Ahora pasemos a crear (si no existe) el fichero /app/app_error.php con el siguiente contenido.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// /app/app_error.php
class AppError extends ErrorHandler
{
  function error404($params)
  {
    // Importamos RequestHandler para verificar si la conexión es mediante Ajax
    App::import('Component', 'RequestHandler');
    $this->RequestHandler = new RequestHandlerComponent();
    if ($this->RequestHandler->isAjax()) {
      // En caso de ser Ajax creamos la cabecera 404
      $this->controller->header('HTTP/1.0 404 Not Found');
      // y pasamos algunas variables a la vista que ahora crearemos
      $this->controller->set('params', $params);
      $this->controller->layout = 'ajax';
      // Renderizamos la vista
      $this->_outputMessage('ajax_error404');
    }
    // Aquí iría la gestión del error sin Ajax, en nuestro caso llamamos al método padre.
    else parent::error404($params);
  }
}

Pasemos a la creación de la vista… /app/views/errors/ajax_error404.ctp

1
2
3
4
<?php
// /app/views/errors/ajax_error404.ctp
$error404 = array('message' => __('The requested address was not found on this server.',true), 'params' => $params);
echo $this->Javascript->object($error404);

Tan simple como eso : )

Finalmente, añadamos esto a nuestro template por defecto, o a nuestra hoja javascript común:

1
2
3
4
5
6
7
8
jQuery(document).ready(function($) {
  // Ajax not found
  $(this).ajaxError(function(event, request, opts) {
    if (request.status == 404) {
      alert(eval('(' + request.responseText + ')').message);
    }
  });
});

Con esto mostraremos una alerta mostrando el texto que hayamos definido en nuestro app_error al usuario que intente adquirir una url no existente en nuestra aplicación CakePHP.

Evidentemente podéis gestionar más errores a parte del típico error 404, simplemente añadiendo algún if más al código javascript y el método correspondiente en el app_error para gestionarlo.

El parámetro $params lo he pasado por si queréis utilizar alguna de sus variables. Por ejemplo, podríamos mostrar al usuario un mensaje tipo “La página /requetefuck no existe”.

Nota: Si estáis utilizando Cake 1.2 tened en cuenta que tenéis que reemplazar en la vista ajax_error404 el $this->Javascript por $javascript, ya que ha variado de una versión a otra.