2015-12-14 1 views
1

В одном из моих файлов view в проекте я использую валидатор when для определения некоторой валидации для model, но его неправильная работа может быть вызвана тем, что я не знаю, как использовать этот валидатор. Вот код модели из этой таблицыКогда валидатор в yii2 не работает должным образом

 return [ 
     [['event_id', 'user_id'], 'required'], 
     [['event_id', 'user_id'], 'integer'], 
     [['is_mandatory'], 'boolean'], 
     [['answer'], 'string', 'max' => 250], 
     [['answer'], 'required', 'when' => function($model){ 
      return $model->is_mandatory == 1; }] 
    ]; 

Вот мой view кода да я создаю это поле на файл представления с экземпляром, поскольку для создания этих полей зависит от других входов.

 $modelAnswers = new Answers(); 
     $modelAnswers->is_mandatory = 0; 

     echo $form->field($modelAnswers, "answer",[ 
      'template' => ' <div class="row"><div class="col-lg-6 col-md-6 col-sm-6 col-xs-6"><label>{label}</label></div><div class="col-lg-4 col-md-4 col-sm-6 col-xs-8">{input}{error}{hint}</div></div>' 
     ])->textInput(['maxlength' => true]); 

Но он всегда распечатывает поле по мере необходимости. Я вижу в отладчике, что $model присваивается значение правильно. Что не так с валидатором здесь?

+0

'$ modelAnswers-> is_mandatory = 0;' и '$ model-> is_mandatory == 1;'. Код, который вы отправили в 'when', никогда не будет завершен с этими условиями. Почтовый контроллер. – ineersa

+0

@ineersa Я создаю этот экземпляр на странице просмотра. Таким образом, в контроллере нет ничего, связанного с моделью «Ответы». И я создаю его на странице 'view', потому что это зависит от другой входной погоды для создания этого поля или нет. –

+0

Снова вы устанавливаете '$ modelAnswers-> is_mandatory' в' 0' и запрашиваете его как '1'. Как ваше состояние может быть правдой? – ineersa

ответ

1

Проверка when() существует только для проверки на стороне сервера и будет оценивать только при отправке формы. Если вы хотите отобразить поле по необходимости или нет, в зависимости от значения is_mandatory, то у вас есть два варианта.

Во-первых, вы можете использовать метод whenClient() для добавления проверки на стороне клиента. Это то, что я использую в своих собственных формах, и включает в себя запись функции javascript, которая будет определять, требуется ли это поле или нет, и затем будет применять классы relvant. Для этого вам нужно будет указать поле is_mandatory где-то в вашей форме, возможно, как скрытое поле, и вам нужно включить clientValidation в форме.

Во-вторых, вы можете просто адаптировать шаблон для поля, чтобы сообщения об ошибках не включались, если только для is_mandatory установлено значение true. Это потребует перезаписи метки поля.

echo $form->field($modelAnswers, "answer",[ 
      'template' => ' <div class="row"><div class="col-lg-6 col-md-6 col-sm-6 col-xs-6"><label class="{$modelAnswers->is_mandatory ? 'required' : ''}">Name of label here</label></div><div class="col-lg-4 col-md-4 col-sm-6 col-xs-8">{input}{error}{hint}</div></div>' 
     ]) 
+0

Мне нравится вторая идея лучше. Поскольку для java-скрипта для полей, которые не назначены для события, идентификатор еще немного сложно для меня. Я собираюсь попробовать второй метод –

+0

его синтаксическую ошибку бросания. И я также попробовал просто набрать '