~desarrollokumbia/kumbia/ActiveRecord

« back to all changes in this revision

Viewing changes to active_record2/active_record_validator.php

  • Committer: Emilio Silveira
  • Date: 2010-07-12 04:47:04 UTC
  • Revision ID: emilio.rst@gmail.com-20100712044704-2pwwlq8ypfvwwusc
Comenzando con las validaciones al crear y adicionados otros metodos 
utiles

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/**
 
3
 * KumbiaPHP web & app Framework
 
4
 *
 
5
 * LICENSE
 
6
 *
 
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.
 
14
 *
 
15
 * Validador para ActiveRecord
 
16
 * 
 
17
 * @category   Kumbia
 
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
 
21
 */
 
22
 
 
23
class ActiveRecordValidator
 
24
{       
 
25
        /**
 
26
         * Instancia del validador
 
27
         * 
 
28
         * @var ActiveRecordValidator
 
29
         */ 
 
30
        private static $_instance = NULL;
 
31
        
 
32
        /**
 
33
         * Constructor
 
34
         * 
 
35
         * @param ActiveRecord $model
 
36
         * @param boolean $update
 
37
         */
 
38
        private function __construct()
 
39
        {}
 
40
        
 
41
        /**
 
42
         * Obtiene una instancia
 
43
         * 
 
44
         * @return ActiveRecordValidator
 
45
         */
 
46
        public static function getInstance()
 
47
        {
 
48
                if(!self::$_instance) {
 
49
                        self::$_instance = new self;
 
50
                }
 
51
                return self::$_instance;
 
52
        }
 
53
        
 
54
        /**
 
55
         * Validar en caso de crear
 
56
         * 
 
57
         * @param ActiveRecord $model
 
58
         * @return boolean
 
59
         */
 
60
        public final static function validateOnCreate($model)
 
61
        {
 
62
                return self::getInstance()->_validate($model);
 
63
        }
 
64
        
 
65
        /**
 
66
         * Validar en caso de actualizar
 
67
         * 
 
68
         * @param ActiveRecord $model
 
69
         * @return boolean
 
70
         */
 
71
        public final static function validateOnUpdate($model)
 
72
        {
 
73
                return self::getInstance()->_validate($model, TRUE);
 
74
        }
 
75
        
 
76
        /**
 
77
         * Efectua las validaciones
 
78
         * 
 
79
         * @param ActiveRecord $model
 
80
         * @param boolean $update
 
81
         * @return boolean
 
82
         */
 
83
        private function _validate($model, $update = FALSE)
 
84
        {
 
85
                // Obtiene la definición de validadores
 
86
                $validatorsDefinition = $model->validators();
 
87
                
 
88
                // Si no hay validadores definidos
 
89
                if(!$validatorsDefinition) {
 
90
                        return TRUE;
 
91
                }
 
92
                
 
93
                // Por defecto es valido
 
94
                $valid = TRUE;
 
95
                
 
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;
 
108
                                        }
 
109
                                }
 
110
                                
 
111
                        }
 
112
                                        
 
113
                }
 
114
                
 
115
                // Resultado de validacion
 
116
                return $valid;
 
117
        }
 
118
        
 
119
        /**
 
120
         * Aplica un validador a una columna
 
121
         * 
 
122
         * @param ActiveRecord $model
 
123
         * @param string $column
 
124
         * @param string $validator
 
125
         * @param array $params
 
126
         * @param boolean $update
 
127
         * @return boolean
 
128
         */
 
129
        private function _validatorOnColumn($model, $column, $validator, $params, $update)
 
130
        {
 
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);
 
136
                }
 
137
                
 
138
                return TRUE;
 
139
        }
 
140
        
 
141
        /**
 
142
         * Validador para campo no nulo
 
143
         * 
 
144
         * @param ActiveRecord $model
 
145
         * @param string $column columna a validar
 
146
         * @param array $params
 
147
         */
 
148
        public function notNullValidator($model, $column, $params = NULL) 
 
149
        {
 
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']);
 
154
                        } else {
 
155
                                Flash::error("El campo $column no debe ser Nulo");
 
156
                        }
 
157
                        
 
158
                        return FALSE;
 
159
                }
 
160
                                
 
161
                return TRUE;    
 
162
        }
 
163
        
 
164
        /**
 
165
         * Validador para campo con valor unico
 
166
         * 
 
167
         * @param ActiveRecord $model
 
168
         * @param string $column columna a validar
 
169
         * @param array $params
 
170
         * @param boolean $update
 
171
         * @return boolean
 
172
         */
 
173
        public function uniqueValidator($model, $column, $params = NULL, $update = FALSE) 
 
174
        {       
 
175
                // Condiciones
 
176
                $q = $model->get()->where("$column = :$column");                        
 
177
                $values = array($column => $model->$column);
 
178
                
 
179
                // Si es para actualizar debe verificar que no sea la fila que corresponde
 
180
                // a la clave primaria
 
181
                if($update) {
 
182
                        // Obtiene la metadata
 
183
                        $metadata = DbAdapter::factory($model->getConnection())->describe($model->getTable(), $model->getSchema());
 
184
                                        
 
185
                        // Obtiene la clave primaria
 
186
                        $pk = $metadata->getPK();
 
187
                                        
 
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");
 
191
                        }
 
192
                                        
 
193
                        $q->where("NOT $pk = :$pk");
 
194
                        $values[$pk] = $model->$pk;
 
195
                }
 
196
                
 
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 === '') {
 
203
                                        return TRUE;
 
204
                                }
 
205
                                
 
206
                                $values[$k] = $model->$k;
 
207
                                $q->where("$k = :$k");
 
208
                        }
 
209
                        
 
210
                        $q->bind($values);
 
211
                                
 
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'";
 
218
                                } else {
 
219
                                        $msg = $params['message'];
 
220
                                }
 
221
                                        
 
222
                                Flash::error($msg);
 
223
                                return FALSE;
 
224
                        }
 
225
                } else {                                                                 
 
226
                        $q->bind($values);
 
227
                        
 
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";
 
232
                                } else {
 
233
                                        $msg = $params['message'];
 
234
                                }
 
235
                                
 
236
                                Flash::error($msg);
 
237
                                return FALSE;
 
238
                        }
 
239
                }
 
240
                
 
241
                return TRUE;    
 
242
        }
 
243
        
 
244
        /**
 
245
         * Validador para clave primaria
 
246
         * 
 
247
         * @param string $column columna a validar
 
248
         * @param array $params
 
249
         */
 
250
        public function primaryValidator($model, $column, $params = NULL, $update = FALSE)
 
251
        {
 
252
                
 
253
        }
 
254
        
 
255
        /**
 
256
         * Validador para campo con valor numero entero
 
257
         * 
 
258
         * @param string $column columna a validar
 
259
         * @param array $params
 
260
         * @return boolean
 
261
         */
 
262
        public function integerValidator($model, $column, $params = NULL) 
 
263
        {
 
264
                if(!Validate::int($model->$column)) {
 
265
                        if($params && isset($params['message'])) {
 
266
                                Flash::error($params['message']);
 
267
                        } else {
 
268
                                Flash::error("El campo $column debe ser un número entero");
 
269
                        }
 
270
                        
 
271
                        return FALSE;
 
272
                }
 
273
                                
 
274
                return TRUE;    
 
275
        }
 
276
}