butteff
@butteff
Раз в тысячу лет заправляю свитер в носки

Что не так с моей валидацией в yii2?

Не найдя ответа на этот вопрос, стал на локалхосте максимально упрощать то же самое действие. И та же самая проблема, но почему? В этот раз скриншоты:

Модель:
d1880b7fb00b47e28baee4891e1e5c45.png

Кусок контроллера:
292b29aca3f84500aec978abd982847a.png

Вьюха:
8b96b21981d84fe28fa01e48feea78a4.png

Результаты с разным вводом:
98537626b5c648c2b86e39986f886682.png

77b3f02da83d42838b90a2495bd3d2e3.png

d4a203fc5dd641b49509b48e34429ae5.png

Почему aaa проходит валидацию?
Почему, если внутри ValidateRole написать без условия сразу добавления ошибки, то все равно никакой ошибки нет, а ведь должно при любом тексте давать ошибку?
Почему, если внутри ValidateRole написать просто die(); - ничего не рушится?
Почему, если убрать метод validateRole, но оставить его в rules, то тогда YII дает ошибку?

В общем, что не так с моей валидацией на голом свежеустановленном фреймворке, где я не успел ничего сломать?
  • Вопрос задан
  • 1142 просмотра
Решения вопроса 3
vakorovin
@vakorovin
Разработчик
Я вам несколько иначе постараюсь объяснить. Валидаций может быть 2 - серверная и клиентская.
Смотрите: когда мы говорим, что email - unique, мы же не передаем клиенту, в js-валидатор перечень всех занятых email-ов, такая проверка осуществляется уже на сервере, если на стороне клиента прошли другие валидации. Тоже самое и с собственноручно написанными php-проверками, они не трансформируются же в js-код и выполняются на сервере в момент вызова метода validate() модели. Поэтому самому для себя, для понимания, что происходит - откройте исходный код html-страницы с формой и посмотрите, какие правила валидации прописаны в js, это здорово поможет разобраться в ситуации.

Что касается решения проблемы, то либо используйте ajaxValidation, как вам уже написали выше, либо присмотритесь к валидатору Compare Validator. В вашем случае для email не прописано правило unique, следовательно могу сделать вывод, что подсветка зеленым инпутов происходит еще до отправки формы на сервер, т.е. серверная валидация не отрабатывает.
Ответ написан
Комментировать
Immortal_pony
@Immortal_pony
В представлении разрешите ajax-валидацию:
<?php $form = ActiveForm::begin([
    'enableAjaxValidation' => true,
    'validationUrl' => ["site/entry"] // опциональный параметр, указывает метод для валидации. По умолчанию обработчик формы.
]); ?>


В контроллере проводите валидацию:
if (Yii::$app->request->isAjax) {
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

    $model->load(Yii::$app->request->post());
    return \yii\widgets\ActiveForm::validate($model);
}


PS В консоли разработчика браузера убедитесь, что запросы уходят и ответы корректные приходят. Это поможет в решении других ошибок ;)
Ответ написан
Express777
@Express777
Сам недавно столкнулся с этим.

Если коротко, все кастомные валидаторы не имею клиентскую часть. То есть проверка проходит на стороне сервера. Хотите убедиться? просто нажмите Enter и отправьте форму. После перезагрузки страницу выскочит ошибка "Wrong Role".

Почему идет валидация email? Все встроенные валидаторы имеют и клиентскую и серверную валидацию.

Если хотите, чтобы Wrong Role проверял на стороне клиента, то нужно создать валидатор по этой доке

Валидация на стороне клиента


Раздел Валидация на стороне клиента
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы