Условная проверка в Yii2

У меня есть переключатель с двумя значениями (обязательное поле), на основе которого отображается одно поле (есть два поля, которые изначально скрыты, они отображаются на основе значения переключателя), которое должно быть обязательным. Поэтому я использовал условную проверку для изначально скрытых полей.

Это мой код модели:

public function rules()
    {
        return [
            [['receipt_no', 'date_of_payment', 'payment_method_id', 
              'total_amount'], 'required'],   
            ['nonmember_name', 'required', 'whenClient' => function($model) 
             {
                return $model->is_member == 2;
             }, 'enableClientValidation' => false],
             ['member_id', 'required', 'whenClient' => function($model) 
             {
                return $model->is_member == 1;
             }, 'enableClientValidation' => false],
            [['receipt_no', 'date_of_payment', 'payment_method_id', 
              'total_amount','is_member'], 'required','on' => 'receipt'],
        ];
    }

Я использую сценарий receipt, is_member — это поле переключателя. Если я выберу значение 1 для is_member, то поле member_id будет видно, и оно должно быть обязательным. Если is_member имеет значение 2, то отображается nonmember_name, и это поле должно стать обязательным. С моим кодом в модели мне удалось этого добиться. Но теперь другие действия (сохранение новой строки данных в модели) с использованием этой модели имеют ошибку

Массив ( [nonmember_name] => Массив ( [0] => Имя не может быть пустым. ))

Итак, мой вопрос заключается в том, как я могу сделать условную проверку специфичной для сценария (я думаю, что моя ошибка связана с обязательным правилом, определенным в условной проверке)

ИЗМЕНИТЬ:

Это моя радиокнопка

<?= $form->field($model, 'is_member')->radioList(array('1'=>'Member',2=>'Non Member'))->label('Member or Not'); ?>

person Bloodhound    schedule 10.12.2015    source источник


Ответы (2)


В правилах

public function rules()
{
    return [
       [
          'nonmember_name', 
          'required', 
          'when' => function ($model) { 
              return $model->is_member == 2; 
          }, 
          'whenClient' => "function (attribute, value) { 
              return $('#id').val() == '2'; 
          }"
       ]
    ];
}
person vishuB    schedule 10.12.2015
comment
в моем случае пришлось внести небольшое изменение в оператор возврата, например, этот return ($('#receipt-is_member input:checked').val() == 2); - person Bloodhound; 10.12.2015

Я предпочитаю использовать функции внутри правил модели, что значительно упрощает работу с ними в будущем.

Следует отметить, что во многих ответах не упоминается то, что вы ДОЛЖНЫ вручную повторно запускать проверку на стороне клиента Yii2!

$("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");

В моем примере ниже есть 2 типа аккаунтов: тренер и стажер. В моей панели администратора администратор может создать нового пользователя. Если они выберут «тренер», им больше нечего делать. Если они выбирают «стажера», этому «стажеру» должен быть назначен «тренер».

Итак, в терминах кода:

Если роль пользователя == стажер, требуется Train_id и показывает ввод формы. В противном случае скройте ввод Train_id, и Train_id не потребуется.


Правила Модели:

public function rules()
{
    return [
        [
            'trainer_id', 'required', 'when' => function ($model) {
                return $model->role == 2;
            }, 'whenClient' => "isUserTypeTraineeChosen"
        ],
    ];
}

Просмотреть после формы:

<?php $this->registerJs('
    function isUserTypeTraineeChosen (attribute, value) {

        if ($("#createuserform-role").val() == 2) {
            $(".field-createuserform-trainer_id").show();
        } else {
            $("#createuserform-trainer_id").val(null);
            $(".field-createuserform-trainer_id").hide();
        }

        return ($("#createuserform-role").val() == 2) ? true : false;

    };

    jQuery( "#createuserform-role" ).change(function() {
        $("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
    });

    jQuery( "#createuserform-role" ).keyup(function() {
        $("#w0").yiiActiveForm("validateAttribute", "createuserform-trainer_id");
    });
'); ?>

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

Я также сделал так, чтобы ввод trainer_id по умолчанию был скрыт с помощью CSS, поскольку тип пользователя по умолчанию — тренер.

person Wade    schedule 16.09.2017