2013-07-24 38 views
2

最近我遇到了如下情況:如何執行多個字段的驗證?

有一個表格有三個輸入。他們都有相關的數據庫屬性(值)。 現在:至少需要其中一個,但它可以是其中任何一個

什麼可能是最聰明的方式(最好遵循Kohana和/或ORM的指導方針)這樣做? 我希望這個「規則」存儲在模型中,而不是存儲在控制器中。

到目前爲止,我已經設法將自定義規則應用於所有三個字段,但是這會導致tripple錯誤消息,每個字段一個。

如果需要更多的細節 - 請讓我知道。

回答

1

我覺得這是你所需要的

// File: application/classes/helper/validation.php 
class Helper_Validation { 

    public static function one_not_empty($array, $keys) 
    { 
     if(! is_array($keys)) 
     { 
      // throw new Exception('Helper_Validation::one_not_empty expects an array'); 
      return FALSE; 
     } 

     foreach($keys as $key) 
     { 
      // Change this IF to whatever is the required value 
      if(Arr::get($array, $key) !== NULL) 
      { 
       return TRUE; 
      } 
     } 

     return FALSE; 
     } 
} 

現在,它適用於所有領域:

$keys = array('field1', 'field2', 'field3'); 

$validation = Validation::factory($array) 
     ->rule('field1', 'Helper_Validation::one_not_empty', array($keys)) 
     ->rule('field2', 'Helper_Validation::one_not_empty', array($keys)) 
     ->rule('field3', 'Helper_Validation::one_not_empty', array($keys)); 

我認爲這應該工作,沒有測試雖然讓我們知道:)

+0

看起來很有前途,並以另一種方式處理它。謝謝!我會很快嘗試你的代碼/想法,然後再次評論並批准答案。 – roomcays

1

試試這個

public function rules(){ 
     return array(
      'field1' => array(
       array('at_least', array($this, 1, array('field1', 'field2', 'field3'))), 
      ), 
      'field2' => array(
       array('at_least', array($this, 1, array('field1', 'field2', 'field3'))), 
      ), 
      'field3' => array(
       array('at_least', array($this, 1, array('field1', 'field2', 'field3'))), 
      ), 
     ); 
    } 

    public static function at_least($array, $needed = 1, $fields){ 
     $found = 0; 
     foreach ($fields as $field){ 
      if (isset($array[$field]) AND Valid::not_empty($array[$field])){ 
       $found++; 
      } 
     } 
     return ($found >= $needed); 
    } 

Source