2014-02-03 6 views
2

Я хочу добавить в модель настраиваемое правило проверки, которое проверяет, не пусто ли хотя бы одно из двух полей. Для простоты я уменьшить валидации к этомуПользовательское правило проверки не применяется

public $validate = array(
    'first' => array(
     'oneEmpty' => array(
      'rule' => array('maxOneEmpty', 'second'), 
      'message' => 'At least one must be filled' 
     ) 
    ), 
    'second' => array(
     'oneEmpty' => array(
      'rule' => array('maxOneEmpty', 'first'), 
      'message' => 'At least one must be filled' 
     ) 
    ) 

Там в другой валидации на месте, и те не работают хорошо (ни один из тех, кто зависит от другого поля, хотя). Теперь это не подтверждается. Я даже модифицировал пользовательскую функцию до

public function maxOneEmpty($check, $notEmptyToo) { 
    return false; 
} 

не повезло. Если я пытаюсь сохранить модель (намеренно делает плохую проверку, так что на самом деле не экономить), я получаю это, когда делать $this->Model->validationErrors в контроллере

Array 
(
    [House] => Array 
     (
      [third] => Array 
       (
        [0] => Enter a valid option 
       ) 
     ) 
) 

, когда явно first и second должны быть ошибки тоже. Итак, модель проверяет, а не те поля.

Это происходит, если я не ставил никаких значений на поля first и second. Если я помещу что-нибудь в поле first, он проверяет пользовательскую функцию (давая мне ложную информацию из-за возврата). Но это мне не полезно, мне нужно проверить, имеет ли хотя бы одно из полей значение, но если оба они пустые (и когда фактическая проверка должна возвращать false), она даже не пытается проверить , Я пробовал добавить required => true к правилам, но не повезло. Не имеет смысла добавлять allowEmpty => false, поэтому я даже не пробовал это.

Другой вариант, о котором я могу думать, это добавить функцию, которая проверяет, что «проверка» в модели beforeSave, но я хотел бы иметь возможность делать это с помощью валидаций (так что мне не нужно возиться с массив validations для вывода сообщения об ошибке, как я хочу).

Я не уверен, что я делаю неправильно ... Я экономлю две модели с saveAll, но проблема сохраняется, даже если я делаю простой save. Результирующий массив размещенной формы:

Array 
(
    [House] => Array 
     (
      [first] => 
      [second] => 
      [third] => t 
     ) 
) 

в случае, если это поможет. Не знаю, какая другая информация может быть здесь полезной, но дайте мне знать. Заранее спасибо.

(с помощью CakePHP 2.4.4)

ответ

1

Установка required => true означает только то, что ключ массива должен присутствовать; он не проверяет значение вообще.

Попробуйте следующий код:

public $validate = array(
    'first' => array(
     'oneEmpty' => array(
      'rule' => array('maxOneEmpty'), 
     'message' => 'At least one must be filled' 
     ) 
    ), 
    'second' => array(
     'oneEmpty' => array(
      'rule' => array('maxOneEmpty'), 
      'message' => 'At least one must be filled' 
     ) 
    ) 
); 

public function maxOneEmpty() { 
    if ((empty($this->data['Model']['first'])) && (empty($this->data['Model']['second']))) { 
     return false; 
    } else { 
     return true; 
    } 
} 
+0

Спасибо за ответ. К сожалению, он не работает, он все еще не проверяет, когда 'first' и' second' являются пустыми :(Думал, что удаление переменных в функции может сделать трюк, даже если это сделало его невосстанавливаемым, но нет, тот же результат ... – Nunser

+0

Weird. Я только что протестировал его на своем сайте, и он отлично работал (после того, как я скорректировал круглые скобки, чтобы соответствовать приведенному выше правилу). Оставляя 'first' и' second' blank, появляется сообщение об ошибке **, По крайней мере, один должен быть заполнен «**» в обоих полях. Заполнение любой из них проверяет форму. –

+0

Мне тоже кажется странным, поэтому я разместил вопрос. Ваш ответ выглядит нормально, и я думал, что это сработает, но нет. .. Есть ли конфигурация, которую мне не хватает? Я так не думаю, но может быть? Я обновлю вопрос, если я получу дополнительную информацию о проблеме ... – Nunser

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