не работает валидация в зависимости от условия

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

не работает валидация в зависимости от условия

Сообщение Братуха »

Подскажите пожалуйста как в yii2 делать валидацию в зависимости от условия допустим. У меня есть radioList 'company_type' и если его значение равно 3, то есть 3-я кнопка выбрана, то поля 'number_of_employees','company_name','company_form' должны быть не обязательными. Сделал я вот так

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

  [['number_of_employees','company_name','company_form'], 'required', 'when' => function($model) {
                return $model->company_type !== '3';
            }], 
но все равно валидация не пропускает если выбран 3-я радиокнопка. В 3 радиокнопке содержится значение 3, поля 'number_of_employees','company_name','company_form' в условии нигде не присвоено значение 'required'.

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: не работает валидация в зависимости от условия

Сообщение Onotole »

А вы уверены, что 3 это именно строка ?

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

поменял на цифру все равно не пропускает

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

Onotole писал(а):А вы уверены, что 3 это именно строка ?
вот что в правилах

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

[['last_name','username','company_phone','password','email','company_city'], 'required'],
            [['username','last_name'], 'string', 'min' => 2, 'max' => 255],
            ['email', 'unique', 'targetClass' => '\budyaga\users\models\User', 'message' => Yii::t('users', 'THIS_EMAIL_ALREADY_TAKEN')],
            ['company_site', 'url', 'defaultScheme' => 'http'],
            ['company_phone', 'string'],
            [['number_of_employees','company_name','company_form'], 'required', 'when' => function($model) {
                return $model->company_type !== '3';
            }],
            [['company_type','number_of_employees','company_city'], 'integer'],
            ['company_another_phone','string'],
            ['password', 'string', 'min' => 6], 
вот сам код в представлении

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

                $GetCompanyType = [
                     '1' => 'первый',
                     '2' => 'второй',
                     '3' => 'третий'
                 ];
                 echo $form->field($model, 'company_type')->label(false)
                     ->radioList($GetCompanyType); 

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: не работает валидация в зависимости от условия

Сообщение caHek2x »

а ошибку валидация какую выдает ... ? случайно не то что number_of_employees должен быть числом ?

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

срабатывает company_name и по нему не пускает мол заполнено должно быть хотя радиокнопка стоит на 3 пункте. В консоли никаких ошибок нет

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: не работает валидация в зависимости от условия

Сообщение caHek2x »

ну залогируйте в вашей ф-ции

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

when' => function($model) {
                return $model->company_type !== '3';
            }],
чему равно в момент проверки model->company_type

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

caHek2x писал(а):ну залогируйте в вашей ф-ции

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

when' => function($model) {
                return $model->company_type !== '3';
            }],
чему равно в момент проверки model->company_type
а вы не подскажите как это узнать, я просто не знаком как устроена js валидация в yii2? да и что скрывать в целом с js как вывести переменную на экран :oops: ну по крайней мере у меня стоит js условие на клик по третей радиокнопке со значением 3 , то есть там точно 3 цифра

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

Так это получается работает только проверка на сервере, а на js отдельно писать надо? Проверка со стороны сервера работает

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: не работает валидация в зависимости от условия

Сообщение zelenin »

Братуха писал(а):Так это получается работает только проверка на сервере, а на js отдельно писать надо? Проверка со стороны сервера работает
так в документации по валидации именно это и написано.

caHek2x
Сообщения: 1226
Зарегистрирован: 2016.04.12, 20:41

Re: не работает валидация в зависимости от условия

Сообщение caHek2x »

Братуха писал(а):Так это получается работает только проверка на сервере, а на js отдельно писать надо? Проверка со стороны сервера работает
хах ... я думал у вас со стороны сервера не работает ))) ну конечно для js отдельно надо писать )
или если не охота писать для js отдельно можно ajax валидацию включить ...

https://github.com/yiisoft/yii2/blob/ma ... idation.md
https://yiiframework.com.ua/ru/doc/guid ... validation (тут прочитаете как для js прикрутить вашу валидацию - whenClient)
Братуха писал(а): да и что скрывать в целом с js как вывести переменную на экран
как вашей душе угодно ... хоть alert ... хоть console.log ... но соответственно это надо писать в js скрипте ... а не в том коде который я цитировал в предыдущем сообщении ... то php ... и тот кусок вообще не касался валидации js ...

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

caHek2x писал(а): https://yiiframework.com.ua/ru/doc/guid ... validation (тут прочитаете как для js прикрутить вашу валидацию - whenClient)
Я просто действовал по логике если js валидация работает только прописав условие в php по умолчанию, значит и прописав условие должна работать, но все равно не работает

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

[['number_of_employees','company_name','company_form'], 'required', 'when' => function($model) {
                return $model->company_type !== '3';
            },'whenClient' => "function (attribute, value) {
            return $('#company_type').val() !== 3;
            }"],
 
Пробовал 3 как цифру и как текст, даже пробовал '#company_type input' но ничего

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

в консоли ошибок нет

Rom
Сообщения: 81
Зарегистрирован: 2014.12.22, 11:56

Re: не работает валидация в зависимости от условия

Сообщение Rom »

Дебажте, посмотрите что выводит в консоле браузера.

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

'whenClient' => "function (attribute, value) {
        console.log($('#company_type').val());
}"

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

Rom писал(а):Дебажте, посмотрите что выводит в консоле браузера.

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

'whenClient' => "function (attribute, value) {
        console.log($('#company_type').val());
}"
 
на это в консоли ничего не выводит, щелкал я по радио кнопкам и ничего

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

,'whenClient' => "function (attribute, value) {
        console.log($('#company_type').val());
}" 
сделал другое условие

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

