2012-05-15 63 views
0

我想使用一個函數來驗證具有參數的日期......但我有一個配置數組中的所有驗證。使用Codeigniter進行參數回調驗證並使用數組設置規則?

config = array(
'page1/send' => array(
    array(
      'field' => 'name', 
      'label' => 'lang:name', 
      'rules' => 'required' 
     ) 
),  

'page2/send' => array(
          array(
            'field' => 'name', 
            'label' => 'lang:name', 
            'rules' => 'required' 
          ), 
          array(
            'field' => 'date1', 
            'label' => 'lang:date', 
            'rules' => 'required|' 
          ) 
          array(
            'field' => 'date2', 
            'label' => 'lang:date', 
            'rules' => 'required|callback_date_compare' 
          ) 

         ), 

我想傳遞一個額外的參數到「callback_date_compare」在這種情況下,其他字段(date1)。

沒有在數組中制定規則我能做到這樣,如果「$日期1」是後[「日期1」]的值,並將其完美地工作:

$this->form_validation->set_rules('date2', 'lang:date', 'required|callback_date_compare[' . $date1 . ']'); 

我需要做的它的內部數組,因爲我有它裏面的所有驗證,我試圖做到這一點的$配置陣列內以同樣的方式,但它didn't工作,是這樣的:

        array(
             'field' => 'date2', 
             'label' => 'lang:date', 
             'rules' => 'required|callback_date_compare[date1]' 
           ) 

任何幫助表示讚賞。

回答

3

在你的配置陣列

array(
     'field' => 'date2', 
     'label' => 'lang:date', 
     'rules' => 'required|callback_date_compare[date1]' 
    ) 
在你的日期

比較回調

function date_compare($value, $field_name) 
{ 
    // Get the value in the field 
    $field = $_POST[$field_name]; 

    if ($value != $this->input->post($field)) 
    { 
      $this->form_validation->set_message('date_compare', 'Dates are different'); 
      return FALSE; 
    } 
    else 
    { 
     return TRUE; 
    } 

} 
+0

完美,非常感謝勞倫斯! – Alex

0

創建一個函數調用date_compare:

public function date_compare($date2) 
{ 

if ($date2 != $this->input->post("date1")) 
{ 
$this->form_validation->set_message('date_compare', 'Dates are different'); 
return FALSE; 
} 
else 
{ 
return TRUE; 
} 

} 

配置:

'page2/send' => array(
          array(
            'field' => 'name', 
            'label' => 'lang:name', 
            'rules' => 'required' 
          ), 
          array(
            'field' => 'date1', 
            'label' => 'lang:date', 
            'rules' => 'required|' 
          ) 
          array(
            'field' => 'date2', 
            'label' => 'lang:date', 
            'rules' => 'required|callback_date_compare' 
          ) 

         ), 
+0

感謝亞當,問題是我想用其他形式的功能,我希望它是「通用的」。如果我這樣做,如你所說,我不能改變輸入的名字.. date1,date2等。我有的功能是比較兩個日期(開始和結束),並控制「開始」日期不大於比「結束」,但我在其他地方使用它 – Alex

1

由於您的配置是全球性的,因此將該功能設置爲全局也是一個好主意。

創建MY_Form_validation.phplibraries/

<?php 

class MY_Form_validation extends CI_Form_validation { 

    function date_compare($str_start, $str_key) { 

     $bool = ($str_start == $this->input->post($str_key)); 
     if (! $bool) 
      $this->form_validation->set_message('date_compare', 'Dates are different'); 

     return $bool; 

    } 

} 

然後設置規則date_compare[date1]

+0

其實我在My_controller中有函數date_compare從任何控制器使用它。無論如何羅賓。 – Alex

+0

嗯我想知道發生了什麼,如果你使用'site.com/date_compare'呢? –

+0

使用site.com/date_compare返回404 Pagen Not Found「並且使用site.com/date_compare(param1,param2)返回」遇到錯誤您提交的URI已經禁止使用字符。「 – Alex