2016-04-28 76 views
1

我正在寫一些東西,如果您選擇某個按鈕或下拉列表,我想更改某個字段的規則。基本上,邏輯是,檢查一個按鈕或從選擇中選擇一個ID,你不需要填充地址字段。我一直在努力做form_validation內的事情,而不是在他那裏控制器我可以真正做到這樣的事情從MY_Form_validation的codeigniter中刪除規則

if(isset($_POST['checkbox'])){ 
    //check rules 
} 

所以,我已經做到了這一點:

public function check_address($str,$prefix=null){ 
    $this->set_message('check_address','Please select an address or fill out a new one'); 
    //var_dump($this->_field_data);exit; 
    $remove=array('address_line1','address_line2','address_line3','city','postcode'); 
    if($prefix!==null){ 
     foreach($remove as &$r){ 
      $r=$prefix.'_'.$r; 
     } 
    } 
    unset($r); 
    foreach($this->_field_data as $key=>$f){ 
     if(in_array($key,$remove)){ 
      unset($this->_field_data[$key]); 
     } 
    } 
} 

這種工作方式我想要它,但我認爲我已經干擾了codeiginter的Form_Validation類,因爲它會拋出一個錯誤,指出我的數組中沒有設置所需的索引。

錯誤消息

A PHP Error was encountered 
Severity: Notice 
Message: Undefined index: billing_address_line1 
Filename: libraries/Form_validation.php 
Line Number: 481 

我不是真的太知道我怎麼能達到什麼我想做的事情沒有什麼干擾笨的需求?是否有另一個數組我需要刪除,以便該鍵不排序?

我還通過刪除所需要的規則,但所需要的功能,我認爲一定是已經運行做到了這一點,現在

foreach($this->_field_data as $key=>&$f){ 
     if(in_array($key,$remove)){ 
      //unset($this->_field_data[$key]); 
      //str_replace('/required\|/','',$f['rules']); 
      //str_replace('/required/','',$f['rules']); 
      foreach($f['rules']as$r=>$val){ 
       $val=strtolower($val); 
       if($val=='required')unset($f['rules'][$r]); 
      } 
      var_dump($f); 
     } 
    } 
    unset($f); 

現在,這並不需要什麼?

規則

$this->con['validation']['checkout']=array(


     array('field'=>'address_line1','label'=>'Address line 1','rules'=>'required|min_length[3]|max_length[200]|check_basket'), 
     array('field'=>'address_line2','label'=>'Address line 2','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'address_line3','label'=>'Address line 3','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'city','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[50]'), 
     array('field'=>'postcode','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[9]|valid_postcode'), 

     array('field'=>'shipping_addressID','label'=>'Address','rules'=>'check_address[]'), 


     array('field'=>'billing_address_line1','label'=>'Billing address line 1','rules'=>'required|min_length[3]|max_length[200]'), 
     array('field'=>'billing_address_line2','label'=>'Billing address line 2','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'billing_address_line3','label'=>'Billing address line 3','rules'=>'min_length[3]|max_length[200]'), 
     array('field'=>'billing_city','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[50]'), 
     array('field'=>'billing_postcode','label'=>'Town/City','rules'=>'required|min_length[3]|max_length[9]|valid_postcode'), 
     array('field'=>'billing_address_same','label'=>'Billing Address','rules'=>'check_address[billing]'), 
     array('field'=>'billing_addressID','label'=>'Billing address','rules'=>'check_address[billing]') 
    ); 
+0

'* _addressID'字段的用途是什麼? – DFriend

+0

@Driend由於我希望能夠將地址添加到數據庫中,並在同一用戶返回時再次選擇它們以避免多次輸入相同的地址。這就是爲什麼我有'* _addressID',並且如果沒有選擇'* _addressID',那麼用戶需要填寫與該地址相關的地址字段,無論是運輸還是帳單。 – sourRaspberri

回答

0

陣,我認爲最簡單的方法是最好的。在控制器中,如果複選框被選中,則添加規則。

if(isset($_POST['checkbox'])){ 
    $this->form_validation->set_rules('billing_address_line1', 'Billing Address Line 1', 'required'); 
} 

添加了評論和問題後編輯

仍在努力爲最簡單的實現,同時使用大量字符串操作,避免foreach循環和多個規則陣列是幾乎相同。

這使得form_validation->set_rules()可以接受第三個參數中的數組(而不是管道分隔字符串)的事實。字符串最終變成了一個數組,因此從數組開始在運行時更有效率。

同樣在高效運行時的名稱中,在設置規則時使用方法鏈接。

首先創建可重複使用的「規則」數組傳遞給set_rules()

$rules_address1 = ['required', 'min_length[3]', 'max_length[200]', 'callback_check_basket']; 
$rules_address_23 = ['min_length[3]', 'max_length[200]']; 
$rules_city = ['required', 'min_length[3]', 'max_length[50]']; 
$rules_postcode = ['required', 'min_length[3]', 'max_length[9]', 'callback_valid_postcode']; 

$this->form_validation->set_message('required', 'You must provide {field}.'); 

$this->form_validation 
    ->set_rules('address_line1', 'Address line 1', $rules_address1) 
    ->set_rules('address_line2', 'Address line 2', $rules_address_23) 
    ->set_rules('address_line3', 'Address line 3', $rules_address_23) 
    ->set_rules('city', 'Town/City', $rules_city) 
    ->set_rules('postcode', 'Postal Code', $rules_postcode); 

if(!isset($_POST['checkbox'])) 
{ 
    unset($rules_address1[0]); 
    unset($rules_address_23[0]); 
    unset($rules_city[0]); 
    unset($rules_postcode[0]); 
} 

$this->form_validation 
    ->set_rules('billing_address_line1', 'Billing Address line 1', $rules_address1) 
    ->set_rules('billing_address_line2', 'Billing Address line 2', $rules_address_23) 
    ->set_rules('billing_address_line3', 'Billing Address line 3', $rules_address_23) 
    ->set_rules('billing_city', 'Town/City', $rules_city) 
    ->set_rules('billing_postcode', 'Postal Code', $rules_postcode); 

我跳過了addressID場(S),因爲我不知道它是如何使用的規則。

此外,根據CI SOP,添加了callback_以使我看起來是自定義回調方法。相應地調整。

如您所知,這一切都發生在調用$this->form_validation->run()之前的控制器中。

+0

謝謝,但我想做相反的事:p如果複選框已設置我想刪除規則。所以我不得不基本重寫規則到一個3個獨立的數組中,我不想這樣做。我正在掃描form_validation類,看看我能否找到一些東西,但我認爲,因爲這個函數在不同的函數之間調用可能不起作用? – sourRaspberri

+0

我已經添加了數組,您所談論的方法涉及在啓動'run'函數之前操作數組。所以我要麼在運行之前運行一個foreach,要麼有3個獨立的數組,以不包含我不想包含的不同錯誤。 (其實我認爲這是2噓) – sourRaspberri

+0

結帳修改答案。 – DFriend

0

從表單驗證類中檢查它。爲您想要刪除的規則調用您自己的驗證方法。 https://codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

然後在這些方法中,檢查複選框是否被選中。如果選中,則跳過所有規則,並從回調函數返回TRUE。類似這樣的:

address_line1_callback_function() { 
    CI = &get_instance(); 
    if (CI->input->post('checked')) 
     return true; 
    /// Rules for address line go here 
}