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 [1], 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.