无法从配置文件和使用set_rules方法加载验证规则

时间:2011-03-04 18:31:56

标签: php codeigniter

有没有办法从配置文件和使用set rules方法加载验证规则?

1 个答案:

答案 0 :(得分:2)

如果不修改CodeIgniter的表单验证类(CI_Form_validation),则无法从配置文件和使用set rules方法加载验证规则。当表单验证代码当前运行时,仅在没有另外定义规则的情况下检查配置文件规则

您可以扩展表单验证类并使其工作,但相对简单。创建一个名为MY_Form_validation.php的文件并将其放在application / core /目录中。

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;
}

注意,我没有在CodeIgniter安装上测试过这个。但它应该工作。另请注意,这将优先使用set_rules()方法定义的规则配置文件规则。