83
83
private function _validate($model, $update = FALSE)
85
// Obtiene la definición de validadores
86
$validatorsDefinition = $model->validators();
85
// Obtiene los validadores
86
$validators = $model->validators();
88
88
// Si no hay validadores definidos
89
if(!$validatorsDefinition) {
93
// Columnas autogeneradas
96
// Verifica si existe columnas autogeneradas
97
if(isset($validators['auto'])) {
99
// Itera en cada definicion de validacion
100
foreach($validators['auto'] as $v) {
101
// Si es una columna sin configuracion especial
111
// Verifica las condiciones para cuando la columna es autogenerada
112
$autogen[$column] = $this->autoValidator($model, $column, $params, $update);
115
// Aprovecha y libera memoria :)
116
unset($validators['auto']);
93
120
// Por defecto es valido
96
// Realiza las validaciones por columna
97
foreach($validatorsDefinition as $column => $validators) {
98
// Si es una validación simple column => validador
99
if(is_string($validators)) {
100
$valid = $this->_validatorOnColumn($model, $column, $validators, NULL, $update) && $valid;
101
} else { // Se trata de un conjunto de validadores
102
// Itera en los validadores
103
foreach($validators as $k => $v) {
104
if(is_int($k)) { // Un validador simple
105
$valid = $this->_validatorOnColumn($model, $column, $v, NULL, $update) && $valid;
106
} else { // Un validador con parametros de configuracion
107
$valid = $this->_validatorOnColumn($model, $column, $k, $v, $update) && $valid;
123
// Verifica si existe columnas no nulas
124
if(isset($validators['notNull'])) {
126
// Itera en cada definicion de validacion
127
foreach($validators['notNull'] as $v) {
128
// Si es una columna sin configuracion especial
130
// Si es autogenerada entonces salta la validacion
131
if(isset($autogen[$v]) && $autogen[$v]) {
138
// Si es autogenerada entonces salta la validacion
139
if(isset($autogen[$v[0]]) && $autogen[$v[0]]) {
148
// Valida si el campo
149
$valid = $this->notNullValidator($model, $column, $params) && $valid;
152
// Aprovecha y libera memoria :)
153
unset($validators['notNull']);
157
// Realiza el resto de las validaciones a las columnas
158
foreach($validators as $validator => $validations) {
160
// Itera en cada definicion de validacion
161
foreach($validations as $v) {
163
// Si es una columna sin configuracion especial
165
// Si es autogenerada entonces salta la validacion
166
if(isset($autogen[$v]) && $autogen[$v]) {
173
// Si es autogenerada entonces salta la validacion
174
if(is_string($v[0]) && isset($autogen[$v[0]]) && $autogen[$v[0]]) {
183
if(is_array($column) || (isset($model->$column) && $model->$column != '')) {
184
$valid = $this->{"{$validator}Validator"}($model, $column, $params, $update) && $valid;
115
191
// Resultado de validacion
120
* Aplica un validador a una columna
196
* Validator para columnas con valores autogenerados
122
198
* @param ActiveRecord $model
123
* @param string $column
124
* @param string $validator
199
* @param string $column columna a validar
125
200
* @param array $params
126
201
* @param boolean $update
127
202
* @return boolean
129
private function _validatorOnColumn($model, $column, $validator, $params, $update)
204
public function autoValidator($model, $column, $params, $update)
131
// Validador notNull es especial
132
if($validator == 'notNull') {
133
return $this->notNullValidator($model, $column, $params);
134
} elseif(isset($model->$column) && $model->$column != '') {
135
return $this->{"{$validator}Validator"}($model, $column, $params, $update);
206
// Se ha indicado el campo y no se considera nulo, por lo tanto no se autogenerará
207
if(isset($model->$column) && $model->$column != '') {
208
// Se considera para autogenerar cuando sea nulo
212
// Se verifica para cuando es autogenerado
214
// Autogenerado al actualizar
215
if(isset($params['update'])) {
216
return $update == $params['update'];
219
// Autogenerado al crear y al actualizar
220
return isset($params['createAndUpdate']);
223
// Autogenerado al crear
173
258
public function uniqueValidator($model, $column, $params = NULL, $update = FALSE)
176
$q = $model->get()->where("$column = :$column");
177
$values = array($column => $model->$column);
179
265
// Si es para actualizar debe verificar que no sea la fila que corresponde
180
266
// a la clave primaria
182
// Obtiene la metadata
183
$metadata = DbAdapter::factory($model->getConnection())->describe($model->getTable(), $model->getSchema());
185
268
// Obtiene la clave primaria
186
$pk = $metadata->getPK();
269
$pk = $model->getPK();
272
// Itera en cada columna de la clave primaria
273
$conditions = array();
275
// Verifica que este definida la clave primaria
276
if(!isset($model->$k) || $model->$k === '') {
277
throw new KumbiaException("Debe definir valor para la columna $k de la clave primaria");
188
// Verifica que este definida la clave primaria
189
if(!isset($model->$pk) || $model->$pk !== '') {
190
throw new KumbiaException("Debe definir valor para la clave primaria $pk");
280
$conditions[] = "$k = :pk_$k";
281
$q->bindValue("pk_$k", $model->$k);
284
$q->where('NOT (' . implode(' AND ', $conditions) . ')');
286
// Verifica que este definida la clave primaria
287
if(!isset($model->$pk) || $model->$pk === '') {
288
throw new KumbiaException("Debe definir valor para la clave primaria $pk");
291
$q->where("NOT $pk = :pk_$pk");
292
$q->bindValue("pk_$pk", $model->$pk);
193
$q->where("NOT $pk = :$pk");
194
$values[$pk] = $model->$pk;
197
if($params && isset($params['with'])) {
296
if(is_array($column)) {
198
297
// Establece condiciones con with
199
foreach($params['with'] as $k) {
298
foreach($column as $k) {
200
299
// En un indice UNIQUE si uno de los campos es NULL, entonces el indice
201
300
// no esta completo y no se considera la restriccion
202
301
if(!isset($model->$k) || $model->$k === '') {
250
350
public function primaryValidator($model, $column, $params = NULL, $update = FALSE)
355
if(is_array($column)) {
358
// Establece condiciones
359
foreach($column as $k) {
360
// En un indice UNIQUE si uno de los campos es NULL, entonces el indice
361
// no esta completo y no se considera la restriccion
362
if(!isset($model->$k) || $model->$k === '') {
366
$values[$k] = $model->$k;
367
$q->where("$k = :$k");
370
// Si es para actualizar debe verificar que no sea la fila que corresponde
371
// a la clave primaria
373
$conditions = array();
374
foreach($column as $k) {
375
$conditions[] = "$k = :pk_$k";
376
$q->bindValue("pk_$k", $model->$k);
379
$q->where('NOT (' . implode(' AND ', $conditions) . ')');
384
// Verifica si existe
385
if($model->existsOne()) {
386
if(!isset($params['message'])) {
387
$v = implode("', '", array_values($values));
388
$c = implode("', '", array_keys($values));
389
$msg = "Los valores '$v' ya existen para los campos '$c'";
391
$msg = $params['message'];
398
// Si es para actualizar debe verificar que no sea la fila que corresponde
399
// a la clave primaria
401
$q->where("NOT $column = :pk_$column");
402
$q->bindValue("pk_$column", $model->$column);
405
$q->where("$column = :$column")->bindValue($column, $model->$column);
407
// Verifica si existe
408
if($model->existsOne()) {
409
if(!isset($params['message'])) {
410
$msg = "El valor '{$model->$column}' ya existe para el campo $column";
412
$msg = $params['message'];
446
* Validador para longitud de una cadena en un rango determinado
448
* @param string $column columna a validar
449
* @param array $params
452
public function lengthBetween($model, $column, $params)
454
if(!Validate::between($model->$column, $params['min'], $params['max'])) {
455
if(isset($params['message'])) {
456
Flash::error($params['message']);
458
Flash::error("El campo $column debe tener una cantidad de caracteres comprendida entre $min y $max");
468
* Validador para longitud minima de una cadena
470
* @param string $column columna a validar
471
* @param array $params
474
public function minLengthValidator($model, $column, $params)
476
if(strlen($model->$column) < $params['min']) {
477
if(isset($params['message'])) {
478
Flash::error($params['message']);
480
Flash::error("El campo $column debe tener una cantidad de caracteres minima de {$params['min']}");
490
* Validador para longitud maxima de una cadena
492
* @param string $column columna a validar
493
* @param array $params
496
public function maxLengthValidator($model, $column, $params)
498
if(strlen($model->$column) > $params['max']) {
499
if(isset($params['message'])) {
500
Flash::error($params['message']);
502
Flash::error("El campo $column debe tener una cantidad de caracteres maxima de {$params['max']}");