Pull to refresh

Drupal Forms API. Часть 2 — для Drupal 7

Reading time2 min
Views16K

Вторая часть статьи содержит отличия, свойственные Drupal Forms API для версии 7. Эта часть статьи публикуется как открытый топик, видный не только подписчикам блога Drupal. Но свои дальнейшие статьи (по созданию тем) буду публиковать как закрытые статьи блога, чтобы не мешать тем, кому Drupal не интересен.

В прошлой статье, мы разобрали функционал простого модуля, который возвращал введенное имя в форму при помощи AJAX (именуемого в Друпале 6 «AHAH»). Теперь очередь версии 7.



1. Наиболее интересные изменения в API Друпала 7


  • В Друпал 7, изменились info-файлы. Теперь, любые файлы с php кодом, включаемые в модуль (inc и test файлы), нужно объявлять info-файле. В нашем случае, таковых нет.
  • Изменился способ обработки AJAX. Теперь не обязательно задавать путь для обработки через hook_menu, в можно сразу указать callback-функцию.
  • Путь обработки запросов теперь системный — /system/ajax.
  • Изменилась обработка форм. Теперь, callback-функция получает две переменные — массив формы и указатель на состояние формы.


2. Изменения в коде формы


Изменения в коде формы незначительны. Принципы Drupal Forms API остались те же.
/* FC Form */
// Теперь функция создания формы тоже принимает две переменные (это нужно при обработке формы, например, для генерации многостраничных форм)
function fc_form($form, &$form_state) {
  $form = array(); 
  $form['name'] = array(
    '#type' => 'textfield',
    '#description' => 'Your name',
    '#size' => '15',
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
    // Элемент теперь называется ajax
    '#ajax' => array(
      // Вместо пути теперь указывается callback-функция
      'callback' => 'fastcontact_ajax',
      'wrapper' => 'fc-form',   
    ),
  );
 return $form;
} 


2. Изменения в коде обработки запроса


// Эта callback-функция получает два параметра. Массив формы и массив с ее состоянием
function fastcontact_ajax($form, &$form_state) {
  // Извлекаем значение элемента name из массива values массива form_state
  $name=$form_state['values']['name'];
  // И добавляем к существующей форме элемент markup с выводимым значением.
  $form['result'] = array(
    '#markup' => 'Вы ввели имя <b>'.$name.'</b>',
  );
  return $form;
}


Значение массива $form_state — довольно большое. Там хранятся все данные о форме и ее состоянии. Оттуда мы и берем значение нашего поля name.

Если в Друпале 6 мы отсылали текст, который отображался в случае успеха, через drupal_json(), то в Друпале 7 мы пересобираем форму и добавляем к ней элемент markup. Markup служит для вывода html-разметки в форму. Этот элемент существовал и в 6 версии Друпала — но в 7 версии его синтаксис изменился.

Теперь, нам осталось отобразить форму. Мы можем сделать это стандартным кодом из прошлой статьи.
function render_fc_form() {
  $out  = '<div id="fc-form-wrapper">';
  $out .= drupal_render(drupal_get_form('fc_form'));
  $out .= '</div><!-- /.fc-form-->';
  return $out;
}


Обратите внимание, что в Друпале 7 гораздо больше изменений API. Вот список изменений, произведенных в API Друпала после 6 версии, касающиеся написания модулей (для тем, отдельный список).

Скачать архив с целым модулем
Tags:
Hubs:
+28
Comments14

Articles

Change theme settings