При возникновении ошибок, во время проверки формы друпал выполняет две вещи, которые отражаются на фронт-энд — добавляет сообщение об ошибке в стек сообщений и маркирует классом error поле, содержащее ошибку.
Если форма находится далеко от места вывода списка сообщений, выглядит это совсем не юзер-френдли.
Здесь я хочу рассмотреть самый простой подход, когда вывод сообщений об ошибках формы переносится непосредственно к самой форме.
Я не собираюсь переносить вывод всех сообщений в шаблоне к форме, а только сообщения об ошибках, которые относятся к конкретной форме.
Момент захвата сообщений об ошибах
Ошибки в массив $_SESSION[‘messages’] добавляются в момент рендера формы. Т.е. перехват нужно произвести уже после кода вроде:
1 |
$myForm = drupal_get_form('formName'); |
В этот момент функция form_get_errors() начнет возвращать список ошибок формы, если они были найдены.
Убираем ошибки из стека сообщений
Сообщения drupal накапливает в массиве $_SESSION[‘messages’], и выяснить их происхождение нельзя, т.к. кроме самого текста ничего там нет. Чтобы удалить сообщения, относящиеся к форме, мы будем сравнивать список, полученный из form_get_errors() с тем, что хранит $_SESSION[‘messages’][‘error’].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$myForm = drupal_get_form($formName); // получим ошибки формы $er = form_get_errors(); $errorList = ''; if (!empty($er)) { // рендерим список ошибок стандартным шаблономё $errorList = theme_item_list(array( 'title' => NULL, 'items' => $er, 'type' => 'ul', 'attributes' => array('class' => 'errors') )); // убираем сообщения из стека foreach ($_SESSION['messages']['error'] as $k => $message) { if (in_array($message, $er)) { unset($_SESSION['messages']['error'][$k]); } } if (empty($_SESSION['messages']['error'])) { unset($_SESSION['messages']['error']); } } // теперь можно вывести форму и её ошибки print $errorList. myForm; |
Пример показывает как можно получить сообщения об ошибках формы и удалить их из общего списка.