Drupal 7 предоставляет веб-разработчикам мощное API по созданию и обработке форм, ознакомится со всеми возможностями Forms API можно здесь. Как правило, создавать собственные формы на сайте приходится в тех случаях, когда поставленные задачи не решаются с помощью модулей Webform или Entity Forms. В последующих статьях я обязательно буду приводить примеры использования Forms API Drupal, включая динамические формы с JavaScript и AJAX.
В данной статье я остановлюсь на решении простой, но нередко встречающейся задачи – как вывести форму в блоке в Drupal (подобный функционал реализован, например, в модуле Webform или модуле поиска ядра Друпала).
Создаем модуль и в файл *.module помещаем следующий код (не забудьте заменить MYMODULE на название модуля):
function MYMODULE_block_info() {
$blocks = array();
$blocks['custom_form_block'] = array(
'info' => t('Block description'),
);
return $blocks;
}
function MYMODULE_block_view($delta = '') {
if ($delta == 'custom_form_block') {
$block['subject'] = t('My form');
$block['content'] = drupal_get_form('MYMODULE_form');
}
return $block;
}
function MYMODULE_form($form, &$form_state) {
// Создадим простую форму с полем ввода и кнопкой отправки
$form['textfield'] = array(
'#type' => 'textfield',
'#title' => t('Input text'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
function MYMODULE_form_submit($form, &$form_state) {
// Обработчик для нашей формы, в данном примере он пустой,
// после отправки формы произойдет просто перезагрузка страницы
}
Краткие пояснения к коду: с помощью хуков hook_block_info() и hook_block_view() мы вначале создали блок. Обратите внимание, что из хука hook_block_info() возвращается массив, т.е. при необходимости в этом хуке мы могли бы определить не один, а несколько блоков. В функции MYMODULE_block_view мы указали, что содержимым блока будет являться форма, а функция-конструктор этой формы называется MYMODULE_form (эта функция может быть и в другом модуле).
В результате, включив этот простой модуль, мы увидим созданный нами блок в соответствующем разделе административной панели сайта и сможем поместить его в регион и указать настройки видимости подобно любым другим блокам (начальные настройки можно было задать сразу в коде, но это не выходит за рамки темы данной статьи).