Как известно валидация (проверка) данных формы состоит из двух повторяющих друг друга этапов:
1. проверка на клиенте возможностями javascript и/или браузера+HTML5
2. проверка на сервере
При
валидации на клиенте мы можем красиво выводить пользователю подсказки, подсвечивать ошибочные поля и всячески вести его к заветной цели - отправке формы.
Да, сейчас практически у всех современные браузеры и включен JS, но это не повод полагаться только на них и бросать на произвол судьбы тех, у кого JS не работает.
Посмотрим, что происходит на стороне серевера (рассомтрим стандартный task mycontroller.save:
1. Контроллер
mycontroller (extends
JControllerForm) в методе
mycontroller->save() получает данные из запроса вызывает метод проверки этих данных в модели
mymodel(extends
JModelAdmin extends
JModelForm)
$model = $this->getModel();
$form = $model->getForm($data, false);
$validData = $model->validate($form, $data);
2. метод модели validate() вызывает методы JForm фильтрации и валидации данных
$data = $form->filter($data);
$return = $form->validate($data, $group);
3. Метод JForm->validate() последовательно прогоняет все поля формы через проверку
$valid = $this->validateField($field, $group, $value, $input);
// Check for an error.
if ($valid instanceof Exception){
array_push($this->errors, $valid);
$return = false;
}
и возвращается по цепочке в контроллер либо массив отфильтрованных данных, либо false - что означает, что какое-то поле / несколько полей не прошли проверку.
Информация, об ошибках проверки всех полей возвращается только в виде массива
$errors = $model->getErrors();
В котором хранятся текстовые сообщения вида "
Требуется поле: {Label} поля"
4. Пользователь возвращается на страницу формы с Warning Message о незаполненных полях.
Если форма больше 4-х полей и ошибки в нескольких полях сразу, возникает проблема - найти нужные поля и после понять что в них не так.
Штатных средств выделить поля с ошибками при возвращении на страницу формы я не нашел.
Вариантов решения проблемы вижу два:
1. Попытаться распарсить сообщения системы и по вхождению label поля их выделить. Делать это надо во View, но обращение к массиву
JFactory::getApplication()->getMessageQueue();
Приводит к его обнулению. Т.е. сразу придется брать на себя и дальнейшую обработку сообщений системы.
2. Перегрузить метод $model->validate() таким образом, что бы он самостоятельно валидировал данные, например, посылал поля на JForm->validateField($field, $group, $value, $input) и таким образом иметь возможность контроля каждого поля.
Но оба варианта замедляют разработку и создают потенциальные проблемы.
Занимался ли кто-нибудь подобной проблемой, есть ли более удобные пути?