Arxiu

Entrades etiquetades ‘Snippet’

Validar datos duplicados en CakePHP

dijous, 25 de febrer de 2010 Booletaire 5 comentaris

Hoy mismo he necesitado de una validación para verificar si un dato ya existe en la base de datos. Dado que CakePHP 1.1 (en versiones posteriores a la 1.2 podéis utilizar “isUnique”) no lleva una validación en su núcleo para estos menesteres he tenido que crearla y ahora la comparto con vosotros:

/**
 * Verifica si un campo existe en la base de datos
 * Si estamos editando se excluye el valor guardado en la validación
 * @param array $data
 * @param string $field Nom de la cel·la a verificar
 * @return
 */

public function checkUnique($data)
{
	$field = array_pop(array_keys($data));
	$data = array_pop(array_values($data));

	// Si estem editant...
	if(isset($this->data[$this->name]['id']))
	{
		if ($field == $this->field($field, array($this->name . '.id' => $this->data[$this->name]['id'])))
		{
			return true;
		}
	}
	// Si no estem editant...
	if($this->hasField($field)) {
		return $this->isUnique(array($field => $data));
	}
}

Para utilizarlo no tenéis más que añadir el trozo de código en el modelo deseado (normalmente en AppModel, para poder utilizarlo desde cualquier modelo) y añadir la validación en el modelo que queráis:

var $validate = array('NOMBRE DE LA CELDA A VALIDAR' => array(
	'rule'		=> 'checkUnique',
	'message' 	=> 'Blahblahblah'));

Un ejemplo muy común:

var $validate = array('username' => array(
	'rule'		=> 'checkUnique',
	'message' 	=> 'Ya existe un usuario registrado con este nombre!'));

Que lo disfrutéis :)

Edición: Se me olvidó comentar que, a diferencia del método de validación checkUnique que se utiliza en el post Inegrando CakePHP y PhpBB 3.x, este método sirve también a la hora de editar un ítem ya que, en ese caso, retorna true si el valor de la celda coincide con el ya guardado en la base de datos.

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

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