MVC и валидация

vanicon

Новичок
stwa, кажется понял, у вас есть класс UserForm и там содержатся все правила валидации,
и когда приходят данные (неважно откуда) вы помещаете их в UserFrom, а он может возвращать валидный объект user,
Если так, то неплохо вроде должно получатся...
 

stwa

Новичок
Можно пример небольшой, реализации идеи?
Обработка 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

Новичок
stwa, кажется понял, у вас есть класс UserForm и там содержатся все правила валидации,
и когда приходят данные (неважно откуда) вы помещаете их в UserFrom, а он может возвращать валидный объект user,
Если так, то неплохо вроде должно получатся...
да, именно так
только модель не возвращает другую модель, а есть методы для возврата валидных данных и гидрации другой модели, например модели предметной области User
 

vanicon

Новичок
Еще один вопрос, в коде написано FormInterface::VALIDATE_ALL, то есть валидатор будет валидировать и такие данные как капча и повтор пароля, правильно?
А к примеру на странице изменения данных, не нужно валидировать капчу к примеру, то тогда там будет что то типо
$form->setValidationGroup('firstname', 'lastname', 'email', 'password', 'password2'...); или как?
 

stwa

Новичок
если в метод setValidationGroup передана константа FormInterface::VALIDATE_ALL, то будут валидироваться все поля, которые есть в моделе на момент вызова метода isValid
либо вы можете передать список полей, которые надо валидировать.
т.е. если надо исключить только капчу, то надо будет перечислить все поля, кроме капчи

да, именно так: $form->setValidationGroup('firstname', 'lastname', 'email', 'password', 'password2'...);
 

WMix

герр M:)ller
Партнер клуба
fixxxer
другими словами "код ошибки" запрятана тоже в моделе? перевод не перевод, не в этом же дело, ошибка она откуда берется?
 

vanicon

Новичок
если в метод setValidationGroup передана константа FormInterface::VALIDATE_ALL, то будут валидироваться все поля, которые есть в моделе на момент вызова метода isValid
Вряд ли такой вариант прокатит, потому что если на странице регистрации может прийти запрос в котором капча будет и не введена (isset($_POST['capthca']) === false), а значит если будет FormInterface::VALIDATE_ALL, то капча валидироваться не будет, так как в модель не была передана капча, верно?
 

vanicon

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

stwa

Новичок
, то капча валидироваться не будет, так как в модель не была передана капча, верно?
почему не будет? будет
мы же не сделали что-то типа этого:
PHP:
$form->removeElement('captcha');
$_POST['capthca'] - это данные
а валидируются элементы $form
Т.е. в данном случае код:
PHP:
var_dump($form->getElement('captcha'))
выведет NULL

не путайте данные и элементы модели, в которые вы записываете данные перед валидацией
метод setData() - для чего?
 

fixxxer

К.О.
Партнер клуба
fixxxer, хранить текст ошибки в представлении, как то это не совсем правильно, ведь удалится одно из правил валидации, или наоборот добавится, то придется править все view где прописаны эти ошибки, другое дело если для одной и той же ошибки разный вывод, но лучше уж в контроллер тогда, а если нет то лучше все таки в модель, как мне кажется..
1) А я хочу на русском языке сообщение показать, а не на английском. Что мне делать?

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

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

Что мне делать?
 

vanicon

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

stwa

Новичок
Правильно, если я введу какое-то дополнительное поле, которое не должно обрабатываться в экшене регистрации, то я изменю в контролере экшен регистрации и заменю FormInterface::VALIDATE_ALL перечислением полей, которые относятся только к регистрации
 

vanicon

Новичок
fixxxer
1) Причем тут это? В модели прописываем сообщения ошибок на каком угодно языке...
2) Можно тогда что бы модель выводила стандартные сообщения, но что бы была возможность перекрывать какой либо сообщение в контроллере...
 

fixxxer

К.О.
Партнер клуба
То есть, во втором случае:

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 - вместо того, чтобы просто перекинуть тикет верстальщику?

Да ну на.
 

vanicon

Новичок
stwa
А насчет уникальности логина или мыла, это уже в модели User валидируется так?
 

fixxxer

К.О.
Партнер клуба
В модели прописываем сообщения ошибок на каком угодно языке...
То есть мне надо брать сообщения от переводчика на 100500 языков и ручками копипастить в модели?

Да ну на.
 

vanicon

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

vanicon

Новичок
Хотя конечно возвращать код ошибки вместо текста, тоже логично, ведь не всегда нужен текст ошибки, важен сам факт ее существования, то есть что бы если произошла ошибки при входе, что бы произошла какое нибудь действие типо экран покраснел, или еще что нибудь в этом роде...
Но если поступать так, то получится что представление станет зависимым от модели, что тоже не есть хорошо..
 
Сверху