Читать «Журнал PC Magazine/RE №11/2009» онлайн - страница 96

PC Magazine/RE

• любой разработчик может добавить или удалить элементы в форме, созданной другим разработчиком, не меняя ее исходного кода;

• любой разработчик может добавить дополнительные функции проверки и обработки введенных пользователем данных без изменения исходной формы;

• формы, созданные с использованием Forms API, защищены от атак, связанных с отправкой пользователем модифицированной формы;

• любой разработчик может изменить внешний вид формы, не изменяя ее исходного кода.

Каждая форма в Drupal представляет собой функцию, возвращающую ассоциативный массив. Этот массив должен содержать информацию обо всех элементах формы, функциях проверки (валидаторы, validators) и обработки (сабмиттеры, submitters) введенных данных. Данная функция должна быть расположена в файле модуля, о разработке модуля говорилось в статье, опубликованной в PC Magazine/RE, 9/2009.

Рассмотрим простой пример.

function test_form($form_state) {

  $form["example_text_field"] = array(

    '#type' => 'textfield',

    '#title' => 'Example text field',

  );

  $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'),

  );

  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']);

}