$form['example_select'] = array(
'#type' => 'select',
'#title' => 'Example select list',
'#options' => $options,
'#description' => t('You can select only value 'one' in this
form'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
Приведенная выше функция генерирует форму, состоящую из текстового поля, выпадающего списка с тремя элементами и кнопкой для отправки данных. Имя этой функции – ее уникальный идентификатор ($form_id), который будет использоваться для отображения и изменения данной формы сторонними модулями. Чтобы вывести форму на экран, нужно через hook_menu создать страницу, где будет вызвана функция drupal_get_form, принимающая в качестве параметра $form_id формы, которая должна быть отображена на экране:
function имя_модуля_menu() {
$items = array();
$items['test-form'] = array(
'title' => 'Test form',
'page callback' => 'test_form_page',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function test_form_page() {
return drupal_get_form('test_form');
}
В массиве, возвращаемом функцией test_form($form_state), не определены процедуры проверки значений и заполнения полей (структур), поэтому ядро Drupal после нажатия на форме кнопки Submit попробует найти и выполнить функции form_id_validate и form_id_submit. В нашем случае, как легко догадаться, это будут функции с именами test_form_validate и test_form_submit:
function test_form_validate($form, &$form_state) {
if($form_state['values']['example_select'] != 1) {
form_set_error('example_select', t('You must select value
'one' in select list :)'));
}
}
function test_form_submit($form, &$form_state) {
drupal_set_message('Form sumitted! Values:');
drupal_set_message('textbox: ' .
$form_state['values']['example_text']);
drupal_set_message('selectlist: ' .
$form_state['values']['example_select']);
}
Функция-валидатор проверяет выбранное в выпадающем списке значение и, если оно не one, посылает сообщение об ошибке с указанием, какой элемент формы вызвал ошибку. Функция-сабмиттер выводит на экран введенные пользователем значения. В реальном случае эта функция должна будет сохранить данные в базе данных.
При желании программист может в массиве $form функции test_form задать свойство #submit, содержащее массив обработчиков значений и свойство #validate с массивом валидаторов (см. листинг 4). Зеленым цветом выделены строки, добавленные к ранее описанным функциям. Код модуля также дополнится функциями из листинга 5.
function test_form($form_state) {
$form['example_text_field'] = array(
'#type' => 'textfield',
'#title' => 'Example text field',
'#description' => 'Text must contain more then
3 symbols',
);
$options = array(
0 => 'zero',
1 => 'one',
2 => 'two',
);
$form['example_select'] = array(
'#type' => 'select',
'#title' => 'Example select list',
'#options' => $options,
'#description' => t('You can select only value 'one'
in this form'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
$form['#validate'] = array('test_validate_first',
'test_validate_second');
$form['#submit'] = array('test_submit_first',
'test_submit_second');
return $form;
}
function test_validate_first($form, &$form_state) {
if(mb_strlen($form_state['values']['example_text_field']) < 3) {
form_set_error('example_text_field', t('Text must contain more then 3 symbols'));
}
}
function test_validate_second($form, &$form_state) {
if($form_state['values']['example_select'] != 1) {
form_set_error('example_select', t('You must select value 'one' in select list :)'));
}
}
function test_submit_first($form, &$form_state) {
drupal_set_message('First submitter');
drupal_set_message('textbox: ' . $form_state['values']['example_text']);