Как выполнить проверку нескольких полей?

Недавно я столкнулся с такой ситуацией:

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

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

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

Если требуется более подробная информация - пожалуйста, дайте мне знать.

2 ответа

Я думаю это то что тебе нужно

// 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));

Я думаю, что это должно работать, не проверял, хотя, дайте нам знать:)

Попробуй это

    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);
   }

Источник

Другие вопросы по тегам