/system/cms/libraries/MY_Form_validation.php
PHP | 278 lines | 178 code | 39 blank | 61 comment | 33 complexity | a13cc6a049574d12c73ce81e43c4b716 MD5 | raw file
Possible License(s): CC0-1.0, MIT
- <?php if (!defined('BASEPATH')) exit('No direct script access allowed.');
- class MY_Form_validation extends CI_Form_validation
- {
- function __construct($rules = array())
- {
- parent::__construct($rules);
- $this->CI->load->language('extra_validation');
- }
- /**
- * Alpha-numeric with underscores dots and dashes
- *
- * @access public
- * @param string
- * @return bool
- */
- function alpha_dot_dash($str)
- {
- return ( ! preg_match("/^([-a-z0-9_\-\.])+$/i", $str)) ? FALSE : TRUE;
- }
- /**
- * Formats an UTF-8 string and removes potential harmful characters
- *
- * @access public
- * @param string
- * @return string
- * @author Jeroen v.d. Gulik
- * @since v1.0-beta1
- * @todo Find decent regex to check utf-8 strings for harmful characters
- */
- function utf8($str)
- {
- // If they don't have mbstring enabled (suckers) then we'll have to do with what we got
- if ( ! function_exists($str))
- {
- return $str;
- }
- $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
- return htmlentities($str, ENT_QUOTES, 'UTF-8');
- }
-
- // NOTE: This was done because HMVC is not happy with $this->CI being used as a callback, instead it wants to look at CI::APP->controller
- // -- Phil
-
- /**
- * Executes the Validation routines
- *
- * @access private
- * @param array
- * @param array
- * @param mixed
- * @param integer
- * @return mixed
- */
- protected function _execute($row, $rules, $postdata = NULL, $cycles = 0)
- {
- // If the $_POST data is an array we will run a recursive call
- if (is_array($postdata))
- {
- foreach ($postdata as $key => $val)
- {
- $this->_execute($row, $rules, $val, $cycles);
- $cycles++;
- }
- return;
- }
- // --------------------------------------------------------------------
- // If the field is blank, but NOT required, no further tests are necessary
- $callback = FALSE;
- if ( ! in_array('required', $rules) AND is_null($postdata))
- {
- // Before we bail out, does the rule contain a callback?
- if (preg_match("/(callback_\w+(\[.*?\])?)/", implode(' ', $rules), $match))
- {
- $callback = TRUE;
- $rules = (array('1' => $match[1]));
- }
- else
- {
- return;
- }
- }
- // --------------------------------------------------------------------
- // Isset Test. Typically this rule will only apply to checkboxes.
- if (is_null($postdata) AND $callback == FALSE)
- {
- if (in_array('isset', $rules, TRUE) OR in_array('required', $rules))
- {
- // Set the message type
- $type = (in_array('required', $rules)) ? 'required' : 'isset';
- if ( ! isset($this->_error_messages[$type]))
- {
- if (FALSE === ($line = $this->CI->lang->line($type)))
- {
- $line = 'The field was not set';
- }
- }
- else
- {
- $line = $this->_error_messages[$type];
- }
- // Build the error message
- $message = sprintf($line, $this->_translate_fieldname($row['label']));
- // Save the error message
- $this->_field_data[$row['field']]['error'] = $message;
- if ( ! isset($this->_error_array[$row['field']]))
- {
- $this->_error_array[$row['field']] = $message;
- }
- }
- return;
- }
- // --------------------------------------------------------------------
- // Cycle through each rule and run it
- foreach ($rules As $rule)
- {
- $_in_array = FALSE;
- // We set the $postdata variable with the current data in our master array so that
- // each cycle of the loop is dealing with the processed data from the last cycle
- if ($row['is_array'] == TRUE AND is_array($this->_field_data[$row['field']]['postdata']))
- {
- // We shouldn't need this safety, but just in case there isn't an array index
- // associated with this cycle we'll bail out
- if ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles]))
- {
- continue;
- }
- $postdata = $this->_field_data[$row['field']]['postdata'][$cycles];
- $_in_array = TRUE;
- }
- else
- {
- $postdata = $this->_field_data[$row['field']]['postdata'];
- }
- // --------------------------------------------------------------------
- // Is the rule a callback?
- $callback = FALSE;
- if (substr($rule, 0, 9) == 'callback_')
- {
- $rule = substr($rule, 9);
- $callback = TRUE;
- }
- // Strip the parameter (if exists) from the rule
- // Rules can contain a parameter: max_length[5]
- $param = FALSE;
- if (preg_match("/(.*?)\[(.*)\]/", $rule, $match))
- {
- $rule = $match[1];
- $param = $match[2];
- }
- // Call the function that corresponds to the rule
- if ($callback === TRUE)
- {
- if ( ! method_exists(CI::$APP->controller, $rule))
- {
- throw new Exception('Undefined callback "$rule" in '.CI::$APP->controller);
- }
- // Run the function and grab the result
- $result = call_user_func(array(new CI::$APP->controller, $rule), $postdata, $param);
- // Re-assign the result to the master data array
- if ($_in_array == TRUE)
- {
- $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;
- }
- else
- {
- $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;
- }
- // If the field isn't required and we just processed a callback we'll move on...
- if ( ! in_array('required', $rules, TRUE) AND $result !== FALSE)
- {
- continue;
- }
- }
- else
- {
- if ( ! method_exists($this, $rule))
- {
- // If our own wrapper function doesn't exist we see if a native PHP function does.
- // Users can use any native PHP function call that has one param.
- if (function_exists($rule))
- {
- $result = $rule($postdata);
- if ($_in_array == TRUE)
- {
- $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;
- }
- else
- {
- $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;
- }
- }
- else
- {
- log_message('debug', "Unable to find validation rule: ".$rule);
- }
- continue;
- }
- $result = $this->$rule($postdata, $param);
- if ($_in_array == TRUE)
- {
- $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result;
- }
- else
- {
- $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result;
- }
- }
- // Did the rule test negatively? If so, grab the error.
- if ($result === FALSE)
- {
- if ( ! isset($this->_error_messages[$rule]))
- {
- if (FALSE === ($line = $this->CI->lang->line($rule)))
- {
- $line = 'Unable to access an error message corresponding to your field name.';
- }
- }
- else
- {
- $line = $this->_error_messages[$rule];
- }
- // Is the parameter we are inserting into the error message the name
- // of another field? If so we need to grab its "field label"
- if (isset($this->_field_data[$param]) AND isset($this->_field_data[$param]['label']))
- {
- $param = $this->_translate_fieldname($this->_field_data[$param]['label']);
- }
- // Build the error message
- $message = sprintf($line, $this->_translate_fieldname($row['label']), $param);
- // Save the error message
- $this->_field_data[$row['field']]['error'] = $message;
- if ( ! isset($this->_error_array[$row['field']]))
- {
- $this->_error_array[$row['field']] = $message;
- }
- return;
- }
- }
- }
- }
- /* End of file MY_Form_validation.php */