Arxiu

Arxiu de febrer de 2010

Validar datos duplicados en CakePHP

25 de febrer de 2010 Booletaire

Hoy mismo he necesitado de una validación para verificar si un dato ya existe en la base de datos. Dado que CakePHP 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.

Programació, Web , , , ,

MyJDB, un sistema de base de datos en JavaScript

25 de febrer de 2010 Booletaire

El próximo lunes 1 de marzo (de 2010) verá la luz la primera versión de MyJDB, un sistema de bases de datos inspirado en JavaScriptDB (muerto hacia el 2005..) resucitado por Luis García.

Lo mas destacado de esta versión (beta 1.1.0), que es más un puente hacia lo que se quiere llegar, es la optimización del código, aunque es la primera optimización los resultados han sido cuanto menos sorprendentes. Entre sus cambios destacan los siguientes:

  • Relicenciamiento a GPL 3.
  • Documentación interna completa y en Ingles, así como las variables que pasan del catalán al ingles para internacionalizar el proyecto.
  • Reestructuración completa del código.
  • Nuevo analizador sintactico del Select sobre un 40% más rápido.
  • Tipado de datos de los campos de las tablas, lo que nos ayuda a evaluar correctamente números, cadenas y sobre todo fechas.
  • El algoritmo para realizar JOIN entre dos tablas es alrededor de 640 veces más rápido.
  • Se ha añadido el uso de between, el uso de parentesis, reconocimiento de ‘<=>’.
  • Implementación de la clausula limit.
  • Reconocimiento de is, is not, is null, is not null y unknown.
  • Realización de un select con sólo contando el tiempo de la clausula where alrededor de un 40 veces más rápido.
  • Evaluación de la clausula where alrededor de un 94% más rápido.
  • La evaluación de una condición LIKE es alrededor de 8 veces más rápida.
  • La clausula Order by es alrededor de 2 veces más rápido.

Los tiempos han sido medidos con Firefox y el prerfilador de Firebug, con lo que aun queda probarlo en el resto de navegadores, y este es el objetivo de lanzar la beta, probarla y hacerla compatibles con el resto de navegadores (no van a incluir IE6, sólo versiones de IE7 hacia arriba).

Yo personalmente me pregunto cómo será todo el tema de la seguridad… ya que siendo una base de datos mediante JavaScript lo primero en lo que pienso es la manipulación que se puede hacer de código gracias a aplicaciones como firebug.

Programació, Web , , ,

Smashing magazine: Diferencias entre IE6, IE7 e IE8

11 de febrer de 2010 DPAM23

Smashing magazine: diferencias CSS entre IE6, IE7, IE8

Hablando de CSS, hoy he encontrado (como siempre por casualidad, buscando otra cosa XD) una guia con las diferencias entre MSIE6, MSIE7 y MSIE8. Que propiedades soportan cada uno en función de la versión.

Muchas de ellas las hemos aprendido a base de cabezazos contra la pantalla, pero la verdad es que esta guia está realmente bien, siempre hay alguna cosilla que no conoces.

Recomiendo especialmente el apartado donde hablan de “Significant Bugs and Incompatibilities” , donde detallan todos los errores que nos encontramos al maquetar en los diferentes navegadores de microsoft.

y por supuesto para el que no la conozca, visitad smashing magazine, es genial.

Disseny , , , , , , ,

CSS hacks para Firefox, Internet Explorer, Chrome, Opera, Safari…

8 de febrer de 2010 Booletaire

Todos sabemos lo divertido y emocionante que es hacer la compatibilidad crossbrowser de nuestras páginas web.

Por suerte para nosotros, existen un gran número de hacks CSS que podemos utilizar en cada una de las versiones de cada navegador para ayudarnos a poder mostrar por igual los contenidos de una web en todos los navegadores.

Partiré de este estilo:

.selector {
	color: #CCCCCC;
}

Empezaré por Internet Explorer, dado que es para el que usualmente se necesitan más hacks:

Internet Explorer 6
.selector {
	_color: #CCCCCC;
}

Recordad que IE6 no interpreta la propiedad (o palabra clave..) de CSS “!important” por lo que podéis jugar con ello (aunque no es lo más recomendable):

Internet Explorer 6 (!important)
.selector {
	color: #CCCCCC !important;
	color: #000000; /* Éste estilo sólo se aplicará a Internet Explorer 6 */
}
Internet Explorer 7 y anteriores:
.selector {
	*color: #CCCCCC;
}
Internet Explorer 8

Este es un poco putilla, ya que el mismo hack de IE8 a veces lo interpreta IE7… así que, si nos interesa, primero habrá que poner algo que interprete únicamente IE7 y después hay que poner el hack de IE8:

/* Interpretado únicamente por IE7 (actúa como un !important) */
*:first-child+html .selector {
	color: #CCCCCC;
}
.selector {
	color /*\**/: #CCCCCC\9   /* Sin punto y coma!! */
}
Todas las versiones de Internet Explorer
.selector {
	color: #CCCCCC\9   /* Sin punto y coma!! */
}
Internet Explorer 7 y demás navegadores modernos (incluido IE8)
html>body .selector {
	color: #CCCCCC;
}
Todos los navegadores modernos (incluido IE8)
html>/**/body .selector {
	color: #CCCCCC;
}
Opera 9.27 y anteriores
html:first-child .selector {
	color: #CCCCCC;
}
Safari
html[xmlns*=""] body:last-child .selector {
	color: #CCCCCC;
}
Safari 3+, Opera 9+, Firefox 3.5+ y Chrome 1+
body:nth-of-type(1) .selector {
	color: #CCCCCC;
}
/* Otra opción... */
body:first-of-type .selector {
	color: #CCCCCC;
}

/* Y otra más... */
@media screen and (-webkit-min-device-pixel-ratio:0) {
	.selector {
		color: #CCCCCC;
	}
}
Safari 3+ y Chrome 1+
@media screen and (-webkit-min-device-pixel-ratio:0) {
	.selector {
		color: #CCCCCC;
	}
}

/* Otra opción... */
body:nth-of-type(1) .selector{
   color: #CCCCCC;
}
Todas las versiones de Firefox
@-moz-document url-prefix() {
	.selector {
		color: #CCCCCC;
	}
 } 
Cualquier Gecko (incluido Firefox)
*>.selector {
	color: #CCCCCC;
}
Firefox 1.5+
.selector, x:-moz-any-link, x:only-child {
	color: #CCCCCC;
}
Firefox 2 y versiones anteriores
body:empty .selector {
	color: #CCCCCC;
}

/* Otra opción... */
html>/**/body .selector, x:-moz-any-link {
	color: #CCCCCC;
}
Firefox 3 (y quizás más nuevos)
html>/**/body .selector, x:-moz-any-link, x:default {
	color: #CCCCCC;
}

No he probado todos ellos así que si veis alguno que no funciona, por favor, hacédmelo saber para que pueda buscar alguna alternativa (o eliminarlo…).

Además os invito a que añadáis cualquier hack de CSS que no haya puesto comentando esta entrada :)

Páginas de referencia:

Programació, Web , , , , ,