1 
2 #ifdef HAVE_CONFIG_H
3 #include "../../ext_config.h"
4 #endif
5 
6 #include <php.h>
7 #include "../../php_ext.h"
8 #include "../../ext.h"
9 
10 #include <Zend/zend_operators.h>
11 #include <Zend/zend_exceptions.h>
12 #include <Zend/zend_interfaces.h>
13 
14 #include "kernel/main.h"
15 #include "kernel/object.h"
16 #include "kernel/memory.h"
17 #include "ext/spl/spl_exceptions.h"
18 #include "kernel/exception.h"
19 #include "kernel/array.h"
20 #include "kernel/operators.h"
21 #include "kernel/fcall.h"
22 
23 
24 /**
25  * Phalcon\Validation\Validator
26  *
27  * This is a base class for validators
28  */
ZEPHIR_INIT_CLASS(Phalcon_Validation_Validator)29 ZEPHIR_INIT_CLASS(Phalcon_Validation_Validator) {
30 
31 	ZEPHIR_REGISTER_CLASS(Phalcon\\Validation, Validator, phalcon, validation_validator, phalcon_validation_validator_method_entry, ZEND_ACC_EXPLICIT_ABSTRACT_CLASS);
32 
33 	zend_declare_property_null(phalcon_validation_validator_ce, SL("_options"), ZEND_ACC_PROTECTED TSRMLS_CC);
34 
35 	zend_class_implements(phalcon_validation_validator_ce TSRMLS_CC, 1, phalcon_validation_validatorinterface_ce);
36 	return SUCCESS;
37 
38 }
39 
40 /**
41  * Phalcon\Validation\Validator constructor
42  */
PHP_METHOD(Phalcon_Validation_Validator,__construct)43 PHP_METHOD(Phalcon_Validation_Validator, __construct) {
44 
45 	zval *options_param = NULL;
46 	zval *options = NULL;
47 
48 	ZEPHIR_MM_GROW();
49 	zephir_fetch_params(1, 0, 1, &options_param);
50 
51 	if (!options_param) {
52 		ZEPHIR_INIT_VAR(options);
53 		array_init(options);
54 	} else {
55 	options = options_param;
56 	}
57 
58 
59 	zephir_update_property_this(getThis(), SL("_options"), options TSRMLS_CC);
60 	ZEPHIR_MM_RESTORE();
61 
62 }
63 
64 /**
65  * Checks if an option has been defined
66 
67  * @deprecated since 2.1.0
68  * @see \Phalcon\Validation\Validator::hasOption()
69  */
PHP_METHOD(Phalcon_Validation_Validator,isSetOption)70 PHP_METHOD(Phalcon_Validation_Validator, isSetOption) {
71 
72 	zval *key_param = NULL, *_0;
73 	zval *key = NULL;
74 
75 	ZEPHIR_MM_GROW();
76 	zephir_fetch_params(1, 1, 0, &key_param);
77 
78 	if (UNEXPECTED(Z_TYPE_P(key_param) != IS_STRING && Z_TYPE_P(key_param) != IS_NULL)) {
79 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'key' must be a string") TSRMLS_CC);
80 		RETURN_MM_NULL();
81 	}
82 	if (EXPECTED(Z_TYPE_P(key_param) == IS_STRING)) {
83 		zephir_get_strval(key, key_param);
84 	} else {
85 		ZEPHIR_INIT_VAR(key);
86 		ZVAL_EMPTY_STRING(key);
87 	}
88 
89 
90 	_0 = zephir_fetch_nproperty_this(this_ptr, SL("_options"), PH_NOISY_CC);
91 	RETURN_MM_BOOL(zephir_array_isset(_0, key));
92 
93 }
94 
95 /**
96  * Checks if an option is defined
97  */
PHP_METHOD(Phalcon_Validation_Validator,hasOption)98 PHP_METHOD(Phalcon_Validation_Validator, hasOption) {
99 
100 	zval *key_param = NULL, *_0;
101 	zval *key = NULL;
102 
103 	ZEPHIR_MM_GROW();
104 	zephir_fetch_params(1, 1, 0, &key_param);
105 
106 	if (UNEXPECTED(Z_TYPE_P(key_param) != IS_STRING && Z_TYPE_P(key_param) != IS_NULL)) {
107 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'key' must be a string") TSRMLS_CC);
108 		RETURN_MM_NULL();
109 	}
110 	if (EXPECTED(Z_TYPE_P(key_param) == IS_STRING)) {
111 		zephir_get_strval(key, key_param);
112 	} else {
113 		ZEPHIR_INIT_VAR(key);
114 		ZVAL_EMPTY_STRING(key);
115 	}
116 
117 
118 	_0 = zephir_fetch_nproperty_this(this_ptr, SL("_options"), PH_NOISY_CC);
119 	RETURN_MM_BOOL(zephir_array_isset(_0, key));
120 
121 }
122 
123 /**
124  * Returns an option in the validator's options
125  * Returns null if the option hasn't set
126  */
PHP_METHOD(Phalcon_Validation_Validator,getOption)127 PHP_METHOD(Phalcon_Validation_Validator, getOption) {
128 
129 	zend_bool _0$$4;
130 	zval *key_param = NULL, *defaultValue = NULL, *options = NULL, *value = NULL, *fieldValue = NULL;
131 	zval *key = NULL;
132 
133 	ZEPHIR_MM_GROW();
134 	zephir_fetch_params(1, 1, 1, &key_param, &defaultValue);
135 
136 	if (UNEXPECTED(Z_TYPE_P(key_param) != IS_STRING && Z_TYPE_P(key_param) != IS_NULL)) {
137 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'key' must be a string") TSRMLS_CC);
138 		RETURN_MM_NULL();
139 	}
140 	if (EXPECTED(Z_TYPE_P(key_param) == IS_STRING)) {
141 		zephir_get_strval(key, key_param);
142 	} else {
143 		ZEPHIR_INIT_VAR(key);
144 		ZVAL_EMPTY_STRING(key);
145 	}
146 	if (!defaultValue) {
147 		defaultValue = ZEPHIR_GLOBAL(global_null);
148 	}
149 
150 
151 	options = zephir_fetch_nproperty_this(this_ptr, SL("_options"), PH_NOISY_CC);
152 	if (Z_TYPE_P(options) == IS_ARRAY) {
153 		if (zephir_array_isset_fetch(&value, options, key, 1 TSRMLS_CC)) {
154 			_0$$4 = ZEPHIR_IS_STRING(key, "attribute");
155 			if (_0$$4) {
156 				_0$$4 = Z_TYPE_P(value) == IS_ARRAY;
157 			}
158 			if (_0$$4) {
159 				if (zephir_array_isset_fetch(&fieldValue, value, key, 1 TSRMLS_CC)) {
160 					RETURN_CTOR(fieldValue);
161 				}
162 			}
163 			RETURN_CTOR(value);
164 		}
165 	}
166 	RETVAL_ZVAL(defaultValue, 1, 0);
167 	RETURN_MM();
168 
169 }
170 
171 /**
172  * Sets an option in the validator
173  */
PHP_METHOD(Phalcon_Validation_Validator,setOption)174 PHP_METHOD(Phalcon_Validation_Validator, setOption) {
175 
176 	zval *key_param = NULL, *value;
177 	zval *key = NULL;
178 
179 	ZEPHIR_MM_GROW();
180 	zephir_fetch_params(1, 2, 0, &key_param, &value);
181 
182 	if (UNEXPECTED(Z_TYPE_P(key_param) != IS_STRING && Z_TYPE_P(key_param) != IS_NULL)) {
183 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'key' must be a string") TSRMLS_CC);
184 		RETURN_MM_NULL();
185 	}
186 	if (EXPECTED(Z_TYPE_P(key_param) == IS_STRING)) {
187 		zephir_get_strval(key, key_param);
188 	} else {
189 		ZEPHIR_INIT_VAR(key);
190 		ZVAL_EMPTY_STRING(key);
191 	}
192 
193 
194 	zephir_update_property_array(this_ptr, SL("_options"), key, value TSRMLS_CC);
195 	ZEPHIR_MM_RESTORE();
196 
197 }
198 
199 /**
200  * Executes the validation
201  */
PHP_METHOD(Phalcon_Validation_Validator,validate)202 PHP_METHOD(Phalcon_Validation_Validator, validate) {
203 
204 }
205 
206 /**
207  * Prepares a label for the field.
208  */
PHP_METHOD(Phalcon_Validation_Validator,prepareLabel)209 PHP_METHOD(Phalcon_Validation_Validator, prepareLabel) {
210 
211 	zend_long ZEPHIR_LAST_CALL_STATUS;
212 	zval *field = NULL;
213 	zval *validation, *field_param = NULL, *label = NULL, *_0, *_1$$3;
214 
215 	ZEPHIR_MM_GROW();
216 	zephir_fetch_params(1, 2, 0, &validation, &field_param);
217 
218 	if (UNEXPECTED(Z_TYPE_P(field_param) != IS_STRING && Z_TYPE_P(field_param) != IS_NULL)) {
219 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'field' must be a string") TSRMLS_CC);
220 		RETURN_MM_NULL();
221 	}
222 	if (EXPECTED(Z_TYPE_P(field_param) == IS_STRING)) {
223 		zephir_get_strval(field, field_param);
224 	} else {
225 		ZEPHIR_INIT_VAR(field);
226 		ZVAL_EMPTY_STRING(field);
227 	}
228 
229 
230 	ZEPHIR_INIT_VAR(_0);
231 	ZVAL_STRING(_0, "label", ZEPHIR_TEMP_PARAM_COPY);
232 	ZEPHIR_CALL_METHOD(&label, this_ptr, "getoption", NULL, 0, _0);
233 	zephir_check_temp_parameter(_0);
234 	zephir_check_call_status();
235 	if (Z_TYPE_P(label) == IS_ARRAY) {
236 		zephir_array_fetch(&_1$$3, label, field, PH_NOISY | PH_READONLY, "phalcon/validation/validator.zep", 110 TSRMLS_CC);
237 		ZEPHIR_CPY_WRT(label, _1$$3);
238 	}
239 	if (ZEPHIR_IS_EMPTY(label)) {
240 		ZEPHIR_CALL_METHOD(&label, validation, "getlabel", NULL, 0, field);
241 		zephir_check_call_status();
242 	}
243 	RETURN_CCTOR(label);
244 
245 }
246 
247 /**
248  * Prepares a validation message.
249  */
PHP_METHOD(Phalcon_Validation_Validator,prepareMessage)250 PHP_METHOD(Phalcon_Validation_Validator, prepareMessage) {
251 
252 	zend_long ZEPHIR_LAST_CALL_STATUS;
253 	zval *field = NULL, *type = NULL, *option = NULL;
254 	zval *validation, *field_param = NULL, *type_param = NULL, *option_param = NULL, *message = NULL, *_0$$3;
255 
256 	ZEPHIR_MM_GROW();
257 	zephir_fetch_params(1, 3, 1, &validation, &field_param, &type_param, &option_param);
258 
259 	if (UNEXPECTED(Z_TYPE_P(field_param) != IS_STRING && Z_TYPE_P(field_param) != IS_NULL)) {
260 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'field' must be a string") TSRMLS_CC);
261 		RETURN_MM_NULL();
262 	}
263 	if (EXPECTED(Z_TYPE_P(field_param) == IS_STRING)) {
264 		zephir_get_strval(field, field_param);
265 	} else {
266 		ZEPHIR_INIT_VAR(field);
267 		ZVAL_EMPTY_STRING(field);
268 	}
269 	if (UNEXPECTED(Z_TYPE_P(type_param) != IS_STRING && Z_TYPE_P(type_param) != IS_NULL)) {
270 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'type' must be a string") TSRMLS_CC);
271 		RETURN_MM_NULL();
272 	}
273 	if (EXPECTED(Z_TYPE_P(type_param) == IS_STRING)) {
274 		zephir_get_strval(type, type_param);
275 	} else {
276 		ZEPHIR_INIT_VAR(type);
277 		ZVAL_EMPTY_STRING(type);
278 	}
279 	if (!option_param) {
280 		ZEPHIR_INIT_VAR(option);
281 		ZVAL_STRING(option, "message", 1);
282 	} else {
283 	if (UNEXPECTED(Z_TYPE_P(option_param) != IS_STRING && Z_TYPE_P(option_param) != IS_NULL)) {
284 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'option' must be a string") TSRMLS_CC);
285 		RETURN_MM_NULL();
286 	}
287 	if (EXPECTED(Z_TYPE_P(option_param) == IS_STRING)) {
288 		zephir_get_strval(option, option_param);
289 	} else {
290 		ZEPHIR_INIT_VAR(option);
291 		ZVAL_EMPTY_STRING(option);
292 	}
293 	}
294 
295 
296 	ZEPHIR_CALL_METHOD(&message, this_ptr, "getoption", NULL, 0, option);
297 	zephir_check_call_status();
298 	if (Z_TYPE_P(message) == IS_ARRAY) {
299 		zephir_array_fetch(&_0$$3, message, field, PH_NOISY | PH_READONLY, "phalcon/validation/validator.zep", 129 TSRMLS_CC);
300 		ZEPHIR_CPY_WRT(message, _0$$3);
301 	}
302 	if (ZEPHIR_IS_EMPTY(message)) {
303 		ZEPHIR_CALL_METHOD(&message, validation, "getdefaultmessage", NULL, 0, type);
304 		zephir_check_call_status();
305 	}
306 	RETURN_CCTOR(message);
307 
308 }
309 
310 /**
311  * Prepares a validation code.
312  */
PHP_METHOD(Phalcon_Validation_Validator,prepareCode)313 PHP_METHOD(Phalcon_Validation_Validator, prepareCode) {
314 
315 	zend_long ZEPHIR_LAST_CALL_STATUS;
316 	zval *field_param = NULL, *code = NULL, *_0, *_1$$3;
317 	zval *field = NULL;
318 
319 	ZEPHIR_MM_GROW();
320 	zephir_fetch_params(1, 1, 0, &field_param);
321 
322 	if (UNEXPECTED(Z_TYPE_P(field_param) != IS_STRING && Z_TYPE_P(field_param) != IS_NULL)) {
323 		zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'field' must be a string") TSRMLS_CC);
324 		RETURN_MM_NULL();
325 	}
326 	if (EXPECTED(Z_TYPE_P(field_param) == IS_STRING)) {
327 		zephir_get_strval(field, field_param);
328 	} else {
329 		ZEPHIR_INIT_VAR(field);
330 		ZVAL_EMPTY_STRING(field);
331 	}
332 
333 
334 	ZEPHIR_INIT_VAR(_0);
335 	ZVAL_STRING(_0, "code", ZEPHIR_TEMP_PARAM_COPY);
336 	ZEPHIR_CALL_METHOD(&code, this_ptr, "getoption", NULL, 0, _0);
337 	zephir_check_temp_parameter(_0);
338 	zephir_check_call_status();
339 	if (Z_TYPE_P(code) == IS_ARRAY) {
340 		zephir_array_fetch(&_1$$3, code, field, PH_NOISY | PH_READONLY, "phalcon/validation/validator.zep", 148 TSRMLS_CC);
341 		ZEPHIR_CPY_WRT(code, _1$$3);
342 	}
343 	RETURN_CCTOR(code);
344 
345 }
346 
347