Как вывести форму в блок

11 июня 2014 - 12:57

Drupal 7 предоставляет веб-разработчикам мощное API по созданию и обработке форм, ознакомится со всеми возможностями Forms API можно здесь. Как правило, создавать собственные формы на сайте приходится в тех случаях, когда поставленные задачи не решаются с помощью модулей Webform или Entity Forms. В последующих статьях я обязательно буду приводить примеры использования Forms API Drupal, включая динамические формы с JavaScript и AJAX.

В данной статье я остановлюсь на решении простой, но нередко встречающейся задачи – как вывести форму в блоке в Drupal (подобный функционал реализован, например, в модуле Webform или модуле поиска ядра Друпала).

Создаем модуль и в файл *.module помещаем следующий код (не забудьте заменить MYMODULE на название модуля):

<?php

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 (эта функция может быть и в другом модуле).

В результате, включив этот простой модуль, мы увидим созданный нами блок в соответствующем разделе административной панели сайта и сможем поместить его в регион и указать настройки видимости подобно любым другим блокам (начальные настройки можно было задать сразу в коде, но это не выходит за рамки темы данной статьи).