}
function test_submit_second($form, &$form_state) {
drupal_set_message('Second submitter');
drupal_set_message('selectlist: ' . $form_state['values']['example_select']);
}
Здесь добавлен валидатор, который проверяет текст, введенный в текстовое поле; если его длина оказывается меньше трех символов, то генерируется сообщение об ошибке.
При создании форм всегда рекомендуется использовать не стандартные валидаторы и сабмиттеры, а объявлять их явно, так как в этом случае сторонние программисты смогут дополнить массивы #submit и #validate своими функциями. Если используются стандартные валидаторы и сабмиттеры, то сторонние программисты смогут только заменить существующие функции своими, а это не всегда удобно.
Signwriter. Часто бывает необходимо использовать в заголовке страницы или меню какой-либо экзотический шрифт, отсутствующий у большинства посетителей сайта. Модуль Signwriter генерирует картинки с текстом, написанным заданным шрифтом (шрифт предварительно должен был закачан на сервер). Через меню администратор может включить замену заголовков страниц и блоков созданными картинками, а через специальную функцию и вовсе можно заменить картинками любой текст.
Blocktheme. Не всегда удобно создавать и закачивать на сервер шаблоны под каждый используемый на сайте блок. Кроме того, реализованная в Drupal система масок имен для шаблонов не для всех задач бывает достаточно гибкой. Модуль Blocktheme позволяет через интерфейс управления блоками выбрать для каждого из них один из заранее созданных шаблонов.
Devel. Мощный инструмент в руках Drupal-разработчика. Разработчику тем оформления модуль Devel предоставляет информацию обо всех используемых для генерации страницы шаблонах и функциях темизации.
PNG Fix. Модуль, исправляющий проблему с непрозрачностью PNG-файлов в браузерах IE 5.5 и IE 6. Настраивается работа модуля через интерфейс администратора, изменение файлов темы оформления не требуется.
Теперь вернемся к основной теме статьи – темизации Drupal. Функция drupal_get_form, получив на вход $form_id, идентификатор формы, которую нужно вывести на экран, вызывает функцию form_builder, проверяющую права доступа текущего пользователя к каждому из полей формы, и при наличии этих прав выводит стандартный HTML-код для каждого элемента формы. Каждый созданный элемент формы имеет уникальный атрибут id. Самый простой способ переопределения внешнего вида элементов формы – создание CSS-файла с описанием стилей нужных элементов формы. Если этого недостаточно, элементам формы можно добавить параметры #prefix и #suffix, которые будут содержать HTML-код, выводимый до и после созданного элемента. Если и этого мало, можно определить параметр #theme, который должен содержать используемое имя функции темизации.
Персональные функции темизации можно задать для всей формы целиком или для каждого ее элемента. По умолчанию Drupal для темизации формы пробует найти функцию theme_form_id, поэтому использование параметра #theme не обязательно.
Все функции, определенные параметром #theme, должны быть также объявлены через hook_theme (описание этого хука было дано в предыдущей статье).
Давайте изменим внешний вид созданного текстового поля. Для этого сначала создадим реализацию хука hook_theme:
function название_модуля_theme() {
return array(
'example_text_field_theme_function' => array(
'arguments' => array('form' => NULL),
),
);
}
Затем модифицируем массив $form['example_text_field'], который создается в функции test_form, добавив в него параметр #theme:
$form['example_text_field'] = array(
'#type' => 'textfield',
'#title' => 'Example text field',
'#description' => 'Text must contain more then 3 symbols',
'#theme' => 'example_text_field_theme_function',
);
Теперь мы можем объявить функцию theme_example_text_field_theme_function и задать в ней любой HTML-код для отображения выбранного элемента:
function theme_example_text_field_theme_function($element) {
$class = '';
if(isset($element['#needs_validation'])) {
$class = ' error';
}
$output = '<div id='' . $element['#id'] . ''
class='form-item'><input id='edit-example-text-field'
class='form-text' . $class . '' name='' . $element['#name']
. ''></div>';
return $output;
}
Кроме того, эту функцию можно переопределить, не изменяя кода модуля. Для этого в файле template.php, который находится в папке с текущей темой оформления, нужно создать копию этой функции, заменив в ней префикс theme на имя текущей темы.
Если в реализации hook_theme использовать параметр template, например, так:
function название_модуля_theme() {
return array(
'example_text_field_theme_function' => array(
'arguments' => array('form' => NULL),
'template' => 'example-text-field',
),
);
}
то HTML-код, ответственный за отображение элемента Web-страницы в браузере, можно будет задавать не в исходном тексте функции темизации, а в отдельном файле-шаблоне с соответствующим именем; в нашем примере это example-text-field.tpl.php. Такой подход удобен, если с сайтом должны работать дизайнеры, не имеющие опыта Web-программирования.
Если же возникла необходимость изменить внешний вид всей формы, а не только отдельных ее элементов, нужно проделать то же самое: указать значение параметра #theme формы, объявить в hook_theme функцию темизации и, наконец, реализовать ее. Давайте внесем необходимые изменения в наш код. Функция hook_theme будет выглядеть следующим образом:
function название_модуля_theme() {
return array(
'test_form_theme_function' => array(
'arguments' => array('form' => NULL),
),
'example_text_field_theme_function' => array(
'arguments' => array('form' => NULL),
),