Created
April 12, 2012 06:21
-
-
Save jbottigliero/2364955 to your computer and use it in GitHub Desktop.
(set_messages method) Add support for 'flash error messages' to CodeIgniter's built in Form Validation library.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class MY_Form_validation extends CI_Form_validation { | |
public function set_message($lang, $val = '', $name = FALSE) | |
{ | |
if($name !== FALSE){ | |
$lang = $name.'.'.$lang; | |
} | |
if ( ! is_array($lang)) | |
{ | |
$lang = array($lang => $val); | |
} | |
$this->_error_messages = array_merge($this->_error_messages, $lang); | |
return $this; | |
} | |
/** | |
* 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]) && ! isset($this->_error_messages[$row['field'].'.'.$type])) | |
{ | |
if (FALSE === ($line = $this->CI->lang->line($type))) | |
{ | |
$line = 'The field was not set'; | |
} | |
} | |
else if (! isset($this->_error_messages[$row['field'].'.'.$type])) | |
{ | |
$line = $this->_error_messages[$type]; | |
} | |
else | |
{ | |
$line = $this->_error_messages[$row['field'].'.'.$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($this->CI, $rule)) | |
{ | |
continue; | |
} | |
// Run the function and grab the result | |
$result = $this->CI->$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]) && ! isset($this->_error_messages[$row['field'].'.'.$rule])) | |
{ | |
if (FALSE === ($line = $this->CI->lang->line($rule))) | |
{ | |
$line = 'Unable to access an error message corresponding to your field name.'; | |
} | |
} | |
elseif (! isset($this->_error_messages[$row['field'].'.'.$rule])) | |
{ | |
$line = $this->_error_messages[$rule]; | |
} | |
else | |
{ | |
$line = $this->_error_messages[$row['field'].'.'.$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; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment