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 la definición de validadores
86
$validatorsDefinition = $model->validators();
88
// Si no hay validadores definidos
89
if(!$validatorsDefinition) {
93
// 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;
115
// Resultado de validacion
120
* Aplica un validador a una columna
122
* @param ActiveRecord $model
123
* @param string $column
124
* @param string $validator
125
* @param array $params
126
* @param boolean $update
129
private function _validatorOnColumn($model, $column, $validator, $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);
142
* Validador para campo no nulo
144
* @param ActiveRecord $model
145
* @param string $column columna a validar
146
* @param array $params
148
public function notNullValidator($model, $column, $params = NULL)
150
// TODO: Se puede optimizar en conjunto a validate, hay que revisarlo mejor
151
if(!isset($model->$column) || Validate::isNull($model->$column)) {
152
if($params && isset($params['message'])) {
153
Flash::error($params['message']);
155
Flash::error("El campo $column no debe ser Nulo");
165
* Validador para campo con valor unico
167
* @param ActiveRecord $model
168
* @param string $column columna a validar
169
* @param array $params
170
* @param boolean $update
173
public function uniqueValidator($model, $column, $params = NULL, $update = FALSE)
176
$q = $model->get()->where("$column = :$column");
177
$values = array($column => $model->$column);
179
// Si es para actualizar debe verificar que no sea la fila que corresponde
180
// a la clave primaria
182
// Obtiene la metadata
183
$metadata = DbAdapter::factory($model->getConnection())->describe($model->getTable(), $model->getSchema());
185
// Obtiene la clave primaria
186
$pk = $metadata->getPK();
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");
193
$q->where("NOT $pk = :$pk");
194
$values[$pk] = $model->$pk;
197
if($params && isset($params['with'])) {
198
// Establece condiciones con with
199
foreach($params['with'] as $k) {
200
// En un indice UNIQUE si uno de los campos es NULL, entonces el indice
201
// no esta completo y no se considera la restriccion
202
if(!isset($model->$k) || $model->$k === '') {
206
$values[$k] = $model->$k;
207
$q->where("$k = :$k");
212
// Verifica si existe
213
if($model->existsOne()) {
214
if(!isset($params['message'])) {
215
$v = implode("', '", array_values($values));
216
$c = implode("', '", array_keys($values));
217
$msg = "Los valores '$v' ya existen para los campos '$c'";
219
$msg = $params['message'];
228
// Verifica si existe
229
if($model->existsOne()) {
230
if(!isset($params['message'])) {
231
$msg = "El valor '{$model->$column}' ya existe para el campo $column";
233
$msg = $params['message'];
245
* Validador para clave primaria
247
* @param string $column columna a validar
248
* @param array $params
250
public function primaryValidator($model, $column, $params = NULL, $update = FALSE)
256
* Validador para campo con valor numero entero
258
* @param string $column columna a validar
259
* @param array $params
262
public function integerValidator($model, $column, $params = NULL)
264
if(!Validate::int($model->$column)) {
265
if($params && isset($params['message'])) {
266
Flash::error($params['message']);
268
Flash::error("El campo $column debe ser un número entero");