$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.

Листинг 4

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;

}

Листинг 5

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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату