pictcode / lib / Cake / Model / Validator / CakeValidationRule.php @ 0b1b8047
履歴 | 表示 | アノテート | ダウンロード (7.741 KB)
1 |
<?php
|
---|---|
2 |
/**
|
3 |
* CakeValidationRule.
|
4 |
*
|
5 |
* Provides the Model validation logic.
|
6 |
*
|
7 |
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
|
8 |
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
9 |
*
|
10 |
* Licensed under The MIT License
|
11 |
* For full copyright and license information, please see the LICENSE.txt
|
12 |
* Redistributions of files must retain the above copyright notice.
|
13 |
*
|
14 |
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
15 |
* @link http://cakephp.org CakePHP(tm) Project
|
16 |
* @package Cake.Model.Validator
|
17 |
* @since CakePHP(tm) v 2.2.0
|
18 |
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
19 |
*/
|
20 |
|
21 |
App::uses('Validation', 'Utility'); |
22 |
|
23 |
/**
|
24 |
* CakeValidationRule object. Represents a validation method, error message and
|
25 |
* rules for applying such method to a field.
|
26 |
*
|
27 |
* @package Cake.Model.Validator
|
28 |
* @link http://book.cakephp.org/2.0/en/data-validation.html
|
29 |
*/
|
30 |
class CakeValidationRule { |
31 |
|
32 |
/**
|
33 |
* Whether the field passed this validation rule
|
34 |
*
|
35 |
* @var mixed
|
36 |
*/
|
37 |
protected $_valid = true; |
38 |
|
39 |
/**
|
40 |
* Holds whether the record being validated exists in datasource or not
|
41 |
*
|
42 |
* @var bool
|
43 |
*/
|
44 |
protected $_recordExists = false; |
45 |
|
46 |
/**
|
47 |
* Validation method
|
48 |
*
|
49 |
* @var mixed
|
50 |
*/
|
51 |
protected $_rule = null; |
52 |
|
53 |
/**
|
54 |
* Validation method arguments
|
55 |
*
|
56 |
* @var array
|
57 |
*/
|
58 |
protected $_ruleParams = array(); |
59 |
|
60 |
/**
|
61 |
* Holds passed in options
|
62 |
*
|
63 |
* @var array
|
64 |
*/
|
65 |
protected $_passedOptions = array(); |
66 |
|
67 |
/**
|
68 |
* The 'rule' key
|
69 |
*
|
70 |
* @var mixed
|
71 |
*/
|
72 |
public $rule = 'blank'; |
73 |
|
74 |
/**
|
75 |
* The 'required' key
|
76 |
*
|
77 |
* @var mixed
|
78 |
*/
|
79 |
public $required = null; |
80 |
|
81 |
/**
|
82 |
* The 'allowEmpty' key
|
83 |
*
|
84 |
* @var bool
|
85 |
*/
|
86 |
public $allowEmpty = null; |
87 |
|
88 |
/**
|
89 |
* The 'on' key
|
90 |
*
|
91 |
* @var string
|
92 |
*/
|
93 |
public $on = null; |
94 |
|
95 |
/**
|
96 |
* The 'last' key
|
97 |
*
|
98 |
* @var bool
|
99 |
*/
|
100 |
public $last = true; |
101 |
|
102 |
/**
|
103 |
* The 'message' key
|
104 |
*
|
105 |
* @var string
|
106 |
*/
|
107 |
public $message = null; |
108 |
|
109 |
/**
|
110 |
* Constructor
|
111 |
*
|
112 |
* @param array $validator [optional] The validator properties
|
113 |
*/
|
114 |
public function __construct($validator = array()) { |
115 |
$this->_addValidatorProps($validator); |
116 |
} |
117 |
|
118 |
/**
|
119 |
* Checks if the rule is valid
|
120 |
*
|
121 |
* @return bool
|
122 |
*/
|
123 |
public function isValid() { |
124 |
if (!$this->_valid || (is_string($this->_valid) && !empty($this->_valid))) { |
125 |
return false; |
126 |
} |
127 |
|
128 |
return true; |
129 |
} |
130 |
|
131 |
/**
|
132 |
* Returns whether the field can be left blank according to this rule
|
133 |
*
|
134 |
* @return bool
|
135 |
*/
|
136 |
public function isEmptyAllowed() { |
137 |
return $this->skip() || $this->allowEmpty === true; |
138 |
} |
139 |
|
140 |
/**
|
141 |
* Checks if the field is required according to the `required` property
|
142 |
*
|
143 |
* @return bool
|
144 |
*/
|
145 |
public function isRequired() { |
146 |
if (in_array($this->required, array('create', 'update'), true)) { |
147 |
if ($this->required === 'create' && !$this->isUpdate() || $this->required === 'update' && $this->isUpdate()) { |
148 |
return true; |
149 |
} |
150 |
return false; |
151 |
} |
152 |
|
153 |
return $this->required; |
154 |
} |
155 |
|
156 |
/**
|
157 |
* Checks whether the field failed the `field should be present` validation
|
158 |
*
|
159 |
* @param string $field Field name
|
160 |
* @param array &$data Data to check rule against
|
161 |
* @return bool
|
162 |
*/
|
163 |
public function checkRequired($field, &$data) { |
164 |
return (
|
165 |
(!array_key_exists($field, $data) && $this->isRequired() === true) || |
166 |
( |
167 |
array_key_exists($field, $data) && (empty($data[$field]) && |
168 |
!is_numeric($data[$field])) && $this->allowEmpty === false |
169 |
) |
170 |
); |
171 |
} |
172 |
|
173 |
/**
|
174 |
* Checks if the allowEmpty key applies
|
175 |
*
|
176 |
* @param string $field Field name
|
177 |
* @param array &$data data to check rule against
|
178 |
* @return bool
|
179 |
*/
|
180 |
public function checkEmpty($field, &$data) { |
181 |
if (empty($data[$field]) && $data[$field] != '0' && $this->allowEmpty === true) { |
182 |
return true; |
183 |
} |
184 |
return false; |
185 |
} |
186 |
|
187 |
/**
|
188 |
* Checks if the validation rule should be skipped
|
189 |
*
|
190 |
* @return bool True if the ValidationRule can be skipped
|
191 |
*/
|
192 |
public function skip() { |
193 |
if (!empty($this->on)) { |
194 |
if ($this->on === 'create' && $this->isUpdate() || $this->on === 'update' && !$this->isUpdate()) { |
195 |
return true; |
196 |
} |
197 |
} |
198 |
return false; |
199 |
} |
200 |
|
201 |
/**
|
202 |
* Returns whether this rule should break validation process for associated field
|
203 |
* after it fails
|
204 |
*
|
205 |
* @return bool
|
206 |
*/
|
207 |
public function isLast() { |
208 |
return (bool)$this->last; |
209 |
} |
210 |
|
211 |
/**
|
212 |
* Gets the validation error message
|
213 |
*
|
214 |
* @return string
|
215 |
*/
|
216 |
public function getValidationResult() { |
217 |
return $this->_valid; |
218 |
} |
219 |
|
220 |
/**
|
221 |
* Gets an array with the rule properties
|
222 |
*
|
223 |
* @return array
|
224 |
*/
|
225 |
protected function _getPropertiesArray() { |
226 |
$rule = $this->rule; |
227 |
if (!is_string($rule)) { |
228 |
unset($rule[0]); |
229 |
} |
230 |
return array( |
231 |
'rule' => $rule, |
232 |
'required' => $this->required, |
233 |
'allowEmpty' => $this->allowEmpty, |
234 |
'on' => $this->on, |
235 |
'last' => $this->last, |
236 |
'message' => $this->message |
237 |
); |
238 |
} |
239 |
|
240 |
/**
|
241 |
* Sets the recordExists configuration value for this rule,
|
242 |
* ir refers to whether the model record it is validating exists
|
243 |
* exists in the collection or not (create or update operation)
|
244 |
*
|
245 |
* If called with no parameters it will return whether this rule
|
246 |
* is configured for update operations or not.
|
247 |
*
|
248 |
* @param bool $exists Boolean to indicate if records exists
|
249 |
* @return bool
|
250 |
*/
|
251 |
public function isUpdate($exists = null) { |
252 |
if ($exists === null) { |
253 |
return $this->_recordExists; |
254 |
} |
255 |
return $this->_recordExists = $exists; |
256 |
} |
257 |
|
258 |
/**
|
259 |
* Dispatches the validation rule to the given validator method
|
260 |
*
|
261 |
* @param string $field Field name
|
262 |
* @param array &$data Data array
|
263 |
* @param array &$methods Methods list
|
264 |
* @return bool True if the rule could be dispatched, false otherwise
|
265 |
*/
|
266 |
public function process($field, &$data, &$methods) { |
267 |
$this->_valid = true; |
268 |
$this->_parseRule($field, $data); |
269 |
|
270 |
$validator = $this->_getPropertiesArray(); |
271 |
$rule = strtolower($this->_rule); |
272 |
if (isset($methods[$rule])) { |
273 |
$this->_ruleParams[] = array_merge($validator, $this->_passedOptions); |
274 |
$this->_ruleParams[0] = array($field => $this->_ruleParams[0]); |
275 |
$this->_valid = call_user_func_array($methods[$rule], $this->_ruleParams); |
276 |
} elseif (class_exists('Validation') && method_exists('Validation', $this->_rule)) { |
277 |
$this->_valid = call_user_func_array(array('Validation', $this->_rule), $this->_ruleParams); |
278 |
} elseif (is_string($validator['rule'])) { |
279 |
$this->_valid = preg_match($this->_rule, $data[$field]); |
280 |
} else {
|
281 |
trigger_error(__d('cake_dev', 'Could not find validation handler %s for %s', $this->_rule, $field), E_USER_WARNING); |
282 |
return false; |
283 |
} |
284 |
|
285 |
return true; |
286 |
} |
287 |
|
288 |
/**
|
289 |
* Resets internal state for this rule, by default it will become valid
|
290 |
* and it will set isUpdate() to false
|
291 |
*
|
292 |
* @return void
|
293 |
*/
|
294 |
public function reset() { |
295 |
$this->_valid = true; |
296 |
$this->_recordExists = false; |
297 |
} |
298 |
|
299 |
/**
|
300 |
* Returns passed options for this rule
|
301 |
*
|
302 |
* @param string|int $key Array index
|
303 |
* @return array|null
|
304 |
*/
|
305 |
public function getOptions($key) { |
306 |
if (!isset($this->_passedOptions[$key])) { |
307 |
return null; |
308 |
} |
309 |
return $this->_passedOptions[$key]; |
310 |
} |
311 |
|
312 |
/**
|
313 |
* Sets the rule properties from the rule entry in validate
|
314 |
*
|
315 |
* @param array $validator [optional]
|
316 |
* @return void
|
317 |
*/
|
318 |
protected function _addValidatorProps($validator = array()) { |
319 |
if (!is_array($validator)) { |
320 |
$validator = array('rule' => $validator); |
321 |
} |
322 |
foreach ($validator as $key => $value) { |
323 |
if (isset($value) || !empty($value)) { |
324 |
if (in_array($key, array('rule', 'required', 'allowEmpty', 'on', 'message', 'last'))) { |
325 |
$this->{$key} = $validator[$key]; |
326 |
} else {
|
327 |
$this->_passedOptions[$key] = $value; |
328 |
} |
329 |
} |
330 |
} |
331 |
} |
332 |
|
333 |
/**
|
334 |
* Parses the rule and sets the rule and ruleParams
|
335 |
*
|
336 |
* @param string $field Field name
|
337 |
* @param array &$data Data array
|
338 |
* @return void
|
339 |
*/
|
340 |
protected function _parseRule($field, &$data) { |
341 |
if (is_array($this->rule)) { |
342 |
$this->_rule = $this->rule[0]; |
343 |
$this->_ruleParams = array_merge(array($data[$field]), array_values(array_slice($this->rule, 1))); |
344 |
} else {
|
345 |
$this->_rule = $this->rule; |
346 |
$this->_ruleParams = array($data[$field]); |
347 |
} |
348 |
} |
349 |
|
350 |
} |