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.