2013-07-24 4 views
2

Недавно я столкнулась с ситуацией, следующим образом:Как выполнить проверку нескольких полей?

Существует форма с три входов. Все они имеют связанные свойства базы данных (значения). Теперь: требуется хотя бы один из них, но это может быть любой из них.

Что может быть самым умным способом (желательно, следуя рекомендациям Коханы и/или ORM), чтобы сделать это? Я хочу, чтобы это «правило» хранилось в модели, а не в контроллере.

До сих пор мне удалось применить настраиваемое правило ко всем трем полям, но это приводит к тройному сообщению об ошибке, по одному для каждого поля.

Если требуется более подробная информация - сообщите мне.

ответ

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

Смежные вопросы