shox
shox

Reputation: 1160

Cant load Validation Rules from both config file and using set_rules method

Is there any way to load validation rules from both : config file and using set rules method ?

Upvotes: 1

Views: 371

Answers (1)

Eric G
Eric G

Reputation: 4058

Without modifying CodeIgniter's Form Validation class (CI_Form_validation), there is no way to load validation rules from a config file AND using the set rules method. As the form validation code currently operates, config file rules are only checked if no rules have been otherwise defined

You can extend the form validation class and get this to work, however, relatively simply. Create a file called MY_Form_validation.php and put it in the application/core/ directory.

class MY_Form_validation extends CI_Form_validation {
    // You only need to change the run() method, so we'll define a (modified) version.
    // This will override the existing run() method so that it uses rules set from
    // set_rules() AND from the config file.
    function run($group = '')
{
    if (count($_POST) == 0)
    {
        return FALSE;
    }

            // If there are any configuration rules defined, go ahead and use them
    if (count($this->_config_rules) != 0)
    {
        // Is there a validation rule for the particular URI being accessed?
        $uri = ($group == '') ? trim($this->CI->uri->ruri_string(), '/') : $group;

        if ($uri != '' AND isset($this->_config_rules[$uri]))
        {
            $this->set_rules($this->_config_rules[$uri]);
        }
        else
        {
            $this->set_rules($this->_config_rules);
        }
    }

    // Load the language file containing error messages
    $this->CI->lang->load('form_validation');

    // Cycle through the rules for each field, match the
    // corresponding $_POST item and test for errors
    foreach ($this->_field_data as $field => $row)
    {
        // Fetch the data from the corresponding $_POST array and cache it in the _field_data array.
        // Depending on whether the field name is an array or a string will determine where we get it from.

        if ($row['is_array'] == TRUE)
        {
            $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']);
        }
        else
        {
            if (isset($_POST[$field]) AND $_POST[$field] != "")
            {
                $this->_field_data[$field]['postdata'] = $_POST[$field];
            }
        }

        $this->_execute($row, explode('|', $row['rules']), $this->_field_data[$field]['postdata']);
    }

    // Did we end up with any errors?
    $total_errors = count($this->_error_array);

    if ($total_errors > 0)
    {
        $this->_safe_form_data = TRUE;
    }

    // Now we need to re-set the POST data with the new, processed data
    $this->_reset_post_array();

    // No errors, validation passes!
    if ($total_errors == 0)
    {
        return TRUE;
    }

    // Validation fails
    return FALSE;
}

Note, I haven't tested this on a CodeIgniter installation. But it should work. Also note, this will prioritize config file rules over rules defined using the set_rules() method.

Upvotes: 2

Related Questions