2011-03-04 25 views

回答

2

不修改CodeIgniter的表单验证类(CI_Form_validation),有没有办法从一个配置文件中加载验证规则和使用规则集的方法。由于表单验证码目前经营,如果没有规则已经另有规定

可以扩展表单验证类,并得到这个工作,但是,相对简单的配置文件规则只检查。创建一个名为MY_Form_validation.php文件,并把它应用/核心/目录。

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()方法定义的规则配置文件规则的优先级。