Arxiu

Entrades etiquetades ‘Ajax’

Errores 404 con Ajax (y jQuery) en CakePHP

dissabte, 10 de juliol de 2010 Booletaire Sense comentaris

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.

<?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

<?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:

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.

CakePHP Auth Component ajaxLogin

diumenge, 27 de desembre de 2009 Booletaire Sense comentaris

Si habéis leído mi tutorial sobre la subida de ficheros con uploadify y validación Ajax en CakePHP recordaréis que separé los métodos add y ajax_add, ya que pensé que el único modo que había de mostrar un error de sesión al usuario era separando los métodos para, a uno de ellos darle permisos de acceso y al otro no.

De este modo podía mostrar un error de “sesión expirada” al usuario, así:

$user = $this->Auth->user();
if(!empty($user)){
	// Código para añadir el elemento
}else{
	$message = "<b>" . __("Error",true) . ":</b> " . __("Tu sesión ha expirado, vuelve a iniciarla por favor",true);
	$data = $this->data;
	$this->set('sessionTimeOut',compact('message','data'));
}

Pues bien, acabo de descubrir que el componente Auth tiene una variable llamada ajaxLogin con la que podemos evitarnos todas estas líneas de código en cada uno de nuestros métodos tratados con ajax. Además esto nos permitirá poner ambos métodos (add y ajax_add) en un mismo método y utilizar el RequestHandler para distinguir los procesos a realizar de ambos.

Esta variable debéis configurarla en vuestro beforeFilter (probablemente del AppController aunque puede que prefiráis hacerlo en cada controlador por separado):

$this->Auth->ajaxLogin = '/ajax/ajax_login';

Y después crear la vista correspondiente. La vista correspondiente al tutorial de subida de ficheros con uploadify y validación ajax sería así:

<?php // /app/views/ajax/ajax_login.ctp
$message = __("La teva sessió ha expirat. Torna a iniciar-la siusplau",true);
$sessionTimeOut = compact('message');
echo json_encode(compact('sessionTimeOut'));

El método json_encode es de PHP 5.2, así que si tenéis una versión anterior de PHP tendréis que utilizar el Helper de JavaScript para mostrar el resultado en JSON.

Categories: Programació, Web Etiquetes:, , ,

Detectar solicitud AJAX con PHP

dijous, 26 de novembre de 2009 Booletaire Sense comentaris

Si queréis detectar las solicitudes AJAX mediante PHP podéis hacerlo mediante la variable HTTP_X_REQUESTED_WITH:

/* Verificamos si hay ajax  */
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
	/* Contenido ajax */
}else{
	/* Contenido normal */
}

Id con cuidado porque algunos servidores no proporcionan la variable HTTP_X_REQUESTED_WITH, así que haced alguna prueba antes de ir con toda la confianza a usarlo directamente en vuestra aplicación ;)

Categories: Programació, Web Etiquetes:, ,

Subida de ficheros con Uploadify y validación Ajax en CakePHP

dimarts, 27 de octubre de 2009 Booletaire 47 comentaris

Ya hacía tiempo que tenía ganas de escribir una entrada “de estas” :D (de estas quiero decir de programación y con muuuucho muuuucho código, como a mí me gustan :P ).

Hace unos meses conté cómo podíais utilizar el plugin Uploadify (de jQuery) para subir ficheros a vuestro portal hecho con CakePHP. Hoy iremos un poco más allá y crearemos un upload de imágenes con validación de campos con Ajax.

Antes de empezar estaría bien que hubierais leído el anterior tutorial —e incluso haberlo probado— para tener algo de práctica en el asunto. Este tutorial será (bastante) de ampliación del anterior. Quiero decir que habrá cosas en las que no profundizaré porque ya lo hice en el anterior, así como que en este hay mejoras, como la gestión de la respuesta de uploadify con JSON en lugar de con texto plano.

Si queréis podéis ver el resultado del tutorial que voy a explicar en este enlace:

Llegir més…

Categories: Programació, Web Etiquetes:, , , , ,