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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** * 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:
1 2 3 4 5 6 | var $validate = array( 'NOMBRE DE LA CELDA A VALIDAR' => array( 'rule' => 'checkUnique', 'message' => 'Blahblahblah' ) ); |
Un ejemplo muy común:
1 2 3 4 5 6 | 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.