Я сделал довольно много руководств по литию (ссылки ниже, если они помогают кому-то другому, а также чтобы показать, что я выполнил свою домашнюю работу :), и я понимаю самые основные части создания моделей, представлений, контроллеров и использования MVC для создания запись БД на основе ввода формы.
Однако я новичок в MVC для веб-приложений и Lithium, и я не уверен, как мне писать код в более сложных ситуациях. Это общий вопрос, но у меня есть два конкретных вопроса о проверке:
- Как мне проверить данные о дате, отправленные из формы?
- Как мне проверить, что два поля электронной почты пользователя имеют одинаковое значение?
Я был бы очень благодарен за любую помощь с этими вопросами, и конкретные примеры, подобные этому, также действительно помогут мне понять, как делать хорошее кодирование MVC в других ситуациях!
Ввод даты - проверка разделения данных на несколько входов формы
По причинам пользовательского интерфейса форма регистрации просит пользователей ввести свой DOB в трех полях:
<?=$this->form->field('birthday', array('type' => 'select', 'list' => array(/*...*/))); ?>
<?=$this->form->field('birthmonth', array('type' => 'select', 'list' => array(/*...*/))); ?>
<?=$this->form->field('birthyear', array('type' => 'select', 'list' => array(/*...*/))); ?>
Как лучше всего проверить эту серверную часть? Я думаю, мне следует воспользоваться преимуществами автоматической проверки, но я не уверен, как лучше всего это сделать для набора переменных, которые на самом деле не являются частью модели. Например.:
- Должен ли я постобработать
$this->request->data
вUsersController
? Например. измените$this->request->data
внутриUsersController
перед передачейUsers::create
. - Должен ли я вытащить поля формы из
$this->request->data
и использовать статический вызовValidator::isDate
внутриUsersController
? - Есть ли способ написать правило проверки в модели для комбинаций переменных формы, которые не являются частью модели?
- должен ли я переопределить
Users::create
и выполнить там всю дополнительную проверку и постобработку?
Все это похоже на то, что они могут сработать, хотя некоторые кажутся немного некрасивыми, и я не знаю, какие из них могут вызвать у меня серьезные проблемы в будущем.
[РЕДАКТИРОВАТЬ: с этим тесно связана проблема объединения трех полей формы в одно поле, которое будет сохранено в модели]
Ввод электронной почты - проверка того, что два поля формы идентичны, но сохраняется только одно
Для здравого смысла / общепринятой практики форма регистрации просит пользователей дважды указать свой адрес электронной почты:
<?=$this->form->field('email_address'); ?>
<?=$this->form->field('verify_email_address'); ?>
Как я могу написать правило автоматической проверки, которое проверяет, что эти два поля формы имеют одинаковое значение, но сохраняет только email_address в базе данных?
Похоже, что это почти тот же вопрос, что и предыдущий, потому что список возможных ответов, которые я могу придумать, тот же - поэтому я отправляю это как один вопрос, но я был бы очень признателен за вашу помощь с обеими частями, поскольку я думаю, что решение этого будет тонким, отличным и в равной степени поучительным!
[РЕДАКТИРОВАТЬ: с этим тесно связана проблема не сохранения verify_email_address в моей модели и БД]
Некоторые справочные материалы по литию
Я читал другие, но эти три руководства привели меня туда, где я нахожусь с пользователями и формами регистрации сейчас ...
Некоторые другие вопросы StackOverflow по тесно связанным темам (но без ответа, а также не по литию)
- Один ответ на этот вопрос предлагает создать отдельный контроллер (и модель и ...?) - мне он не очень "литиевый", и я беспокоюсь, что он может быть хрупким / легко глючным.
- Эта замечательная история убедила меня, что я был прав беспокоился о том, чтобы вставить его в контроллер, но я не уверен, что было бы хорошим решением
- Этот в представлениях заставляет меня думать, что я должен каким-то образом включить его в модель, но я не знаю, как лучше всего это сделать в литии (см. мой маркированный список в разделе «Ввод даты» выше)
- И эта презентация Scribd задала вопрос: надеясь ответить на последней странице ... после чего он остановился, не ответив на него!
NB: ответы в стиле CakePHP тоже подходят. Я не знаю, но это похоже, и я уверен, что могу перевести с него, если мне нужно!