MVC и валидация

  • Автор темы Автор темы vanicon
  • Дата начала Дата начала
stwa, кажется понял, у вас есть класс UserForm и там содержатся все правила валидации,
и когда приходят данные (неважно откуда) вы помещаете их в UserFrom, а он может возвращать валидный объект user,
Если так, то неплохо вроде должно получатся...
 
Можно пример небольшой, реализации идеи?
Обработка post-запроса со страницы регистрации пользователя
PHP:
        $form = new UserForm();
        $form->setValidationGroup(FormInterface::VALIDATE_ALL); // Валидировать все поля
        $form->setData($this->getRequest()->getPost());
        if ($form->isValid()) {
              $data = $form->getData();
        }

Обработка post-запроса со страницы изменения ФИО в личном кабинете
PHP:
        $form = new UserForm();
        $form->setValidationGroup('firstname', 'lastname'); // Валидировать только имя и фамилию
        $form->setData($this->getRequest()->getPost());
        if ($form->isValid()) {
              $data = $form->getData(); //$data будет содержать только значения firstname и lastname
        }
 
stwa, кажется понял, у вас есть класс UserForm и там содержатся все правила валидации,
и когда приходят данные (неважно откуда) вы помещаете их в UserFrom, а он может возвращать валидный объект user,
Если так, то неплохо вроде должно получатся...
да, именно так
только модель не возвращает другую модель, а есть методы для возврата валидных данных и гидрации другой модели, например модели предметной области User
 
Еще один вопрос, в коде написано FormInterface::VALIDATE_ALL, то есть валидатор будет валидировать и такие данные как капча и повтор пароля, правильно?
А к примеру на странице изменения данных, не нужно валидировать капчу к примеру, то тогда там будет что то типо
$form->setValidationGroup('firstname', 'lastname', 'email', 'password', 'password2'...); или как?
 
если в метод setValidationGroup передана константа FormInterface::VALIDATE_ALL, то будут валидироваться все поля, которые есть в моделе на момент вызова метода isValid
либо вы можете передать список полей, которые надо валидировать.
т.е. если надо исключить только капчу, то надо будет перечислить все поля, кроме капчи

да, именно так: $form->setValidationGroup('firstname', 'lastname', 'email', 'password', 'password2'...);
 
fixxxer
другими словами "код ошибки" запрятана тоже в моделе? перевод не перевод, не в этом же дело, ошибка она откуда берется?
 
если в метод setValidationGroup передана константа FormInterface::VALIDATE_ALL, то будут валидироваться все поля, которые есть в моделе на момент вызова метода isValid
Вряд ли такой вариант прокатит, потому что если на странице регистрации может прийти запрос в котором капча будет и не введена (isset($_POST['capthca']) === false), а значит если будет FormInterface::VALIDATE_ALL, то капча валидироваться не будет, так как в модель не была передана капча, верно?
 
fixxxer, хранить текст ошибки в представлении, как то это не совсем правильно, ведь удалится одно из правил валидации, или наоборот добавится, то придется править все view где прописаны эти ошибки, другое дело если для одной и той же ошибки разный вывод, но лучше уж в контроллер тогда, а если нет то лучше все таки в модель, как мне кажется..
 
, то капча валидироваться не будет, так как в модель не была передана капча, верно?
почему не будет? будет
мы же не сделали что-то типа этого:
PHP:
$form->removeElement('captcha');

$_POST['capthca'] - это данные
а валидируются элементы $form
Т.е. в данном случае код:
PHP:
var_dump($form->getElement('captcha'))
выведет NULL

не путайте данные и элементы модели, в которые вы записываете данные перед валидацией
метод setData() - для чего?
 
fixxxer, хранить текст ошибки в представлении, как то это не совсем правильно, ведь удалится одно из правил валидации, или наоборот добавится, то придется править все view где прописаны эти ошибки, другое дело если для одной и той же ошибки разный вывод, но лучше уж в контроллер тогда, а если нет то лучше все таки в модель, как мне кажется..

1) А я хочу на русском языке сообщение показать, а не на английском. Что мне делать?

2) Дизайнер сказал - поменять сообщение на такое:

Пользователь {{ username }} у нас не зарегистрирован. Возможно, вы хотели <a href="/signup/">зарегистрироваться?</a>

Что мне делать?
 
stwa
То есть в UserForm будут прописаны все свойства, капча, повтор пароля, логин и тд.
Но что если при регистрации, через какой нить api, нужно будет проверить какое нибудь специфическое поле, то тогда вы небудьпропишите это в свойства UserForm, но тогда при обычной регистрации через форму, FormInterface::VALIDATE_ALL уже не прокатит, так как нет этого специфического поля..
Правильно?
Мы ведь обсуждаем что данные могут от куда угодно прийти..
 
Правильно, если я введу какое-то дополнительное поле, которое не должно обрабатываться в экшене регистрации, то я изменю в контролере экшен регистрации и заменю FormInterface::VALIDATE_ALL перечислением полей, которые относятся только к регистрации
 
fixxxer
1) Причем тут это? В модели прописываем сообщения ошибок на каком угодно языке...
2) Можно тогда что бы модель выводила стандартные сообщения, но что бы была возможность перекрывать какой либо сообщение в контроллере...
 
То есть, во втором случае:

PHP:
$form->getValidator('validatorName')->setMessage(
   $this->intl->translate('signup_username_not_found', array(
       'username' => $form->username,
       'signup_link' => $this->Router->buildUrl('signup')
   )),
   Validator::ERROR_CODE
);
и еще разгребать отключение autoescape - вместо того, чтобы просто перекинуть тикет верстальщику?

Да ну на.
 
stwa
А насчет уникальности логина или мыла, это уже в модели User валидируется так?
 
В модели прописываем сообщения ошибок на каком угодно языке...

То есть мне надо брать сообщения от переводчика на 100500 языков и ручками копипастить в модели?

Да ну на.
 
То есть мне надо брать сообщения от переводчика на 100500 языков и ручками копипастить в модели?
Не совсем понимаю о чем вы.
Все сообщение об ошибках прописываем в файлах типа, ru, en и тд
А в модели ссылаемся на эти сообщения, в контроллере можно подключать эти файлики с сообщениями...
 
Хотя конечно возвращать код ошибки вместо текста, тоже логично, ведь не всегда нужен текст ошибки, важен сам факт ее существования, то есть что бы если произошла ошибки при входе, что бы произошла какое нибудь действие типо экран покраснел, или еще что нибудь в этом роде...
Но если поступать так, то получится что представление станет зависимым от модели, что тоже не есть хорошо..
 
Сверху