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
* Validador para ActiveRecord
18
* @package ActiveRecord
19
* @copyright Copyright (c) 2005-2010 Kumbia Team (http://www.kumbiaphp.com)
20
* @license http://wiki.kumbiaphp.com/Licencia New BSD License
23
class ActiveRecordValidator
26
* Instancia del validador
28
* @var ActiveRecordValidator
30
private static $_instance = NULL;
35
* @param ActiveRecord $model
36
* @param boolean $update
38
private function __construct()
42
* Obtiene una instancia
44
* @return ActiveRecordValidator
46
public static function getInstance()
48
if(!self::$_instance) {
49
self::$_instance = new self;
51
return self::$_instance;
55
* Validar en caso de crear
57
* @param ActiveRecord $model
60
public final static function validateOnCreate($model)
62
return self::getInstance()->_validate($model);
66
* Validar en caso de actualizar
68
* @param ActiveRecord $model
71
public final static function validateOnUpdate($model)
73
return self::getInstance()->_validate($model, TRUE);
77
* Efectua las validaciones
79
* @param ActiveRecord $model
80
* @param boolean $update
83
private function _validate($model, $update = FALSE)
85
// Obtiene los validadores
86
$validators = $model->validators();
88
// Si no hay validadores definidos
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']);
120
// Por defecto es valido
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;
191
// Resultado de validacion
196
* Validator para columnas con valores autogenerados
198
* @param ActiveRecord $model
199
* @param string $column columna a validar
200
* @param array $params
201
* @param boolean $update
204
public function autoValidator($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
228
* Validador para campo no nulo
230
* @param ActiveRecord $model
231
* @param string $column columna a validar
232
* @param array $params
234
public function notNullValidator($model, $column, $params = NULL)
236
if(!isset($model->$column) || Validate::isNull($model->$column)) {
237
if($params && isset($params['message'])) {
238
Flash::error($params['message']);
240
Flash::error("El campo $column no debe ser Nulo");
250
* Validador para campo con valor unico
252
* @param ActiveRecord $model
253
* @param string $column columna a validar
254
* @param array $params
255
* @param boolean $update
258
public function uniqueValidator($model, $column, $params = NULL, $update = FALSE)
265
// Si es para actualizar debe verificar que no sea la fila que corresponde
266
// a la clave primaria
268
// Obtiene la clave primaria
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");
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);
296
if(is_array($column)) {
297
// Establece condiciones con with
298
foreach($column as $k) {
299
// En un indice UNIQUE si uno de los campos es NULL, entonces el indice
300
// no esta completo y no se considera la restriccion
301
if(!isset($model->$k) || $model->$k === '') {
305
$values[$k] = $model->$k;
306
$q->where("$k = :$k");
311
// Verifica si existe
312
if($model->existsOne()) {
313
if(!isset($params['message'])) {
314
$v = implode("', '", array_values($values));
315
$c = implode("', '", array_keys($values));
316
$msg = "Los valores '$v' ya existen para los campos '$c'";
318
$msg = $params['message'];
325
$values[$column] = $model->$column;
327
$q->where("$column = :$column")->bind($values);
328
// Verifica si existe
329
if($model->existsOne()) {
330
if(!isset($params['message'])) {
331
$msg = "El valor '{$model->$column}' ya existe para el campo $column";
333
$msg = $params['message'];
345
* Validador para clave primaria
347
* @param string $column columna a validar
348
* @param array $params
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'];
424
* Validador para campo con valor numero entero
426
* @param string $column columna a validar
427
* @param array $params
430
public function integerValidator($model, $column, $params = NULL)
432
if(!Validate::int($model->$column)) {
433
if($params && isset($params['message'])) {
434
Flash::error($params['message']);
436
Flash::error("El campo $column debe ser un número entero");
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']}");