spy_reality
@spy_reality

Одно из двух полей обязательное Yii2?

2606788f107b4d7d9dbbbc321974f7d8.jpg
Здравствуйте! Вопрос есть два поля phone и phone-other как сделать одно из двух полей обязательным ?

view
<?= $form->field($model, 'phone')->widget(MaskedInput::className(), [ 'mask' => ['+38 (999) 999-99-99'],  'options' =>['placeholder' => 'Мобильный номер телефона']])->label('Телефон *')->hint('для подтверждения и статусов заказа') ?>
					
<?= $form->field($model, 'phone_other')->textInput(['placeholder' => 'Другой номер телефона'])->label('Доп. телефон *')->hint('для подтверждения заказа') ?>


model
[['phone', 'phone_other'], 'required', 'when' => function ($model) {
   $validate = empty($model->phone) && empty($model->phone_other);
    if ($validate) { return false; }
    return true;
    }, 'whenClient' => "function (attribute, value) {
                return $('#order-phone').val() == '' && $('#order-phone_other').val() == '';
    }", 'message' => 'Необходимо заполнить хотя бы одно из полей "Телефон" или "Доп. Телефон"'],


Валидация работает при submit. Но когда поле onchange то валидация проходит только в том поле которое изменилось.
Как сделать что бы два поля изменялось при onchange хоть бы одного поля?
  • Вопрос задан
  • 5042 просмотра
Решения вопроса 1
spy_reality
@spy_reality Автор вопроса
Решил так.
[['phone', 'phone_other'], 'required', 'when' => function ($model) {
    $validate = empty($model->phone) && empty($model->phone_other);
    if ($validate) { return false; }
    return true;
    }, 'whenClient' => "function (attribute, value) {
    if($('#order-phone').val() == '' && $('#order-phone_other').val() == ''){
    $('.field-order-phone, .field-order-phone_other').addClass( 'has-error' ).find('.help-block-error').text( 'Необходимо заполнить хотя бы одно из полей «Телефон» или «Доп. Телефон»');
    return true;
    } else { 
    $('.field-order-phone, .field-order-phone_other').removeClass( 'has-error' ).find('.help-block-error').text('');
    return false;
    }
   }", 'message' => 'Необходимо заполнить хотя бы одно из полей «Телефон» или «Доп. Телефон»'],


Реализация не из лучших может кто то знает как по правильному сделать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
jacksparrow
@jacksparrow
С точки зрения логики, первое поле сделать обязательным. Второе необязательным.
А так, одна из первых ссылок гугл
public function rules()
{
    return array(
        // array('username, email', 'required'), // Remove these fields from required!!
        array('email', 'email'),
        array('username, email', 'my_required'), // do it below any validation of username and email field
    );
}

public function my_required($attribute_name, $params)
{
    if (empty($this->username)
            && empty($this->email)
    ) {
        $this->addError($attribute_name, Yii::t('user', 'At least 1 of the field must be filled up properly'));

        return false;
    }

    return true;
}
Ответ написан
sokollondon
@sokollondon
Сохраню в ответах простой пример валидации по двум полям =)

public function rules()
{
    return [
        [['phone', 'phone_other'], 'required', 'when' => function($model) {
            return (!$model->phone && !$model->phone_other);
        },'whenClient' => 'function(){return false;}',
        /*'whenClient' => 'function (attr, value) {
            return $("#MODEL-phone").val() == "" && $("#MODEL-phone_other").val() == "";
        }', 'message' => 'Заполните "Телефон" или "Доп. Телефон"'*/],
        //...
    ];
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы