Литий и проверка входных данных сложной формы — как?

Я сделал несколько руководств по Lithium (ссылки ниже на случай, если они помогут кому-то еще, а также чтобы показать, что я сделал свою домашнюю работу :), и я понимаю самые основные части создания моделей, представлений, контроллеров и использования MVC для создания записи БД на основе ввода формы.

Тем не менее, я новичок в MVC для веб-приложений и Lithium, и я не знаю, как мне писать код в более сложных ситуациях. Это общий вопрос, но у меня есть два конкретных вопроса проверки:

  • Как мне проверить данные даты, отправленные из формы?
  • Как проверить, что два поля электронной почты пользователя имеют одинаковое значение?

Я был бы очень признателен за любую помощь с этими вопросами, и конкретные примеры, подобные этому, также действительно помогут мне понять, как делать хорошее кодирование MVC и в других ситуациях!

Ввод даты — проверка данных, разделенных по нескольким полям ввода формы.

Из соображений пользовательского интерфейса форма регистрации просит пользователей ввести дату рождения в трех полях:

form->field('birthday', array('type' => 'select', 'list' => array(/*...*/))); ?>
form->field('birthmonth', array('type' => 'select', 'list' => array(/*...*/))); ?>
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и выполнять там всю дополнительную проверку и постобработку?

Кажется, что все они могут работать, хотя некоторые кажутся немного уродливыми, и я не знаю, какие из них могут вызвать у меня серьезные проблемы в будущем.

[EDIT: с этим тесно связана проблема объединения трех полей формы в одно поле для сохранения в модели]

Запись электронной почты — проверка двух полей формы на идентичность, но сохранение только одного

Из соображений здравого смысла/здравой практики форма регистрации просит пользователей дважды указать свой адрес электронной почты:

form->field('email_address'); ?>
form->field('verify_email_address'); ?>

Как я могу написать правило автоматической проверки, которое проверяет, что эти два поля формы имеют одно и то же значение, но сохраняет только адрес электронной почты в базе данных?

Похоже, что это почти тот же вопрос, что и выше, потому что список возможных ответов, который я могу придумать, тот же, поэтому я представляю это как один вопрос, но я был бы очень признателен за вашу помощь с обе части, так как я думаю, что решение этой будет тонким, отличающимся и в равной степени поучительным!

[РЕДАКТИРОВАТЬ: С этим тесно связана проблема с отсутствием сохранения verify_email_address в моей модели и БД]

Некоторые справочные материалы по Lithium

Я читал другие, но эти три руководства привели меня туда, где я есть. с пользователями и регистрационными формами сейчас...

Некоторые другие вопросы StackOverflow по тесно связанным темам (но без ответа на них, а также не относящиеся к Lithium)

  • Один из ответов на этот вопроспредлагает создать отдельный контроллер (и модель и...?) - мне он не кажется очень "литиевым", и я беспокоюсь, что он может быть хрупким/легко глючным
  • Эта замечательная историяубедила меня, что я был прав, беспокоясь о его установке контроллер, но я не уверен, что это было бы хорошим решением
  • Это на представленияхзаставляет меня думать, что я должен каким-то образом поместить его в модель, но я не знаю, как лучше всего сделать это в Литий (см. мой маркированный список в разделе «Дата ввода» выше)
  • И в этойпрезентации Scribd был задан вопрос, на который я надеюсь ответить на последней странице... после чего она остановилась, не ответив на него!

NB: ответы в стиле CakePHP тоже подходят. Я не знаю, но это похоже, и я уверен, что смогу перевести с него, если мне нужно!

8
задан Community 23 May 2017 в 11:52
поделиться