blob: 9fb686892efc721855e5e772d661a87c0a927f5a [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Eric Barnescccde962011-12-04 00:01:17 -05008 *
Andrey Andreev125ef472016-01-11 12:33:00 +02009 * Copyright (c) 2014 - 2016, British Columbia Institute of Technology
Eric Barnescccde962011-12-04 00:01:17 -050010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Derek Jonesf4a4bd82011-10-20 12:18:42 -050017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
Andrey Andreev1924e872016-01-11 12:55:34 +020031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
Andrey Andreev125ef472016-01-11 12:33:00 +020032 * @copyright Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
Andrey Andreevbd202c92016-01-11 12:50:18 +020034 * @link https://codeigniter.com
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020035 * @since Version 1.0.0
Derek Allard2067d1a2008-11-13 22:59:24 +000036 * @filesource
37 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +000039
Derek Allard2067d1a2008-11-13 22:59:24 +000040/**
41 * Form Validation Class
42 *
43 * @package CodeIgniter
44 * @subpackage Libraries
45 * @category Validation
Derek Jonesf4a4bd82011-10-20 12:18:42 -050046 * @author EllisLab Dev Team
Andrey Andreevbd202c92016-01-11 12:50:18 +020047 * @link https://codeigniter.com/user_guide/libraries/form_validation.html
Derek Allard2067d1a2008-11-13 22:59:24 +000048 */
49class CI_Form_validation {
Barry Mienydd671972010-10-04 16:33:58 +020050
Timothy Warren0688ac92012-04-20 10:25:04 -040051 /**
52 * Reference to the CodeIgniter instance
53 *
54 * @var object
55 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +010056 protected $CI;
Derek Allard2067d1a2008-11-13 22:59:24 +000057
Timothy Warren0688ac92012-04-20 10:25:04 -040058 /**
59 * Validation data for the current form submission
60 *
61 * @var array
62 */
Andrey Andreev56454792012-05-17 14:32:19 +030063 protected $_field_data = array();
64
Timothy Warren0688ac92012-04-20 10:25:04 -040065 /**
66 * Validation rules for the current form
67 *
68 * @var array
69 */
Andrey Andreev56454792012-05-17 14:32:19 +030070 protected $_config_rules = array();
71
Timothy Warren0688ac92012-04-20 10:25:04 -040072 /**
73 * Array of validation errors
74 *
75 * @var array
76 */
Andrey Andreev78f55772012-04-03 19:59:08 +030077 protected $_error_array = array();
Andrey Andreev56454792012-05-17 14:32:19 +030078
Timothy Warren0688ac92012-04-20 10:25:04 -040079 /**
80 * Array of custom error messages
81 *
82 * @var array
83 */
Andrey Andreev78f55772012-04-03 19:59:08 +030084 protected $_error_messages = array();
Andrey Andreev56454792012-05-17 14:32:19 +030085
Timothy Warren0688ac92012-04-20 10:25:04 -040086 /**
87 * Start tag for error wrapping
88 *
89 * @var string
90 */
Andrey Andreev78f55772012-04-03 19:59:08 +030091 protected $_error_prefix = '<p>';
Andrey Andreev56454792012-05-17 14:32:19 +030092
Timothy Warren0688ac92012-04-20 10:25:04 -040093 /**
94 * End tag for error wrapping
Andrey Andreev56454792012-05-17 14:32:19 +030095 *
Timothy Warren0688ac92012-04-20 10:25:04 -040096 * @var string
97 */
Andrey Andreev78f55772012-04-03 19:59:08 +030098 protected $_error_suffix = '</p>';
Andrey Andreev56454792012-05-17 14:32:19 +030099
Timothy Warren0688ac92012-04-20 10:25:04 -0400100 /**
101 * Custom error message
102 *
103 * @var string
104 */
Andrey Andreev78f55772012-04-03 19:59:08 +0300105 protected $error_string = '';
Andrey Andreev56454792012-05-17 14:32:19 +0300106
Timothy Warren0688ac92012-04-20 10:25:04 -0400107 /**
108 * Whether the form data has been validated as safe
109 *
110 * @var bool
111 */
Andrey Andreev78f55772012-04-03 19:59:08 +0300112 protected $_safe_form_data = FALSE;
Andrey Andreev56454792012-05-17 14:32:19 +0300113
Timothy Warren0688ac92012-04-20 10:25:04 -0400114 /**
115 * Custom data to validate
116 *
117 * @var array
118 */
Andrey Andreevcff35802012-11-26 15:49:52 +0200119 public $validation_data = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000120
Timothy Warren0688ac92012-04-20 10:25:04 -0400121 /**
122 * Initialize Form_Validation class
123 *
Andrey Andreev56454792012-05-17 14:32:19 +0300124 * @param array $rules
125 * @return void
Timothy Warren0688ac92012-04-20 10:25:04 -0400126 */
Greg Akera9263282010-11-10 15:26:43 -0600127 public function __construct($rules = array())
Barry Mienydd671972010-10-04 16:33:58 +0200128 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000129 $this->CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +0200130
Mike Funk326a5e72012-02-24 10:06:28 -0500131 // applies delimiters set in config file.
Mike Funk7f42d062012-03-08 09:00:57 -0500132 if (isset($rules['error_prefix']))
133 {
134 $this->_error_prefix = $rules['error_prefix'];
135 unset($rules['error_prefix']);
136 }
137 if (isset($rules['error_suffix']))
138 {
139 $this->_error_suffix = $rules['error_suffix'];
140 unset($rules['error_suffix']);
141 }
Andrey Andreev31cf46e2012-03-20 15:48:00 +0200142
Derek Allard2067d1a2008-11-13 22:59:24 +0000143 // Validation rules can be stored in a config file.
144 $this->_config_rules = $rules;
Barry Mienydd671972010-10-04 16:33:58 +0200145
Derek Allard2067d1a2008-11-13 22:59:24 +0000146 // Automatically load the form helper
147 $this->CI->load->helper('form');
148
Andrey Andreev90726b82015-01-20 12:39:22 +0200149 log_message('info', 'Form Validation Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +0000150 }
Barry Mienydd671972010-10-04 16:33:58 +0200151
Derek Allard2067d1a2008-11-13 22:59:24 +0000152 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200153
Derek Allard2067d1a2008-11-13 22:59:24 +0000154 /**
155 * Set Rules
156 *
157 * This function takes an array of field names and validation
Andrey Andreev4b90a372014-03-10 10:24:24 +0200158 * rules as input, any custom error messages, validates the info,
Ahmedul Haque Abid42b40002014-01-09 01:10:25 +0600159 * and stores it
Derek Allard2067d1a2008-11-13 22:59:24 +0000160 *
Timothy Warren0688ac92012-04-20 10:25:04 -0400161 * @param mixed $field
162 * @param string $label
163 * @param mixed $rules
Ahmedul Haque Abid0742fad2014-01-09 07:51:10 +0600164 * @param array $errors
Andrew Podner4296a652012-12-17 07:51:15 -0500165 * @return CI_Form_validation
Derek Allard2067d1a2008-11-13 22:59:24 +0000166 */
Andrey Andreev4b90a372014-03-10 10:24:24 +0200167 public function set_rules($field, $label = '', $rules = array(), $errors = array())
Derek Allard2067d1a2008-11-13 22:59:24 +0000168 {
169 // No reason to set rules if we have no POST data
JonoB099c4782012-03-04 14:37:30 +0000170 // or a validation array has not been specified
Andrey Andreev3b2c5082012-03-07 22:49:24 +0200171 if ($this->CI->input->method() !== 'post' && empty($this->validation_data))
Derek Allard2067d1a2008-11-13 22:59:24 +0000172 {
Greg Aker9f9af602010-11-10 15:41:51 -0600173 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000174 }
Barry Mienydd671972010-10-04 16:33:58 +0200175
tiyowanc2acb232012-03-14 21:24:00 +0400176 // If an array was passed via the first parameter instead of individual string
Derek Allard2067d1a2008-11-13 22:59:24 +0000177 // values we cycle through it and recursively call this function.
178 if (is_array($field))
179 {
180 foreach ($field as $row)
181 {
182 // Houston, we have a problem...
Andrey Andreev78f55772012-04-03 19:59:08 +0300183 if ( ! isset($row['field'], $row['rules']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000184 {
185 continue;
186 }
187
188 // If the field label wasn't passed we use the field name
Andrey Andreev78f55772012-04-03 19:59:08 +0300189 $label = isset($row['label']) ? $row['label'] : $row['field'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000190
Ahmedul Haque Abid42b40002014-01-09 01:10:25 +0600191 // Add the custom error message array
Ahmedul Haque Abidea294882014-01-09 16:01:31 +0600192 $errors = (isset($row['errors']) && is_array($row['errors'])) ? $row['errors'] : array();
Ahmedul Haque Abid42b40002014-01-09 01:10:25 +0600193
Derek Allard2067d1a2008-11-13 22:59:24 +0000194 // Here we go!
Ahmedul Haque Abidbc1cbad2014-01-09 07:53:34 +0600195 $this->set_rules($row['field'], $label, $row['rules'], $errors);
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 }
Andrey Andreev78f55772012-04-03 19:59:08 +0300197
Greg Aker9f9af602010-11-10 15:41:51 -0600198 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000199 }
Barry Mienydd671972010-10-04 16:33:58 +0200200
Andrey Andreev475dfac2015-04-07 00:07:04 +0300201 // No fields or no rules? Nothing to do...
202 if ( ! is_string($field) OR $field === '' OR empty($rules))
Derek Allard2067d1a2008-11-13 22:59:24 +0000203 {
Greg Aker9f9af602010-11-10 15:41:51 -0600204 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000205 }
Andrey Andreev4b90a372014-03-10 10:24:24 +0200206 elseif ( ! is_array($rules))
207 {
208 // BC: Convert pipe-separated rules string to an array
Andrey Andreev475dfac2015-04-07 00:07:04 +0300209 if ( ! is_string($rules))
Andrey Andreev4b90a372014-03-10 10:24:24 +0200210 {
211 return $this;
212 }
Andrey Andreev475dfac2015-04-07 00:07:04 +0300213
richcc936352015-09-09 15:52:26 -0400214 $rules = preg_split('/\|(?![^\[]*\])/', $rules);
Andrey Andreev4b90a372014-03-10 10:24:24 +0200215 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000216
217 // If the field label wasn't passed we use the field name
Alex Bilbied261b1e2012-06-02 11:12:16 +0100218 $label = ($label === '') ? $field : $label;
Derek Allard2067d1a2008-11-13 22:59:24 +0000219
Andrey Andreevfde170c2014-03-10 19:55:11 +0200220 $indexes = array();
221
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200222 // Is the field name an array? If it is an array, we break it apart
Barry Mienydd671972010-10-04 16:33:58 +0200223 // into its components so that we can fetch the corresponding POST data later
Andrey Andreev4b90a372014-03-10 10:24:24 +0200224 if (($is_array = (bool) preg_match_all('/\[(.*?)\]/', $field, $matches)) === TRUE)
Barry Mienydd671972010-10-04 16:33:58 +0200225 {
Andrey Andreev7a7ad782012-11-12 17:21:01 +0200226 sscanf($field, '%[^[][', $indexes[0]);
Derek Allard2067d1a2008-11-13 22:59:24 +0000227
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200228 for ($i = 0, $c = count($matches[0]); $i < $c; $i++)
Derek Allard2067d1a2008-11-13 22:59:24 +0000229 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100230 if ($matches[1][$i] !== '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000231 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200232 $indexes[] = $matches[1][$i];
Derek Allard2067d1a2008-11-13 22:59:24 +0000233 }
234 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000235 }
Barry Mienydd671972010-10-04 16:33:58 +0200236
237 // Build our master array
Derek Allard2067d1a2008-11-13 22:59:24 +0000238 $this->_field_data[$field] = array(
Andrey Andreev56454792012-05-17 14:32:19 +0300239 'field' => $field,
240 'label' => $label,
241 'rules' => $rules,
Ahmedul Haque Abid7945d302014-01-09 16:50:23 +0600242 'errors' => $errors,
Andrey Andreev56454792012-05-17 14:32:19 +0300243 'is_array' => $is_array,
244 'keys' => $indexes,
245 'postdata' => NULL,
246 'error' => ''
Phil Sturgeonef112c02011-02-07 13:01:47 +0000247 );
Greg Aker9f9af602010-11-10 15:41:51 -0600248
249 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000250 }
251
252 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200253
Derek Allard2067d1a2008-11-13 22:59:24 +0000254 /**
JonoB099c4782012-03-04 14:37:30 +0000255 * By default, form validation uses the $_POST array to validate
Andrey Andreevc8da4fe2012-03-04 19:20:33 +0200256 *
JonoB099c4782012-03-04 14:37:30 +0000257 * If an array is set through this method, then this array will
258 * be used instead of the $_POST array
Andrey Andreev3b2c5082012-03-07 22:49:24 +0200259 *
260 * Note that if you are validating multiple arrays, then the
261 * reset_validation() function should be called after validating
JonoB883f80f2012-03-05 09:51:27 +0000262 * each array due to the limitations of CI's singleton
Andrey Andreevc8da4fe2012-03-04 19:20:33 +0200263 *
264 * @param array $data
Andrey Andreeva89c1da2014-02-08 19:03:35 +0200265 * @return CI_Form_validation
JonoB099c4782012-03-04 14:37:30 +0000266 */
Andrey Andreeva4712f52014-01-06 11:25:46 +0200267 public function set_data(array $data)
JonoB099c4782012-03-04 14:37:30 +0000268 {
Andrey Andreeva4712f52014-01-06 11:25:46 +0200269 if ( ! empty($data))
JonoB099c4782012-03-04 14:37:30 +0000270 {
Andrey Andreevc8da4fe2012-03-04 19:20:33 +0200271 $this->validation_data = $data;
JonoB099c4782012-03-04 14:37:30 +0000272 }
Andrey Andreeva89c1da2014-02-08 19:03:35 +0200273
274 return $this;
JonoB099c4782012-03-04 14:37:30 +0000275 }
Andrey Andreevc8da4fe2012-03-04 19:20:33 +0200276
JonoB099c4782012-03-04 14:37:30 +0000277 // --------------------------------------------------------------------
Derek Allard2067d1a2008-11-13 22:59:24 +0000278
279 /**
280 * Set Error Message
281 *
Andrey Andreev78f55772012-04-03 19:59:08 +0300282 * Lets users set their own error messages on the fly. Note:
283 * The key name has to match the function name that it corresponds to.
Derek Allard2067d1a2008-11-13 22:59:24 +0000284 *
Andrey Andreev78f55772012-04-03 19:59:08 +0300285 * @param array
Derek Allard2067d1a2008-11-13 22:59:24 +0000286 * @param string
Andrew Podner4296a652012-12-17 07:51:15 -0500287 * @return CI_Form_validation
Derek Allard2067d1a2008-11-13 22:59:24 +0000288 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100289 public function set_message($lang, $val = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000290 {
291 if ( ! is_array($lang))
292 {
293 $lang = array($lang => $val);
294 }
Barry Mienydd671972010-10-04 16:33:58 +0200295
Derek Allard2067d1a2008-11-13 22:59:24 +0000296 $this->_error_messages = array_merge($this->_error_messages, $lang);
Greg Aker9f9af602010-11-10 15:41:51 -0600297 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000298 }
Barry Mienydd671972010-10-04 16:33:58 +0200299
Derek Allard2067d1a2008-11-13 22:59:24 +0000300 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200301
Derek Allard2067d1a2008-11-13 22:59:24 +0000302 /**
303 * Set The Error Delimiter
304 *
305 * Permits a prefix/suffix to be added to each error message
306 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000307 * @param string
308 * @param string
Andrew Podner4296a652012-12-17 07:51:15 -0500309 * @return CI_Form_validation
Barry Mienydd671972010-10-04 16:33:58 +0200310 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100311 public function set_error_delimiters($prefix = '<p>', $suffix = '</p>')
Derek Allard2067d1a2008-11-13 22:59:24 +0000312 {
313 $this->_error_prefix = $prefix;
314 $this->_error_suffix = $suffix;
Greg Aker9f9af602010-11-10 15:41:51 -0600315 return $this;
Derek Allard2067d1a2008-11-13 22:59:24 +0000316 }
317
318 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200319
Derek Allard2067d1a2008-11-13 22:59:24 +0000320 /**
321 * Get Error Message
322 *
323 * Gets the error message associated with a particular field
324 *
Andrey Andreeva4712f52014-01-06 11:25:46 +0200325 * @param string $field Field name
326 * @param string $prefix HTML start tag
Andrey Andreev868301a2014-01-06 12:29:50 +0200327 * @param string $suffix HTML end tag
Andrey Andreev78f55772012-04-03 19:59:08 +0300328 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200329 */
Andrey Andreeva4712f52014-01-06 11:25:46 +0200330 public function error($field, $prefix = '', $suffix = '')
Barry Mienydd671972010-10-04 16:33:58 +0200331 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300332 if (empty($this->_field_data[$field]['error']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000333 {
334 return '';
335 }
Barry Mienydd671972010-10-04 16:33:58 +0200336
Alex Bilbied261b1e2012-06-02 11:12:16 +0100337 if ($prefix === '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000338 {
339 $prefix = $this->_error_prefix;
340 }
341
Alex Bilbied261b1e2012-06-02 11:12:16 +0100342 if ($suffix === '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000343 {
344 $suffix = $this->_error_suffix;
345 }
346
347 return $prefix.$this->_field_data[$field]['error'].$suffix;
348 }
349
350 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200351
Derek Allard2067d1a2008-11-13 22:59:24 +0000352 /**
Michiel Vugteveen676a0dd2012-03-02 10:10:34 +0100353 * Get Array of Error Messages
354 *
355 * Returns the error messages as an array
356 *
357 * @return array
358 */
359 public function error_array()
360 {
361 return $this->_error_array;
362 }
363
364 // --------------------------------------------------------------------
365
366 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000367 * Error String
368 *
369 * Returns the error messages as a string, wrapped in the error delimiters
370 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000371 * @param string
372 * @param string
Andrey Andreev78f55772012-04-03 19:59:08 +0300373 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200374 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100375 public function error_string($prefix = '', $suffix = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000376 {
vlakoff35672462013-02-15 01:36:04 +0100377 // No errors, validation passes!
Derek Allard2067d1a2008-11-13 22:59:24 +0000378 if (count($this->_error_array) === 0)
379 {
380 return '';
381 }
Barry Mienydd671972010-10-04 16:33:58 +0200382
Alex Bilbied261b1e2012-06-02 11:12:16 +0100383 if ($prefix === '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000384 {
385 $prefix = $this->_error_prefix;
386 }
387
Alex Bilbied261b1e2012-06-02 11:12:16 +0100388 if ($suffix === '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000389 {
390 $suffix = $this->_error_suffix;
391 }
Barry Mienydd671972010-10-04 16:33:58 +0200392
Derek Allard2067d1a2008-11-13 22:59:24 +0000393 // Generate the error string
394 $str = '';
395 foreach ($this->_error_array as $val)
396 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100397 if ($val !== '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000398 {
399 $str .= $prefix.$val.$suffix."\n";
400 }
401 }
Barry Mienydd671972010-10-04 16:33:58 +0200402
Derek Allard2067d1a2008-11-13 22:59:24 +0000403 return $str;
404 }
405
406 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200407
Derek Allard2067d1a2008-11-13 22:59:24 +0000408 /**
409 * Run the Validator
410 *
411 * This function does all the work.
412 *
Timothy Warren0688ac92012-04-20 10:25:04 -0400413 * @param string $group
Derek Allard2067d1a2008-11-13 22:59:24 +0000414 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200415 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100416 public function run($group = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000417 {
Andrey Andreevce8fa5a2015-12-14 12:57:09 +0200418 $validation_array = empty($this->validation_data)
419 ? $_POST
420 : $this->validation_data;
Barry Mienydd671972010-10-04 16:33:58 +0200421
Derek Allard2067d1a2008-11-13 22:59:24 +0000422 // Does the _field_data array containing the validation rules exist?
423 // If not, we look to see if they were assigned via a config file
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200424 if (count($this->_field_data) === 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000425 {
Derek Jones37f4b9c2011-07-01 17:56:50 -0500426 // No validation rules? We're done...
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200427 if (count($this->_config_rules) === 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000428 {
429 return FALSE;
430 }
Barry Mienydd671972010-10-04 16:33:58 +0200431
Andrey Andreev3b2803e2014-01-07 14:46:38 +0200432 if (empty($group))
433 {
434 // Is there a validation rule for the particular URI being accessed?
435 $group = trim($this->CI->uri->ruri_string(), '/');
436 isset($this->_config_rules[$group]) OR $group = $this->CI->router->class.'/'.$this->CI->router->method;
437 }
Barry Mienydd671972010-10-04 16:33:58 +0200438
Andrey Andreev3b2803e2014-01-07 14:46:38 +0200439 $this->set_rules(isset($this->_config_rules[$group]) ? $this->_config_rules[$group] : $this->_config_rules);
Barry Mienydd671972010-10-04 16:33:58 +0200440
Andrey Andreev901573c2012-01-11 01:40:48 +0200441 // Were we able to set the rules correctly?
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200442 if (count($this->_field_data) === 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000443 {
Andrey Andreev901573c2012-01-11 01:40:48 +0200444 log_message('debug', 'Unable to find validation rules');
Derek Allard2067d1a2008-11-13 22:59:24 +0000445 return FALSE;
446 }
447 }
Barry Mienydd671972010-10-04 16:33:58 +0200448
Derek Allard2067d1a2008-11-13 22:59:24 +0000449 // Load the language file containing error messages
450 $this->CI->lang->load('form_validation');
Barry Mienydd671972010-10-04 16:33:58 +0200451
Andrey Andreev751f2472012-11-03 18:26:27 +0200452 // Cycle through the rules for each field and match the corresponding $validation_data item
Andrey Andreev55a40b72016-03-12 15:43:22 +0200453 foreach ($this->_field_data as $field => &$row)
Barry Mienydd671972010-10-04 16:33:58 +0200454 {
Andrey Andreev751f2472012-11-03 18:26:27 +0200455 // Fetch the data from the validation_data array item and cache it in the _field_data array.
Derek Allard2067d1a2008-11-13 22:59:24 +0000456 // Depending on whether the field name is an array or a string will determine where we get it from.
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200457 if ($row['is_array'] === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000458 {
JonoB099c4782012-03-04 14:37:30 +0000459 $this->_field_data[$field]['postdata'] = $this->_reduce_array($validation_array, $row['keys']);
Derek Allard2067d1a2008-11-13 22:59:24 +0000460 }
Andrey Andreevb137d232015-04-29 11:44:38 +0300461 elseif (isset($validation_array[$field]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000462 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300463 $this->_field_data[$field]['postdata'] = $validation_array[$field];
Derek Allard2067d1a2008-11-13 22:59:24 +0000464 }
Andrey Andreev751f2472012-11-03 18:26:27 +0200465 }
Barry Mienydd671972010-10-04 16:33:58 +0200466
Andrey Andreev751f2472012-11-03 18:26:27 +0200467 // Execute validation rules
468 // Note: A second foreach (for now) is required in order to avoid false-positives
469 // for rules like 'matches', which correlate to other validation fields.
Andrey Andreev55a40b72016-03-12 15:43:22 +0200470 foreach ($this->_field_data as $field => &$row)
Andrey Andreev751f2472012-11-03 18:26:27 +0200471 {
Andrey Andreev3d9cec92012-07-08 21:50:19 +0300472 // Don't try to validate if we have no rules set
473 if (empty($row['rules']))
474 {
475 continue;
476 }
Barry Mienydd671972010-10-04 16:33:58 +0200477
Andrey Andreev55a40b72016-03-12 15:43:22 +0200478 $this->_execute($row, $row['rules'], $row['postdata']);
Derek Allard2067d1a2008-11-13 22:59:24 +0000479 }
480
481 // Did we end up with any errors?
482 $total_errors = count($this->_error_array);
Derek Allard2067d1a2008-11-13 22:59:24 +0000483 if ($total_errors > 0)
484 {
485 $this->_safe_form_data = TRUE;
486 }
487
488 // Now we need to re-set the POST data with the new, processed data
489 $this->_reset_post_array();
Barry Mienydd671972010-10-04 16:33:58 +0200490
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200491 return ($total_errors === 0);
Derek Allard2067d1a2008-11-13 22:59:24 +0000492 }
493
494 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200495
Derek Allard2067d1a2008-11-13 22:59:24 +0000496 /**
497 * Traverse a multidimensional $_POST array index until the data is found
498 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000499 * @param array
500 * @param array
Andrey Andreev78f55772012-04-03 19:59:08 +0300501 * @param int
Derek Allard2067d1a2008-11-13 22:59:24 +0000502 * @return mixed
Barry Mienydd671972010-10-04 16:33:58 +0200503 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100504 protected function _reduce_array($array, $keys, $i = 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000505 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200506 if (is_array($array) && isset($keys[$i]))
Derek Allard2067d1a2008-11-13 22:59:24 +0000507 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200508 return isset($array[$keys[$i]]) ? $this->_reduce_array($array[$keys[$i]], $keys, ($i+1)) : NULL;
Derek Allard2067d1a2008-11-13 22:59:24 +0000509 }
Barry Mienydd671972010-10-04 16:33:58 +0200510
Andrey Andreev2d48b4f2012-11-23 17:33:21 +0200511 // NULL must be returned for empty fields
Andrey Andreev44c34632012-11-23 18:46:34 +0200512 return ($array === '') ? NULL : $array;
Derek Allard2067d1a2008-11-13 22:59:24 +0000513 }
514
515 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200516
Derek Allard2067d1a2008-11-13 22:59:24 +0000517 /**
518 * Re-populate the _POST array with our finalized and processed data
519 *
Andrey Andreev6de924c2012-01-20 13:18:18 +0200520 * @return void
Barry Mienydd671972010-10-04 16:33:58 +0200521 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100522 protected function _reset_post_array()
Derek Allard2067d1a2008-11-13 22:59:24 +0000523 {
524 foreach ($this->_field_data as $field => $row)
525 {
vlakoff1228fe22013-01-14 01:30:09 +0100526 if ($row['postdata'] !== NULL)
Derek Allard2067d1a2008-11-13 22:59:24 +0000527 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200528 if ($row['is_array'] === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000529 {
530 if (isset($_POST[$row['field']]))
531 {
Andrey Andreevc2268712013-02-08 22:10:23 +0200532 $_POST[$row['field']] = $row['postdata'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000533 }
534 }
535 else
536 {
Derek Jones63eeae32009-02-10 19:08:56 +0000537 // start with a reference
538 $post_ref =& $_POST;
Barry Mienydd671972010-10-04 16:33:58 +0200539
Derek Jones63eeae32009-02-10 19:08:56 +0000540 // before we assign values, make a reference to the right POST key
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200541 if (count($row['keys']) === 1)
Derek Allard2067d1a2008-11-13 22:59:24 +0000542 {
Derek Jones63eeae32009-02-10 19:08:56 +0000543 $post_ref =& $post_ref[current($row['keys'])];
Derek Allard2067d1a2008-11-13 22:59:24 +0000544 }
545 else
546 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000547 foreach ($row['keys'] as $val)
548 {
Derek Jones63eeae32009-02-10 19:08:56 +0000549 $post_ref =& $post_ref[$val];
Derek Allard2067d1a2008-11-13 22:59:24 +0000550 }
551 }
Derek Jones63eeae32009-02-10 19:08:56 +0000552
Derek Allard2067d1a2008-11-13 22:59:24 +0000553 if (is_array($row['postdata']))
Derek Jones63eeae32009-02-10 19:08:56 +0000554 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000555 $array = array();
556 foreach ($row['postdata'] as $k => $v)
557 {
Andrey Andreevc2268712013-02-08 22:10:23 +0200558 $array[$k] = $v;
Derek Allard2067d1a2008-11-13 22:59:24 +0000559 }
Derek Jones63eeae32009-02-10 19:08:56 +0000560
561 $post_ref = $array;
Derek Allard2067d1a2008-11-13 22:59:24 +0000562 }
563 else
Derek Jones63eeae32009-02-10 19:08:56 +0000564 {
Andrey Andreevc2268712013-02-08 22:10:23 +0200565 $post_ref = $row['postdata'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000566 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000567 }
568 }
569 }
570 }
571
572 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200573
Derek Allard2067d1a2008-11-13 22:59:24 +0000574 /**
575 * Executes the Validation routines
576 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000577 * @param array
578 * @param array
579 * @param mixed
Andrey Andreev78f55772012-04-03 19:59:08 +0300580 * @param int
Derek Allard2067d1a2008-11-13 22:59:24 +0000581 * @return mixed
Barry Mienydd671972010-10-04 16:33:58 +0200582 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100583 protected function _execute($row, $rules, $postdata = NULL, $cycles = 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000584 {
585 // If the $_POST data is an array we will run a recursive call
Andrey Andreev7243d0b2016-03-12 11:40:34 +0200586 //
587 // Note: We MUST check if the array is empty or not!
588 // Otherwise empty arrays will always pass validation.
589 if (is_array($postdata) && ! empty($postdata))
Barry Mienydd671972010-10-04 16:33:58 +0200590 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000591 foreach ($postdata as $key => $val)
592 {
Andrey Andreev8d3099d2012-06-21 16:00:20 +0300593 $this->_execute($row, $rules, $val, $key);
Derek Allard2067d1a2008-11-13 22:59:24 +0000594 }
Barry Mienydd671972010-10-04 16:33:58 +0200595
Derek Allard2067d1a2008-11-13 22:59:24 +0000596 return;
597 }
Barry Mienydd671972010-10-04 16:33:58 +0200598
Derek Allard2067d1a2008-11-13 22:59:24 +0000599 // If the field is blank, but NOT required, no further tests are necessary
600 $callback = FALSE;
Hashem Qolami05370bf2013-07-22 01:52:04 +0430601 if ( ! in_array('required', $rules) && ($postdata === NULL OR $postdata === ''))
Derek Allard2067d1a2008-11-13 22:59:24 +0000602 {
603 // Before we bail out, does the rule contain a callback?
Andrey Andreev4b90a372014-03-10 10:24:24 +0200604 foreach ($rules as &$rule)
Derek Allard2067d1a2008-11-13 22:59:24 +0000605 {
Andrey Andreev4b90a372014-03-10 10:24:24 +0200606 if (is_string($rule))
607 {
608 if (strncmp($rule, 'callback_', 9) === 0)
609 {
610 $callback = TRUE;
611 $rules = array(1 => $rule);
612 break;
613 }
614 }
615 elseif (is_callable($rule))
616 {
617 $callback = TRUE;
618 $rules = array(1 => $rule);
619 break;
620 }
Andrey Andreev29de1652015-06-11 17:44:20 +0300621 elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1]))
622 {
623 $callback = TRUE;
Andrey Andreevbd1e6152015-06-15 18:28:36 +0300624 $rules = array(array($rule[0], $rule[1]));
Andrey Andreev29de1652015-06-11 17:44:20 +0300625 break;
626 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000627 }
Andrey Andreev4b90a372014-03-10 10:24:24 +0200628
629 if ( ! $callback)
Derek Allard2067d1a2008-11-13 22:59:24 +0000630 {
631 return;
632 }
633 }
634
Derek Allard2067d1a2008-11-13 22:59:24 +0000635 // Isset Test. Typically this rule will only apply to checkboxes.
Andrey Andreev4b90a372014-03-10 10:24:24 +0200636 if (($postdata === NULL OR $postdata === '') && ! $callback)
Derek Allard2067d1a2008-11-13 22:59:24 +0000637 {
638 if (in_array('isset', $rules, TRUE) OR in_array('required', $rules))
639 {
640 // Set the message type
Andrey Andreev78f55772012-04-03 19:59:08 +0300641 $type = in_array('required', $rules) ? 'required' : 'isset';
Barry Mienydd671972010-10-04 16:33:58 +0200642
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200643 $line = $this->_get_error_message($type, $row['field']);
Barry Mienydd671972010-10-04 16:33:58 +0200644
Derek Allard2067d1a2008-11-13 22:59:24 +0000645 // Build the error message
Eric Roberts41cc0902012-01-24 00:59:44 -0600646 $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']));
Derek Allard2067d1a2008-11-13 22:59:24 +0000647
648 // Save the error message
649 $this->_field_data[$row['field']]['error'] = $message;
Barry Mienydd671972010-10-04 16:33:58 +0200650
Derek Allard2067d1a2008-11-13 22:59:24 +0000651 if ( ! isset($this->_error_array[$row['field']]))
652 {
653 $this->_error_array[$row['field']] = $message;
654 }
655 }
Barry Mienydd671972010-10-04 16:33:58 +0200656
Derek Allard2067d1a2008-11-13 22:59:24 +0000657 return;
658 }
659
660 // --------------------------------------------------------------------
661
662 // Cycle through each rule and run it
Andrey Andreev78f55772012-04-03 19:59:08 +0300663 foreach ($rules as $rule)
Derek Allard2067d1a2008-11-13 22:59:24 +0000664 {
665 $_in_array = FALSE;
Barry Mienydd671972010-10-04 16:33:58 +0200666
Derek Allard2067d1a2008-11-13 22:59:24 +0000667 // We set the $postdata variable with the current data in our master array so that
668 // each cycle of the loop is dealing with the processed data from the last cycle
Alex Bilbied261b1e2012-06-02 11:12:16 +0100669 if ($row['is_array'] === TRUE && is_array($this->_field_data[$row['field']]['postdata']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000670 {
671 // We shouldn't need this safety, but just in case there isn't an array index
672 // associated with this cycle we'll bail out
673 if ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles]))
674 {
675 continue;
676 }
Barry Mienydd671972010-10-04 16:33:58 +0200677
Derek Allard2067d1a2008-11-13 22:59:24 +0000678 $postdata = $this->_field_data[$row['field']]['postdata'][$cycles];
679 $_in_array = TRUE;
680 }
681 else
682 {
Andrey Andreev6ac51442012-06-18 13:05:17 +0300683 // If we get an array field, but it's not expected - then it is most likely
684 // somebody messing with the form on the client side, so we'll just consider
685 // it an empty field
686 $postdata = is_array($this->_field_data[$row['field']]['postdata'])
Andrey Andreev4b90a372014-03-10 10:24:24 +0200687 ? NULL
688 : $this->_field_data[$row['field']]['postdata'];
Derek Allard2067d1a2008-11-13 22:59:24 +0000689 }
690
Barry Mienydd671972010-10-04 16:33:58 +0200691 // Is the rule a callback?
Andrey Andreev4b90a372014-03-10 10:24:24 +0200692 $callback = $callable = FALSE;
693 if (is_string($rule))
Derek Allard2067d1a2008-11-13 22:59:24 +0000694 {
Andrey Andreev4b90a372014-03-10 10:24:24 +0200695 if (strpos($rule, 'callback_') === 0)
696 {
697 $rule = substr($rule, 9);
698 $callback = TRUE;
699 }
700 }
701 elseif (is_callable($rule))
702 {
703 $callable = TRUE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000704 }
Andrey Andreev60726ef2014-09-08 11:31:48 +0300705 elseif (is_array($rule) && isset($rule[0], $rule[1]) && is_callable($rule[1]))
706 {
707 // We have a "named" callable, so save the name
708 $callable = $rule[0];
709 $rule = $rule[1];
710 }
Barry Mienydd671972010-10-04 16:33:58 +0200711
Derek Allard2067d1a2008-11-13 22:59:24 +0000712 // Strip the parameter (if exists) from the rule
713 // Rules can contain a parameter: max_length[5]
714 $param = FALSE;
Andrey Andreev4b90a372014-03-10 10:24:24 +0200715 if ( ! $callable && preg_match('/(.*?)\[(.*)\]/', $rule, $match))
Derek Allard2067d1a2008-11-13 22:59:24 +0000716 {
Andrey Andreevef758bd2012-11-15 12:24:52 +0200717 $rule = $match[1];
718 $param = $match[2];
Derek Allard2067d1a2008-11-13 22:59:24 +0000719 }
Barry Mienydd671972010-10-04 16:33:58 +0200720
Derek Allard2067d1a2008-11-13 22:59:24 +0000721 // Call the function that corresponds to the rule
Andrey Andreev60726ef2014-09-08 11:31:48 +0300722 if ($callback OR $callable !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000723 {
Andrey Andreev4b90a372014-03-10 10:24:24 +0200724 if ($callback)
Barry Mienydd671972010-10-04 16:33:58 +0200725 {
Andrey Andreev4b90a372014-03-10 10:24:24 +0200726 if ( ! method_exists($this->CI, $rule))
727 {
728 log_message('debug', 'Unable to find callback validation rule: '.$rule);
729 $result = FALSE;
730 }
731 else
732 {
733 // Run the function and grab the result
734 $result = $this->CI->$rule($postdata, $param);
735 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000736 }
Andrey Andreev901573c2012-01-11 01:40:48 +0200737 else
738 {
Andrey Andreev4b90a372014-03-10 10:24:24 +0200739 $result = is_array($rule)
Andrey Andreev60726ef2014-09-08 11:31:48 +0300740 ? $rule[0]->{$rule[1]}($postdata)
741 : $rule($postdata);
742
743 // Is $callable set to a rule name?
744 if ($callable !== FALSE)
745 {
746 $rule = $callable;
747 }
Andrey Andreev901573c2012-01-11 01:40:48 +0200748 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000749
750 // Re-assign the result to the master data array
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200751 if ($_in_array === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000752 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300753 $this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000754 }
755 else
756 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300757 $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000758 }
Barry Mienydd671972010-10-04 16:33:58 +0200759
Derek Allard2067d1a2008-11-13 22:59:24 +0000760 // If the field isn't required and we just processed a callback we'll move on...
Andrey Andreev6de924c2012-01-20 13:18:18 +0200761 if ( ! in_array('required', $rules, TRUE) && $result !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000762 {
Derek Allard4e5cf1c2009-07-06 20:53:41 +0000763 continue;
Derek Allard2067d1a2008-11-13 22:59:24 +0000764 }
765 }
Andrey Andreev78f55772012-04-03 19:59:08 +0300766 elseif ( ! method_exists($this, $rule))
Barry Mienydd671972010-10-04 16:33:58 +0200767 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300768 // If our own wrapper function doesn't exist we see if a native PHP function does.
769 // Users can use any native PHP function call that has one param.
770 if (function_exists($rule))
Derek Allard2067d1a2008-11-13 22:59:24 +0000771 {
Andrey Andreev4b90a372014-03-10 10:24:24 +0200772 // Native PHP functions issue warnings if you pass them more parameters than they use
Andrey Andreev320d37c2012-04-03 20:21:39 +0300773 $result = ($param !== FALSE) ? $rule($postdata, $param) : $rule($postdata);
Barry Mienydd671972010-10-04 16:33:58 +0200774
Andrey Andreev78f55772012-04-03 19:59:08 +0300775 if ($_in_array === TRUE)
776 {
777 $this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000778 }
patwork02404a12011-04-08 15:45:46 +0200779 else
780 {
Andrey Andreevcec2ba52012-04-03 20:26:38 +0300781 $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;
patwork02404a12011-04-08 15:45:46 +0200782 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000783 }
Andrey Andreev901573c2012-01-11 01:40:48 +0200784 else
785 {
Andrey Andreevcec2ba52012-04-03 20:26:38 +0300786 log_message('debug', 'Unable to find validation rule: '.$rule);
787 $result = FALSE;
Andrey Andreev901573c2012-01-11 01:40:48 +0200788 }
Andrey Andreev78f55772012-04-03 19:59:08 +0300789 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000790 else
791 {
Derek Allard2067d1a2008-11-13 22:59:24 +0000792 $result = $this->$rule($postdata, $param);
793
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200794 if ($_in_array === TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000795 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300796 $this->_field_data[$row['field']]['postdata'][$cycles] = is_bool($result) ? $postdata : $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000797 }
798 else
799 {
Andrey Andreev78f55772012-04-03 19:59:08 +0300800 $this->_field_data[$row['field']]['postdata'] = is_bool($result) ? $postdata : $result;
Derek Allard2067d1a2008-11-13 22:59:24 +0000801 }
802 }
Barry Mienydd671972010-10-04 16:33:58 +0200803
Andrey Andreev901573c2012-01-11 01:40:48 +0200804 // Did the rule test negatively? If so, grab the error.
Derek Allard2067d1a2008-11-13 22:59:24 +0000805 if ($result === FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200806 {
Andrey Andreev60726ef2014-09-08 11:31:48 +0300807 // Callable rules might not have named error messages
Andrey Andreev57f10052014-06-07 12:22:37 +0300808 if ( ! is_string($rule))
Ahmedul Haque Abid42b40002014-01-09 01:10:25 +0600809 {
Andrey Andreev38b5eb02015-06-10 17:38:26 +0300810 $line = $this->CI->lang->line('form_validation_error_message_not_set').'(Anonymous function)';
Andrey Andreev57f10052014-06-07 12:22:37 +0300811 }
Andrey Andreev57f10052014-06-07 12:22:37 +0300812 else
813 {
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200814 $line = $this->_get_error_message($rule, $row['field']);
Derek Allard2067d1a2008-11-13 22:59:24 +0000815 }
Barry Mienydd671972010-10-04 16:33:58 +0200816
Derek Allard2067d1a2008-11-13 22:59:24 +0000817 // Is the parameter we are inserting into the error message the name
Andrey Andreev901573c2012-01-11 01:40:48 +0200818 // of another field? If so we need to grab its "field label"
Andrey Andreev8dc532d2011-12-24 17:57:54 +0200819 if (isset($this->_field_data[$param], $this->_field_data[$param]['label']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000820 {
Pascal Krietec1895832009-10-13 12:56:43 +0000821 $param = $this->_translate_fieldname($this->_field_data[$param]['label']);
Derek Allard2067d1a2008-11-13 22:59:24 +0000822 }
Barry Mienydd671972010-10-04 16:33:58 +0200823
Derek Allard2067d1a2008-11-13 22:59:24 +0000824 // Build the error message
Eric Roberts41cc0902012-01-24 00:59:44 -0600825 $message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']), $param);
Derek Allard2067d1a2008-11-13 22:59:24 +0000826
827 // Save the error message
828 $this->_field_data[$row['field']]['error'] = $message;
Barry Mienydd671972010-10-04 16:33:58 +0200829
Derek Allard2067d1a2008-11-13 22:59:24 +0000830 if ( ! isset($this->_error_array[$row['field']]))
831 {
832 $this->_error_array[$row['field']] = $message;
833 }
Barry Mienydd671972010-10-04 16:33:58 +0200834
Derek Allard2067d1a2008-11-13 22:59:24 +0000835 return;
836 }
837 }
838 }
839
840 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200841
Derek Allard2067d1a2008-11-13 22:59:24 +0000842 /**
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200843 * Get the error message for the rule
844 *
845 * @param string $rule The rule name
846 * @param string $field The field name
847 * @return string
848 */
849 protected function _get_error_message($rule, $field)
850 {
851 // check if a custom message is defined through validation config row.
852 if (isset($this->_field_data[$field]['errors'][$rule]))
853 {
854 return $this->_field_data[$field]['errors'][$rule];
855 }
856 // check if a custom message has been set using the set_message() function
857 elseif (isset($this->_error_messages[$rule]))
858 {
859 return $this->_error_messages[$rule];
860 }
Andrey Andreevb30a64a2016-02-09 23:46:25 +0200861 elseif (FALSE !== ($line = $this->CI->lang->line('form_validation_'.$rule)))
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200862 {
Andrey Andreevb30a64a2016-02-09 23:46:25 +0200863 return $line;
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200864 }
865 // DEPRECATED support for non-prefixed keys, lang file again
Andrey Andreevb30a64a2016-02-09 23:46:25 +0200866 elseif (FALSE !== ($line = $this->CI->lang->line($rule, FALSE)))
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200867 {
Andrey Andreevb30a64a2016-02-09 23:46:25 +0200868 return $line;
Andrey Andreev98c14ae2016-02-09 23:43:55 +0200869 }
870
871 return $this->CI->lang->line('form_validation_error_message_not_set').'('.$rule.')';
872 }
873
874 // --------------------------------------------------------------------
875
876 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000877 * Translate a field name
878 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000879 * @param string the field name
880 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200881 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100882 protected function _translate_fieldname($fieldname)
Derek Allard2067d1a2008-11-13 22:59:24 +0000883 {
Andrey Andreev5d8e2a62015-04-14 16:56:28 +0300884 // Do we need to translate the field name? We look for the prefix 'lang:' to determine this
885 // If we find one, but there's no translation for the string - just return it
886 if (sscanf($fieldname, 'lang:%s', $line) === 1 && FALSE === ($fieldname = $this->CI->lang->line($line, FALSE)))
Derek Allard2067d1a2008-11-13 22:59:24 +0000887 {
Andrey Andreev5d8e2a62015-04-14 16:56:28 +0300888 return $line;
Derek Allard2067d1a2008-11-13 22:59:24 +0000889 }
890
891 return $fieldname;
892 }
893
894 // --------------------------------------------------------------------
Andrey Andreevd4eec9f2012-12-14 11:07:13 +0200895
Eric Roberts41cc0902012-01-24 00:59:44 -0600896 /**
897 * Build an error message using the field and param.
898 *
899 * @param string The error message line
900 * @param string A field's human name
901 * @param mixed A rule's optional parameter
902 * @return string
903 */
904 protected function _build_error_msg($line, $field = '', $param = '')
905 {
906 // Check for %s in the string for legacy support.
Eric Roberts24a13f52012-12-12 07:09:42 -0600907 if (strpos($line, '%s') !== FALSE)
Eric Roberts41cc0902012-01-24 00:59:44 -0600908 {
909 return sprintf($line, $field, $param);
910 }
Andrew Podner4296a652012-12-17 07:51:15 -0500911
Eric Roberts41cc0902012-01-24 00:59:44 -0600912 return str_replace(array('{field}', '{param}'), array($field, $param), $line);
913 }
914
915 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200916
Derek Allard2067d1a2008-11-13 22:59:24 +0000917 /**
nisheeth-barthwala7447d22013-03-21 15:48:10 +0530918 * Checks if the rule is present within the validator
919 *
920 * Permits you to check if a rule is present within the validator
921 *
922 * @param string the field name
923 * @return bool
924 */
925 public function has_rule($field)
926 {
927 return isset($this->_field_data[$field]);
928 }
929
930 // --------------------------------------------------------------------
931
932 /**
Derek Allard2067d1a2008-11-13 22:59:24 +0000933 * Get the value from a form
934 *
935 * Permits you to repopulate a form field with the value it was submitted
936 * with, or, if that value doesn't exist, with the default
937 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000938 * @param string the field name
939 * @param string
Andrey Andreev46ac8812012-02-28 14:32:54 +0200940 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200941 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100942 public function set_value($field = '', $default = '')
Derek Allard2067d1a2008-11-13 22:59:24 +0000943 {
Andrey Andreev46ac8812012-02-28 14:32:54 +0200944 if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000945 {
946 return $default;
947 }
Barry Mienydd671972010-10-04 16:33:58 +0200948
Phil Sturgeon5c561802011-01-05 16:31:59 +0000949 // If the data is an array output them one at a time.
Greg Aker03abee32011-12-25 00:31:29 -0600950 // E.g: form_input('name[]', set_value('name[]');
Phil Sturgeon5c561802011-01-05 16:31:59 +0000951 if (is_array($this->_field_data[$field]['postdata']))
952 {
953 return array_shift($this->_field_data[$field]['postdata']);
954 }
Phil Sturgeonc3828712011-01-19 12:31:47 +0000955
Derek Allard2067d1a2008-11-13 22:59:24 +0000956 return $this->_field_data[$field]['postdata'];
957 }
Barry Mienydd671972010-10-04 16:33:58 +0200958
Derek Allard2067d1a2008-11-13 22:59:24 +0000959 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200960
Derek Allard2067d1a2008-11-13 22:59:24 +0000961 /**
962 * Set Select
963 *
964 * Enables pull-down lists to be set to the value the user
965 * selected in the event of an error
966 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000967 * @param string
968 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -0400969 * @param bool
Derek Allard2067d1a2008-11-13 22:59:24 +0000970 * @return string
Barry Mienydd671972010-10-04 16:33:58 +0200971 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +0100972 public function set_select($field = '', $value = '', $default = FALSE)
Barry Mienydd671972010-10-04 16:33:58 +0200973 {
Andrey Andreev46ac8812012-02-28 14:32:54 +0200974 if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata']))
Derek Allard2067d1a2008-11-13 22:59:24 +0000975 {
Andrey Andreev6de924c2012-01-20 13:18:18 +0200976 return ($default === TRUE && count($this->_field_data) === 0) ? ' selected="selected"' : '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000977 }
Barry Mienydd671972010-10-04 16:33:58 +0200978
Derek Allard2067d1a2008-11-13 22:59:24 +0000979 $field = $this->_field_data[$field]['postdata'];
Andrey Andreeva587a932013-10-23 19:57:46 +0300980 $value = (string) $value;
Derek Allard2067d1a2008-11-13 22:59:24 +0000981 if (is_array($field))
982 {
Andrey Andreeva587a932013-10-23 19:57:46 +0300983 // Note: in_array('', array(0)) returns TRUE, do not use it
984 foreach ($field as &$v)
Derek Allard2067d1a2008-11-13 22:59:24 +0000985 {
Andrey Andreeva587a932013-10-23 19:57:46 +0300986 if ($value === $v)
987 {
988 return ' selected="selected"';
989 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000990 }
Andrey Andreeva587a932013-10-23 19:57:46 +0300991
992 return '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000993 }
Alex Bilbied261b1e2012-06-02 11:12:16 +0100994 elseif (($field === '' OR $value === '') OR ($field !== $value))
Derek Allard2067d1a2008-11-13 22:59:24 +0000995 {
Andrey Andreev901573c2012-01-11 01:40:48 +0200996 return '';
Derek Allard2067d1a2008-11-13 22:59:24 +0000997 }
Barry Mienydd671972010-10-04 16:33:58 +0200998
Derek Allard2067d1a2008-11-13 22:59:24 +0000999 return ' selected="selected"';
1000 }
Barry Mienydd671972010-10-04 16:33:58 +02001001
Derek Allard2067d1a2008-11-13 22:59:24 +00001002 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001003
Derek Allard2067d1a2008-11-13 22:59:24 +00001004 /**
1005 * Set Radio
1006 *
1007 * Enables radio buttons to be set to the value the user
1008 * selected in the event of an error
1009 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001010 * @param string
1011 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -04001012 * @param bool
Derek Allard2067d1a2008-11-13 22:59:24 +00001013 * @return string
Barry Mienydd671972010-10-04 16:33:58 +02001014 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001015 public function set_radio($field = '', $value = '', $default = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +00001016 {
Andrey Andreev46ac8812012-02-28 14:32:54 +02001017 if ( ! isset($this->_field_data[$field], $this->_field_data[$field]['postdata']))
Derek Allard2067d1a2008-11-13 22:59:24 +00001018 {
Andrey Andreev6de924c2012-01-20 13:18:18 +02001019 return ($default === TRUE && count($this->_field_data) === 0) ? ' checked="checked"' : '';
Derek Allard2067d1a2008-11-13 22:59:24 +00001020 }
Barry Mienydd671972010-10-04 16:33:58 +02001021
Derek Allard2067d1a2008-11-13 22:59:24 +00001022 $field = $this->_field_data[$field]['postdata'];
Andrey Andreeva587a932013-10-23 19:57:46 +03001023 $value = (string) $value;
Derek Allard2067d1a2008-11-13 22:59:24 +00001024 if (is_array($field))
1025 {
Andrey Andreeva587a932013-10-23 19:57:46 +03001026 // Note: in_array('', array(0)) returns TRUE, do not use it
1027 foreach ($field as &$v)
Derek Allard2067d1a2008-11-13 22:59:24 +00001028 {
Andrey Andreeva587a932013-10-23 19:57:46 +03001029 if ($value === $v)
1030 {
1031 return ' checked="checked"';
1032 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001033 }
Andrey Andreeva587a932013-10-23 19:57:46 +03001034
1035 return '';
Derek Allard2067d1a2008-11-13 22:59:24 +00001036 }
Alex Bilbied261b1e2012-06-02 11:12:16 +01001037 elseif (($field === '' OR $value === '') OR ($field !== $value))
Derek Allard2067d1a2008-11-13 22:59:24 +00001038 {
Andrey Andreev901573c2012-01-11 01:40:48 +02001039 return '';
Derek Allard2067d1a2008-11-13 22:59:24 +00001040 }
Barry Mienydd671972010-10-04 16:33:58 +02001041
Derek Allard2067d1a2008-11-13 22:59:24 +00001042 return ' checked="checked"';
1043 }
Barry Mienydd671972010-10-04 16:33:58 +02001044
Derek Allard2067d1a2008-11-13 22:59:24 +00001045 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001046
Derek Allard2067d1a2008-11-13 22:59:24 +00001047 /**
1048 * Set Checkbox
1049 *
1050 * Enables checkboxes to be set to the value the user
1051 * selected in the event of an error
1052 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001053 * @param string
1054 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -04001055 * @param bool
Derek Allard2067d1a2008-11-13 22:59:24 +00001056 * @return string
Barry Mienydd671972010-10-04 16:33:58 +02001057 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001058 public function set_checkbox($field = '', $value = '', $default = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +00001059 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +02001060 // Logic is exactly the same as for radio fields
1061 return $this->set_radio($field, $value, $default);
Derek Allard2067d1a2008-11-13 22:59:24 +00001062 }
Barry Mienydd671972010-10-04 16:33:58 +02001063
Derek Allard2067d1a2008-11-13 22:59:24 +00001064 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001065
Derek Allard2067d1a2008-11-13 22:59:24 +00001066 /**
1067 * Required
1068 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001069 * @param string
1070 * @return bool
1071 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001072 public function required($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001073 {
Andrey Andreev78f55772012-04-03 19:59:08 +03001074 return is_array($str) ? (bool) count($str) : (trim($str) !== '');
Derek Allard2067d1a2008-11-13 22:59:24 +00001075 }
Barry Mienydd671972010-10-04 16:33:58 +02001076
Derek Allard2067d1a2008-11-13 22:59:24 +00001077 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001078
Derek Allard2067d1a2008-11-13 22:59:24 +00001079 /**
Dan Horrigan2280e8e2010-12-15 10:16:38 -05001080 * Performs a Regular Expression match test.
1081 *
Dan Horrigan2280e8e2010-12-15 10:16:38 -05001082 * @param string
Andrey Andreev78f55772012-04-03 19:59:08 +03001083 * @param string regex
Dan Horrigan2280e8e2010-12-15 10:16:38 -05001084 * @return bool
1085 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001086 public function regex_match($str, $regex)
Dan Horrigan2280e8e2010-12-15 10:16:38 -05001087 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +02001088 return (bool) preg_match($regex, $str);
Dan Horrigan2280e8e2010-12-15 10:16:38 -05001089 }
1090
1091 // --------------------------------------------------------------------
1092
1093 /**
Derek Allard2067d1a2008-11-13 22:59:24 +00001094 * Match one field to another
1095 *
Andrey Andreeva779b2c2012-10-26 16:25:47 +03001096 * @param string $str string to compare against
1097 * @param string $field
Derek Allard2067d1a2008-11-13 22:59:24 +00001098 * @return bool
1099 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001100 public function matches($str, $field)
Derek Allard2067d1a2008-11-13 22:59:24 +00001101 {
Andrey Andreeva779b2c2012-10-26 16:25:47 +03001102 return isset($this->_field_data[$field], $this->_field_data[$field]['postdata'])
1103 ? ($str === $this->_field_data[$field]['postdata'])
1104 : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +00001105 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001106
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001107 // --------------------------------------------------------------------
1108
1109 /**
Raul Baldner Juniorf38564d2012-10-11 11:32:23 -03001110 * Differs from another field
1111 *
1112 * @param string
1113 * @param string field
1114 * @return bool
1115 */
1116 public function differs($str, $field)
1117 {
1118 return ! (isset($this->_field_data[$field]) && $this->_field_data[$field]['postdata'] === $str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001119 }
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001120
1121 // --------------------------------------------------------------------
1122
1123 /**
Andrey Andreevd09d6502012-01-03 06:38:33 +02001124 * Is Unique
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001125 *
Andrey Andreevd09d6502012-01-03 06:38:33 +02001126 * Check if the input value doesn't already exist
1127 * in the specified database field.
1128 *
Andrey Andreev9a0e0c72014-04-09 15:10:27 +03001129 * @param string $str
1130 * @param string $field
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001131 * @return bool
1132 */
1133 public function is_unique($str, $field)
1134 {
Andrey Andreev7a7ad782012-11-12 17:21:01 +02001135 sscanf($field, '%[^.].%[^.]', $table, $field);
Andrey Andreev9a0e0c72014-04-09 15:10:27 +03001136 return isset($this->CI->db)
1137 ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
1138 : FALSE;
Greg Aker03abee32011-12-25 00:31:29 -06001139 }
Barry Mienydd671972010-10-04 16:33:58 +02001140
Derek Allard2067d1a2008-11-13 22:59:24 +00001141 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001142
Derek Allard2067d1a2008-11-13 22:59:24 +00001143 /**
1144 * Minimum Length
1145 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001146 * @param string
Michiel Vugteveena8221ad2012-06-14 23:26:34 +02001147 * @param string
Derek Allard2067d1a2008-11-13 22:59:24 +00001148 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001149 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001150 public function min_length($str, $val)
Derek Allard2067d1a2008-11-13 22:59:24 +00001151 {
Michiel Vugteveenceaf8872012-06-15 11:56:24 +02001152 if ( ! is_numeric($val))
Derek Allard2067d1a2008-11-13 22:59:24 +00001153 {
1154 return FALSE;
1155 }
1156
bjjay8d6c8fe2015-03-09 13:46:06 +08001157 return ($val <= mb_strlen($str));
Derek Allard2067d1a2008-11-13 22:59:24 +00001158 }
Barry Mienydd671972010-10-04 16:33:58 +02001159
Derek Allard2067d1a2008-11-13 22:59:24 +00001160 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001161
Derek Allard2067d1a2008-11-13 22:59:24 +00001162 /**
1163 * Max Length
1164 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001165 * @param string
Michiel Vugteveena8221ad2012-06-14 23:26:34 +02001166 * @param string
Derek Allard2067d1a2008-11-13 22:59:24 +00001167 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001168 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001169 public function max_length($str, $val)
Derek Allard2067d1a2008-11-13 22:59:24 +00001170 {
Michiel Vugteveenceaf8872012-06-15 11:56:24 +02001171 if ( ! is_numeric($val))
Derek Allard2067d1a2008-11-13 22:59:24 +00001172 {
1173 return FALSE;
1174 }
1175
bjjay8d6c8fe2015-03-09 13:46:06 +08001176 return ($val >= mb_strlen($str));
Derek Allard2067d1a2008-11-13 22:59:24 +00001177 }
Barry Mienydd671972010-10-04 16:33:58 +02001178
Derek Allard2067d1a2008-11-13 22:59:24 +00001179 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001180
Derek Allard2067d1a2008-11-13 22:59:24 +00001181 /**
1182 * Exact Length
1183 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001184 * @param string
Michiel Vugteveeneccde132012-06-14 23:22:26 +02001185 * @param string
Derek Allard2067d1a2008-11-13 22:59:24 +00001186 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001187 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001188 public function exact_length($str, $val)
Derek Allard2067d1a2008-11-13 22:59:24 +00001189 {
Michiel Vugteveenceaf8872012-06-15 11:56:24 +02001190 if ( ! is_numeric($val))
Derek Allard2067d1a2008-11-13 22:59:24 +00001191 {
1192 return FALSE;
1193 }
1194
bjjay8d6c8fe2015-03-09 13:46:06 +08001195 return (mb_strlen($str) === (int) $val);
Derek Allard2067d1a2008-11-13 22:59:24 +00001196 }
Barry Mienydd671972010-10-04 16:33:58 +02001197
Derek Allard2067d1a2008-11-13 22:59:24 +00001198 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001199
Derek Allard2067d1a2008-11-13 22:59:24 +00001200 /**
Andrey Andreevdaaca882012-11-26 22:16:12 +02001201 * Valid URL
1202 *
1203 * @param string $str
1204 * @return bool
1205 */
1206 public function valid_url($str)
1207 {
1208 if (empty($str))
1209 {
1210 return FALSE;
1211 }
1212 elseif (preg_match('/^(?:([^:]*)\:)?\/\/(.+)$/', $str, $matches))
1213 {
1214 if (empty($matches[2]))
1215 {
1216 return FALSE;
1217 }
1218 elseif ( ! in_array($matches[1], array('http', 'https'), TRUE))
1219 {
1220 return FALSE;
1221 }
1222
1223 $str = $matches[2];
1224 }
1225
Andrey Andreev391d3392016-01-30 22:43:41 +02001226 // PHP 7 accepts IPv6 addresses within square brackets as hostnames,
1227 // but it appears that the PR that came in with https://bugs.php.net/bug.php?id=68039
1228 // was never merged into a PHP 5 branch ... https://3v4l.org/8PsSN
1229 if (preg_match('/^\[([^\]]+)\]/', $str, $matches) && ! is_php('7') && filter_var($matches[1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE)
1230 {
1231 $str = 'ipv6.host'.substr($str, strlen($matches[1]) + 2);
1232 }
1233
Andrey Andreevdaaca882012-11-26 22:16:12 +02001234 $str = 'http://'.$str;
1235
1236 // There's a bug affecting PHP 5.2.13, 5.3.2 that considers the
1237 // underscore to be a valid hostname character instead of a dash.
1238 // Reference: https://bugs.php.net/bug.php?id=51192
Andrey Andreev9a0e0c72014-04-09 15:10:27 +03001239 if (version_compare(PHP_VERSION, '5.2.13', '==') OR version_compare(PHP_VERSION, '5.3.2', '=='))
Andrey Andreevdaaca882012-11-26 22:16:12 +02001240 {
1241 sscanf($str, 'http://%[^/]', $host);
1242 $str = substr_replace($str, strtr($host, array('_' => '-', '-' => '_')), 7, strlen($host));
1243 }
1244
1245 return (filter_var($str, FILTER_VALIDATE_URL) !== FALSE);
Derek Allard2067d1a2008-11-13 22:59:24 +00001246 }
1247
1248 // --------------------------------------------------------------------
1249
1250 /**
1251 * Valid Email
1252 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001253 * @param string
1254 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001255 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001256 public function valid_email($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001257 {
Andrey Andreevf9201ae2014-06-01 12:57:30 +03001258 if (function_exists('idn_to_ascii') && $atpos = strpos($str, '@'))
Andrey Andreev95496662014-06-01 00:00:13 +03001259 {
Andrey Andreevf9201ae2014-06-01 12:57:30 +03001260 $str = substr($str, 0, ++$atpos).idn_to_ascii(substr($str, $atpos));
Andrey Andreev95496662014-06-01 00:00:13 +03001261 }
1262
Andrey Andreev580388b2012-06-27 15:43:46 +03001263 return (bool) filter_var($str, FILTER_VALIDATE_EMAIL);
Derek Allard2067d1a2008-11-13 22:59:24 +00001264 }
1265
1266 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001267
Derek Allard2067d1a2008-11-13 22:59:24 +00001268 /**
1269 * Valid Emails
1270 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001271 * @param string
1272 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001273 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001274 public function valid_emails($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001275 {
1276 if (strpos($str, ',') === FALSE)
1277 {
1278 return $this->valid_email(trim($str));
1279 }
Barry Mienydd671972010-10-04 16:33:58 +02001280
Pascal Kriete14287f32011-02-14 13:39:34 -05001281 foreach (explode(',', $str) as $email)
Derek Allard2067d1a2008-11-13 22:59:24 +00001282 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +02001283 if (trim($email) !== '' && $this->valid_email(trim($email)) === FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +00001284 {
1285 return FALSE;
1286 }
1287 }
Barry Mienydd671972010-10-04 16:33:58 +02001288
Derek Allard2067d1a2008-11-13 22:59:24 +00001289 return TRUE;
1290 }
1291
1292 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001293
Derek Allard2067d1a2008-11-13 22:59:24 +00001294 /**
1295 * Validate IP Address
1296 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001297 * @param string
Andrey Andreev5a257182012-06-10 06:18:14 +03001298 * @param string 'ipv4' or 'ipv6' to validate a specific IP format
Bo-Yi Wu013c8952011-09-12 15:03:44 +08001299 * @return bool
Derek Allard2067d1a2008-11-13 22:59:24 +00001300 */
Andrey Andreev5a257182012-06-10 06:18:14 +03001301 public function valid_ip($ip, $which = '')
Derek Allard2067d1a2008-11-13 22:59:24 +00001302 {
Andrey Andreev5a257182012-06-10 06:18:14 +03001303 return $this->CI->input->valid_ip($ip, $which);
Derek Allard2067d1a2008-11-13 22:59:24 +00001304 }
1305
1306 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001307
Derek Allard2067d1a2008-11-13 22:59:24 +00001308 /**
1309 * Alpha
1310 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001311 * @param string
1312 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001313 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001314 public function alpha($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001315 {
Andrey Andreevacb962e2012-06-27 12:04:24 +03001316 return ctype_alpha($str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001317 }
Barry Mienydd671972010-10-04 16:33:58 +02001318
Derek Allard2067d1a2008-11-13 22:59:24 +00001319 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001320
Derek Allard2067d1a2008-11-13 22:59:24 +00001321 /**
1322 * Alpha-numeric
1323 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001324 * @param string
1325 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001326 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001327 public function alpha_numeric($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001328 {
Andrey Andreevacb962e2012-06-27 12:04:24 +03001329 return ctype_alnum((string) $str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001330 }
Barry Mienydd671972010-10-04 16:33:58 +02001331
Derek Allard2067d1a2008-11-13 22:59:24 +00001332 // --------------------------------------------------------------------
Sajan Parikh2d1608a2013-02-02 08:00:39 -06001333
1334 /**
1335 * Alpha-numeric w/ spaces
1336 *
1337 * @param string
1338 * @return bool
1339 */
1340 public function alpha_numeric_spaces($str)
1341 {
Sajan Parikhdf3bfed2013-02-04 12:25:49 -06001342 return (bool) preg_match('/^[A-Z0-9 ]+$/i', $str);
Sajan Parikh2d1608a2013-02-02 08:00:39 -06001343 }
1344
1345 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001346
Derek Allard2067d1a2008-11-13 22:59:24 +00001347 /**
1348 * Alpha-numeric with underscores and dashes
1349 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001350 * @param string
1351 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001352 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001353 public function alpha_dash($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001354 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +02001355 return (bool) preg_match('/^[a-z0-9_-]+$/i', $str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001356 }
Barry Mienydd671972010-10-04 16:33:58 +02001357
Derek Allard2067d1a2008-11-13 22:59:24 +00001358 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001359
Derek Allard2067d1a2008-11-13 22:59:24 +00001360 /**
1361 * Numeric
1362 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001363 * @param string
1364 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001365 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001366 public function numeric($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001367 {
Andrey Andreev8dc532d2011-12-24 17:57:54 +02001368 return (bool) preg_match('/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001369
1370 }
1371
1372 // --------------------------------------------------------------------
1373
Barry Mienydd671972010-10-04 16:33:58 +02001374 /**
Derek Allard2067d1a2008-11-13 22:59:24 +00001375 * Integer
1376 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001377 * @param string
1378 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +02001379 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001380 public function integer($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001381 {
Phil Sturgeonef112c02011-02-07 13:01:47 +00001382 return (bool) preg_match('/^[\-+]?[0-9]+$/', $str);
1383 }
1384
1385 // --------------------------------------------------------------------
1386
1387 /**
1388 * Decimal number
1389 *
Phil Sturgeonef112c02011-02-07 13:01:47 +00001390 * @param string
1391 * @return bool
1392 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001393 public function decimal($str)
Phil Sturgeonef112c02011-02-07 13:01:47 +00001394 {
1395 return (bool) preg_match('/^[\-+]?[0-9]+\.[0-9]+$/', $str);
1396 }
1397
1398 // --------------------------------------------------------------------
1399
1400 /**
Andrey Andreevc68905a2012-02-02 21:41:54 +02001401 * Greater than
Phil Sturgeonef112c02011-02-07 13:01:47 +00001402 *
Phil Sturgeonef112c02011-02-07 13:01:47 +00001403 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -04001404 * @param int
Phil Sturgeonef112c02011-02-07 13:01:47 +00001405 * @return bool
1406 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001407 public function greater_than($str, $min)
Phil Sturgeonef112c02011-02-07 13:01:47 +00001408 {
Andrey Andreev78f55772012-04-03 19:59:08 +03001409 return is_numeric($str) ? ($str > $min) : FALSE;
Phil Sturgeonef112c02011-02-07 13:01:47 +00001410 }
1411
1412 // --------------------------------------------------------------------
1413
1414 /**
Nick Busey98c347d2012-02-02 11:07:03 -07001415 * Equal to or Greater than
1416 *
Nick Busey98c347d2012-02-02 11:07:03 -07001417 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -04001418 * @param int
Nick Busey98c347d2012-02-02 11:07:03 -07001419 * @return bool
1420 */
Andrey Andreev3b2c5082012-03-07 22:49:24 +02001421 public function greater_than_equal_to($str, $min)
Nick Busey98c347d2012-02-02 11:07:03 -07001422 {
Andrey Andreev78f55772012-04-03 19:59:08 +03001423 return is_numeric($str) ? ($str >= $min) : FALSE;
Phil Sturgeonef112c02011-02-07 13:01:47 +00001424 }
1425
1426 // --------------------------------------------------------------------
1427
1428 /**
1429 * Less than
1430 *
Phil Sturgeonef112c02011-02-07 13:01:47 +00001431 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -04001432 * @param int
Phil Sturgeonef112c02011-02-07 13:01:47 +00001433 * @return bool
1434 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001435 public function less_than($str, $max)
Phil Sturgeonef112c02011-02-07 13:01:47 +00001436 {
Andrey Andreev78f55772012-04-03 19:59:08 +03001437 return is_numeric($str) ? ($str < $max) : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +00001438 }
Derek Allard2067d1a2008-11-13 22:59:24 +00001439
1440 // --------------------------------------------------------------------
1441
Barry Mienydd671972010-10-04 16:33:58 +02001442 /**
Nick Busey98c347d2012-02-02 11:07:03 -07001443 * Equal to or Less than
1444 *
Nick Busey98c347d2012-02-02 11:07:03 -07001445 * @param string
Timothy Warren0688ac92012-04-20 10:25:04 -04001446 * @param int
Nick Busey98c347d2012-02-02 11:07:03 -07001447 * @return bool
1448 */
Andrey Andreev3b2c5082012-03-07 22:49:24 +02001449 public function less_than_equal_to($str, $max)
Nick Busey98c347d2012-02-02 11:07:03 -07001450 {
Andrey Andreev78f55772012-04-03 19:59:08 +03001451 return is_numeric($str) ? ($str <= $max) : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +00001452 }
1453
1454 // --------------------------------------------------------------------
1455
Barry Mienydd671972010-10-04 16:33:58 +02001456 /**
Lance Vincenteca885d2015-01-28 17:43:23 +08001457 * Value should be within an array of values
1458 *
1459 * @param string
Andrey Andreev5b662e42015-01-29 00:13:54 +02001460 * @param string
Lance Vincenteca885d2015-01-28 17:43:23 +08001461 * @return bool
1462 */
Lance Vincent49f483d2015-01-28 22:46:19 +08001463 public function in_list($value, $list)
Lance Vincenteca885d2015-01-28 17:43:23 +08001464 {
Lance Vincent0b0117c2015-01-28 20:31:42 +08001465 return in_array($value, explode(',', $list), TRUE);
Lance Vincenteca885d2015-01-28 17:43:23 +08001466 }
1467
1468 // --------------------------------------------------------------------
1469
1470 /**
Derek Jones37f4b9c2011-07-01 17:56:50 -05001471 * Is a Natural number (0,1,2,3, etc.)
Barry Mienydd671972010-10-04 16:33:58 +02001472 *
Barry Mienydd671972010-10-04 16:33:58 +02001473 * @param string
1474 * @return bool
1475 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001476 public function is_natural($str)
Barry Mienydd671972010-10-04 16:33:58 +02001477 {
Andrey Andreevacb962e2012-06-27 12:04:24 +03001478 return ctype_digit((string) $str);
Barry Mienydd671972010-10-04 16:33:58 +02001479 }
1480
1481 // --------------------------------------------------------------------
1482
1483 /**
Derek Jones37f4b9c2011-07-01 17:56:50 -05001484 * Is a Natural number, but not a zero (1,2,3, etc.)
Barry Mienydd671972010-10-04 16:33:58 +02001485 *
Barry Mienydd671972010-10-04 16:33:58 +02001486 * @param string
1487 * @return bool
1488 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001489 public function is_natural_no_zero($str)
Barry Mienydd671972010-10-04 16:33:58 +02001490 {
Andrey Andreevacb962e2012-06-27 12:04:24 +03001491 return ($str != 0 && ctype_digit((string) $str));
Barry Mienydd671972010-10-04 16:33:58 +02001492 }
1493
Derek Allard2067d1a2008-11-13 22:59:24 +00001494 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001495
Derek Allard2067d1a2008-11-13 22:59:24 +00001496 /**
1497 * Valid Base64
1498 *
1499 * Tests a string for characters outside of the Base64 alphabet
1500 * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045
1501 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001502 * @param string
1503 * @return bool
1504 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001505 public function valid_base64($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001506 {
Andrey Andreevcd9797a2013-06-28 14:03:48 +03001507 return (base64_encode(base64_decode($str)) === $str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001508 }
Barry Mienydd671972010-10-04 16:33:58 +02001509
Derek Allard2067d1a2008-11-13 22:59:24 +00001510 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001511
Derek Allard2067d1a2008-11-13 22:59:24 +00001512 /**
1513 * Prep data for form
1514 *
1515 * This function allows HTML to be safely shown in a form.
1516 * Special characters are converted.
1517 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001518 * @param string
1519 * @return string
1520 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001521 public function prep_for_form($data = '')
Derek Allard2067d1a2008-11-13 22:59:24 +00001522 {
Andrey Andreev7c4d1062012-11-01 15:14:34 +02001523 if ($this->_safe_form_data === FALSE OR empty($data))
1524 {
1525 return $data;
1526 }
1527
Derek Allard2067d1a2008-11-13 22:59:24 +00001528 if (is_array($data))
1529 {
1530 foreach ($data as $key => $val)
1531 {
1532 $data[$key] = $this->prep_for_form($val);
1533 }
Barry Mienydd671972010-10-04 16:33:58 +02001534
Derek Allard2067d1a2008-11-13 22:59:24 +00001535 return $data;
1536 }
Barry Mienydd671972010-10-04 16:33:58 +02001537
Andrey Andreev901573c2012-01-11 01:40:48 +02001538 return str_replace(array("'", '"', '<', '>'), array('&#39;', '&quot;', '&lt;', '&gt;'), stripslashes($data));
Derek Allard2067d1a2008-11-13 22:59:24 +00001539 }
Barry Mienydd671972010-10-04 16:33:58 +02001540
Derek Allard2067d1a2008-11-13 22:59:24 +00001541 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001542
Derek Allard2067d1a2008-11-13 22:59:24 +00001543 /**
1544 * Prep URL
1545 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001546 * @param string
1547 * @return string
Barry Mienydd671972010-10-04 16:33:58 +02001548 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001549 public function prep_url($str = '')
Derek Allard2067d1a2008-11-13 22:59:24 +00001550 {
Alex Bilbied261b1e2012-06-02 11:12:16 +01001551 if ($str === 'http://' OR $str === '')
Derek Allard2067d1a2008-11-13 22:59:24 +00001552 {
1553 return '';
1554 }
Barry Mienydd671972010-10-04 16:33:58 +02001555
Andrey Andreev901573c2012-01-11 01:40:48 +02001556 if (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0)
Derek Allard2067d1a2008-11-13 22:59:24 +00001557 {
Andrey Andreev901573c2012-01-11 01:40:48 +02001558 return 'http://'.$str;
Derek Allard2067d1a2008-11-13 22:59:24 +00001559 }
Barry Mienydd671972010-10-04 16:33:58 +02001560
Derek Allard2067d1a2008-11-13 22:59:24 +00001561 return $str;
1562 }
Barry Mienydd671972010-10-04 16:33:58 +02001563
Derek Allard2067d1a2008-11-13 22:59:24 +00001564 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001565
Derek Allard2067d1a2008-11-13 22:59:24 +00001566 /**
1567 * Strip Image Tags
1568 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001569 * @param string
1570 * @return string
Barry Mienydd671972010-10-04 16:33:58 +02001571 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001572 public function strip_image_tags($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001573 {
Andrey Andreev1a24a9d2012-06-27 00:52:47 +03001574 return $this->CI->security->strip_image_tags($str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001575 }
Barry Mienydd671972010-10-04 16:33:58 +02001576
Derek Allard2067d1a2008-11-13 22:59:24 +00001577 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +02001578
Derek Allard2067d1a2008-11-13 22:59:24 +00001579 /**
Derek Allard2067d1a2008-11-13 22:59:24 +00001580 * Convert PHP tags to entities
1581 *
Derek Allard2067d1a2008-11-13 22:59:24 +00001582 * @param string
1583 * @return string
Barry Mienydd671972010-10-04 16:33:58 +02001584 */
Phil Sturgeon3837ae72011-05-09 21:12:26 +01001585 public function encode_php_tags($str)
Derek Allard2067d1a2008-11-13 22:59:24 +00001586 {
Andrey Andreev838a9d62012-12-03 14:37:47 +02001587 return str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $str);
Derek Allard2067d1a2008-11-13 22:59:24 +00001588 }
1589
JonoB099c4782012-03-04 14:37:30 +00001590 // --------------------------------------------------------------------
Andrey Andreevc8da4fe2012-03-04 19:20:33 +02001591
1592 /**
1593 * Reset validation vars
1594 *
1595 * Prevents subsequent validation routines from being affected by the
JonoB099c4782012-03-04 14:37:30 +00001596 * results of any previous validation routine due to the CI singleton.
Andrey Andreevc8da4fe2012-03-04 19:20:33 +02001597 *
Andrey Andreeva89c1da2014-02-08 19:03:35 +02001598 * @return CI_Form_validation
Andrey Andreevc8da4fe2012-03-04 19:20:33 +02001599 */
JonoB883f80f2012-03-05 09:51:27 +00001600 public function reset_validation()
Andrey Andreevc8da4fe2012-03-04 19:20:33 +02001601 {
JonoB099c4782012-03-04 14:37:30 +00001602 $this->_field_data = array();
JonoB099c4782012-03-04 14:37:30 +00001603 $this->_error_array = array();
1604 $this->_error_messages = array();
1605 $this->error_string = '';
Andrey Andreeva89c1da2014-02-08 19:03:35 +02001606 return $this;
Andrey Andreevc8da4fe2012-03-04 19:20:33 +02001607 }
1608
Derek Allard2067d1a2008-11-13 22:59:24 +00001609}