e.g. You are building a list of questions as a survey and have this validation.
$this->form_validation->set_rules(‘questions[]’, ’Question Text', ‘trim|required|xss_clean’);
And in your view, you have
foreach ($questions as $qn) { ... echo form_input(array('name'=>'question_text[]')); echo form_error(‘questions[]’); ... }
In this case, if one of the questions text is empty, the "required" error will be triggered. And since the validation object only have 1 error param (print_r($this->_field_data) to know what I'm talking about), this same error will be applied to all the form_error();
So this is what I did (reference to Code Igniter 2.x)
1. In system/libraries/Form_validation.php (or you can subclass it, though this method is quite long and may not be so straight forward)
Look for :
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; }
Insert this after:
if ( $row['is_array'] ) { $this->_field_data[$row['field']]['error'][$cycles] = ''; }
Then look for this:
$this->_field_data[$row['field']]['error'] = $message;
We need to comment that out and new logic to handle the error array, so replace that line with this:
//$this->_field_data[$row['field']]['error'] = $message; if ( $row['is_array'] ) { $this->_field_data[$row['field']]['error'][$cycles] = $message; } else { $this->_field_data[$row['field']]['error'] = $message; }
Step 2. create a file in /application/libraries/MY_Form_validation.php
class MY_Form_validation extends CI_Form_validation { function __construct($config = array()) { parent::__construct($config); } function error($field = '', $prefix = '', $suffix = '') { if ( ! empty($this->_field_data[$field]) && $this->_field_data[$field]['is_array']) { return ($prefix?$prefix:$this->_error_prefix) .array_shift($this->_field_data[$field]['error']) .($suffix?$suffix:$this->_error_suffix); } return parent::error($field, $prefix, $suffix); } }
Done!
I'll explain.
Step 1 turns the validation object error parameter into an array, and insert the error message only when there is a validation error. Else it creates an empty error array element.
Step 2 is to display the error message if it exists. Basically it uses the same logic of popping out the first error message (which may be a blank) like when we do a set_value('question[]);
So that's it.
May have bugs, use at your own risk.