['last_name', 'required', 'when' => function($model) {
                return $model->last_name == 'ret';
            },'whenClient' => "function (attribute, value) {
        console.log($('#last_name').val());
}"], 
что бы проверить, в консоли пишет undefined в любом случае вписал я там что или оставил пустым или вписал ret

Rom
Сообщения: 81
Зарегистрирован: 2014.12.22, 11:56

Re: не работает валидация в зависимости от условия

Сообщение Rom »

Братуха писал(а): на это в консоли ничего не выводит, щелкал я по радио кнопкам и ничего
Потому что не надо щёлкать по кнопкам надо сабмитить форму.

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

Rom писал(а):
Братуха писал(а): Потому что не надо щёлкать по кнопкам надо сабмитить форму.
вернуло 4 undefined 3 console.log и ($('#company_type') и 1 console.log($('#last_name')

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

 console.log($('#company_type').val());
})(attribute, value)) { yii.validation.required(value, messages, {"message":"Необходимо заполнить «Company Form»."}); }}},{"id":"signupemployerform-company_name","name":"company_name","container":".field-signupemployerform-company_name","input":"#signupemployerform-company_name","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {if ((function (attribute, value) {
        console.log($('#company_type').val());
})(attribute, value)) { yii.validation.required(value, messages, {"message":"Необходимо заполнить «Название компании»."}); }}},{"id":"signupemployerform-number_of_employees","name":"number_of_employees","container":".field-signupemployerform-number_of_employees","input":"#signupemployerform-number_of_employees","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {if ((function (attribute, value) {
        console.log($('#company_type').val());
})(attribute, value)) { yii.validation.required(value, messages, {"message":"Необходимо заполнить «Количество сотрудников»."}); }yii.validation.number(value, messages, {"pattern":/^\s*[+-]?\d+\s*$/,"message":"Значение «Количество сотрудников» должно быть целым числом.","skipOnEmpty":1});}},{"id":"signupemployerform-company_site","name":"company_site","container":".field-signupemployerform-company_site","input":"#signupemployerform-company_site","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.url(value, messages, {"pattern":/^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i,"message":"Значение «Ваш сайт» не является правильным URL.","enableIDN":false,"skipOnEmpty":1,"defaultScheme":"http"});}},{"id":"signupemployerform-company_city","name":"company_city","container":".field-signupemployerform-company_city","input":"#signupemployerform-company_city","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Company City»."});yii.validation.number(value, messages, {"pattern":/^\s*[+-]?\d+\s*$/,"message":"Значение «Company City» должно быть целым числом.","skipOnEmpty":1});}},{"id":"signupemployerform-last_name","name":"last_name","container":".field-signupemployerform-last_name","input":"#signupemployerform-last_name","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Фамилия»."});yii.validation.string(value, messages, {"message":"Значение «Фамилия» должно быть строкой.","min":2,"tooShort":"Значение «Фамилия» должно содержать минимум 2 символа.","max":255,"tooLong":"Значение «Фамилия» должно содержать максимум 255 символа.","skipOnEmpty":1});if ((function (attribute, value) {
        console.log($('#last_name').val());
})(attribute, value)) { yii.validation.required(value, messages, {"message":"Необходимо заполнить «Фамилия»."}); }}},{"id":"signupemployerform-username","name":"username","container":".field-signupemployerform-username","input":"#signupemployerform-username","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Имя пользователя»."});yii.validation.string(value, messages, {"message":"Значение «Имя пользователя» должно быть строкой.","min":2,"tooShort":"Значение «Имя пользователя» должно содержать минимум 2 символа.","max":255,"tooLong":"Значение «Имя пользователя» должно содержать максимум 255 символа.","skipOnEmpty":1});}},{"id":"signupemployerform-email","name":"email","container":".field-signupemployerform-email","input":"#signupemployerform-email","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Электронная почта»."});}},{"id":"signupemployerform-company_phone","name":"company_phone","container":".field-signupemployerform-company_phone","input":"#signupemployerform-company_phone","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Телефон»."});yii.validation.string(value, messages, {"message":"Значение «Телефон» должно быть строкой.","skipOnEmpty":1});}},{"id":"signupemployerform-company_another_phone","name":"company_another_phone","container":".field-signupemployerform-company_another_phone","input":"#signupemployerform-company_another_phone","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.string(value, messages, {"message":"Значение «Дополнительный телефон» должно быть строкой.","skipOnEmpty":1});}},{"id":"signupemployerform-password","name":"password","container":".field-signupemployerform-password","input":"#signupemployerform-password","error":".help-block.help-block-error","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, {"message":"Необходимо заполнить «Пароль»."});yii.validation.string(value, messages, {"message":"Значение «Пароль» должно быть строкой.","min":6,"tooShort":"Значение «Пароль» должно содержать минимум 6 символа.","skipOnEmpty":1});}}], []); 

Rom
Сообщения: 81
Зарегистрирован: 2014.12.22, 11:56

Re: не работает валидация в зависимости от условия

Сообщение Rom »

Получить значение из radio list вот такой jQuery конструкцией $('#company_type').val() нельзя. Надо либо каждому input присвоить одинаковый css селектор (класс) и получать значение через него $('.css_class:checked').val(); или через имя инпута, вот такой конструкцией $('input[name=\"имя инпута\"]:checked').val()

Братуха
Сообщения: 146
Зарегистрирован: 2016.04.08, 12:24

Re: не работает валидация в зависимости от условия

Сообщение Братуха »

Ура работает спасибо большое

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: не работает валидация в зависимости от условия

Сообщение Nerf »

Пробовал 3 как цифру и как текст, даже пробовал '#company_type input' но ничего
А просто не писать тождественное сравнение не пробовали? ;)

Ответить