3
* KumbiaPHP web & app Framework
7
* This source file is subject to the new BSD license that is bundled
8
* with this package in the file LICENSE.txt.
9
* It is also available through the world-wide-web at this URL:
10
* http://wiki.kumbiaphp.com/Licencia
11
* If you did not receive a copy of the license and are unable to
12
* obtain it through the world-wide-web, please send an email
13
* to license@kumbiaphp.com so we can send you a copy immediately.
15
* Realiza validacion para campo con valor unico
18
* @package ActiveRecord
19
* @subpackage Validators
20
* @copyright Copyright (c) 2005-2010 Kumbia Team (http://www.kumbiaphp.com)
21
* @license http://wiki.kumbiaphp.com/Licencia New BSD License
23
class UniqueValidator implements ValidatorInterface
28
* @param ActiveRecord $object objeto ActiveRecord
29
* @param string $column nombre de columna a validar
30
* @param array $params parametros de configuracion
31
* @param boolean $update indica si es operacion de actualizacion
34
public static function validate($object, $column, $params = NULL, $update = FALSE)
41
// Si es para actualizar debe verificar que no sea la fila que corresponde
42
// a la clave primaria
44
// Obtiene la clave primaria
45
$pk = $object->metadata()->getPK();
48
// Itera en cada columna de la clave primaria
49
$conditions = array();
51
// Verifica que este definida la clave primaria
52
if(!isset($object->$k) || $object->$k === '') {
53
throw new KumbiaException("Debe definir valor para la columna $k de la clave primaria");
56
$conditions[] = "$k = :pk_$k";
57
$q->bindValue("pk_$k", $object->$k);
60
$q->where('NOT (' . implode(' AND ', $conditions) . ')');
62
// Verifica que este definida la clave primaria
63
if(!isset($object->$pk) || $object->$pk === '') {
64
throw new KumbiaException("Debe definir valor para la clave primaria $pk");
67
$q->where("NOT $pk = :pk_$pk");
68
$q->bindValue("pk_$pk", $object->$pk);
72
if(is_array($column)) {
73
// Establece condiciones con with
74
foreach($column as $k) {
75
// En un indice UNIQUE si uno de los campos es NULL, entonces el indice
76
// no esta completo y no se considera la restriccion
77
if(!isset($object->$k) || $object->$k === '') {
81
$values[$k] = $object->$k;
82
$q->where("$k = :$k");
88
if($object->existsOne()) {
89
if(!isset($params['message'])) {
90
$v = implode("', '", array_values($values));
91
$c = implode("', '", array_keys($values));
92
$msg = "Los valores '$v' ya existen para los campos '$c'";
94
$msg = $params['message'];
101
$values[$column] = $object->$column;
103
$q->where("$column = :$column")->bind($values);
104
// Verifica si existe
105
if($object->existsOne()) {
106
if(!isset($params['message'])) {
107
$msg = "El valor '{$object->$column}' ya existe para el campo $column";
109
$msg = $params['message'];