Условный валидатор

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

Условный валидатор

Сообщение Arroyo »

Здравствуйте. Мне нужно указать обязательность указания значения при двух условиях. $model->realty_type == 0 и $model->realty_type == 1
Как правильно это написать в rules?

Код: Выделить всё

['building_type', 'required', 'when' => function($model) {
    return $model->realty_type == 0;
}], 
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

Re: Условный валидатор

Сообщение Arroyo »

А как указать, что поле нельзя заполнять при условии?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Условный валидатор

Сообщение maleks »

валидатор compare глянь
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

Re: Условный валидатор

Сообщение Arroyo »

maleks писал(а):валидатор compare глянь
Ошибку показывает постоянно "Значение «Тип здания» должно быть равно «»". Но я ведь указал, что это только при условии $model->realty_type !== 0 || $model->realty_type !== 1. У меня $model->realty_type равен 0 Пробовал 'compareValue' => null, тогда требует 'building_type_repeat

Код: Выделить всё

 ['building_type', 'compare', 'compareValue' => '', 'operator' => '==', 'when' => function($model) {
     return $model->realty_type !== 0 || $model->realty_type !== 1;
 }'],
Последний раз редактировалось Arroyo 2016.03.30, 15:34, всего редактировалось 1 раз.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Условный валидатор

Сообщение maleks »

1) что за ошибку?
2) building_type_repeat выше не приведено
3) имеется еще фишка со 'skipOnEmpty' , его попробуй в false установить
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

Re: Условный валидатор

Сообщение Arroyo »

maleks писал(а):1) что за ошибку?
"Значение «Тип здания» должно быть равно «»" та что под полем появляется
maleks писал(а): 2) building_type_repeat выше не приведено
так у меня его и нет, он ищет такое же поле с _repeat на конце, если compareValue == null

пойду смотреть что за skipOnEmpty :)
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Условный валидатор

Сообщение Nerf »

У вас проблема скорее всего с js валидацией. Или пишите "whenClient", или отключайте('enableClientValidation').
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

Re: Условный валидатор

Сообщение Arroyo »

сделал так:

Код: Выделить всё

['building_type', 'in', 'range' => [null], 'when' => function($model) {return $model->realty_type !== 0 && $model->realty_type !== 1;}, 'message' => 'Ошибка'], 
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Условный валидатор

Сообщение Nerf »

Arroyo писал(а):сделал так:

Код: Выделить всё

['building_type', 'in', 'range' => [null], 'when' => function($model) {return $model->realty_type !== 0 && $model->realty_type !== 1;}, 'message' => 'Ошибка'], 
Изображение
Подобной литературой не интересуетесь? :lol:

Посмотрите внимательно на ваше предыдущее условие "$model->realty_type !== 0 || $model->realty_type !== 1" и попытайтесь понять, почему это всегда true => "Значение «Тип здания» должно быть равно «»". Еще убедитесь в типе данных, если используете тождественные сравнения. Или оставьте все как есть...
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

Re: Условный валидатор

Сообщение Arroyo »

ну так в примере с range я исправил || на &&. Или что то еще не так? Range в данном случае использовать можно? Или все таки compаre нужно?


update

Эта ерунда тоже не работает :) видимо я не понимаю, что с $model->realty_type !== 0 || $model->realty_type !== 1 не так :)

Новый вариант:

Код: Выделить всё

['building_type', 'in', 'range' => [null], 'when' => function($model) {return !in_array($model->realty_type, [0,1]);}, 'message' => 'Ошибка'],
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Условный валидатор

Сообщение maleks »

там и compare уже будет работать, раз ошибка в логике внутри when проверки была
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Условный валидатор

Сообщение Nerf »

ну так в примере с range я исправил || на &&. Или что то еще не так? Range в данном случае использовать можно? Или все таки compаre нужно?
Должно быть &&. Можно использовать несколько вариантов. Только использование не очевидных решений приводит к не очевидным результатам.
Используйте compare. Расставьте правильные сравнения(тождественное или нет), приведите\проверьте типы где нужно.
А вообще не понятно, зачем вам там условие. Если заполнять необязательно, то возможно лучше скрывать поле или делать неактивным.
Ответить