На сьогоднішній день, оскільки в процесі роботи людям доводиться приймати й обробляти велику кількість даних, веб-додатки стали невід’ємною частиною майже всіх галузей економіки.

Отримання даних відбувається за допомогою HTML-форм, які можна використовувати для створення різних типів полів для введення, наприклад, таких як «текстові поля», «перемикачі» та інше – для цього використовуються HTML-теги.

Ці форми важко зберігати або оновлювати, якщо вони записуються безпосередньо в HTML-коді. Drupal пропонує відмінний спосіб задавати форми безпосередньо через PHP-код, а система самостійно генерує кінцеві форми.

Завдяки цьому Drupal полегшує вам роботу по створенню та підтримці форм. В даній статті ми будемо розглядати, як можна створювати форми зв’язку в Drupal. Остаточний код ви можете скопіювати з Github.

Функція drupal_get_form — генерація форм в Drupal

Вся магія утворення форм в Drupal заснована на функції drupal_get_form. Результати цієї функції відображають форму масиву в системі Drupal.

Вона приймається в якості аргументу form_id: унікальний ідентифікатор для визначення форми, і, якщо функція на виході виходить з тим же ім’ям, тоді викликається функція для її побудови. Більше інформації про функції drupal_get_form ви можете отримати тут.

Створення базової форми в Drupal

Давайте почнемо з створення невеликого модуля, який буде генерувати меню зворотного виклику, а потім у цьому меню зворотного виклику створимо форму за допомогою функції drupal_get_form. Щоб створити модуль, необхідно в папці, де встановлено Drupal, створити додаткову директорію sitesallmodulesdrupalform і додати сюди два файла: drupalform.info і drupalform.module з наступним кодом:

drupalform.info

name = drupalform
description = This module creates a form using Drupal.
core = 7.x

drupalform.module

‘. t(‘About’) . ‘

‘;
$output .= ‘

‘. t(‘The drupalform module shows how to create forms using Drupal.’) . ‘

‘;
return $output;
}
}

За допомогою вищевказаного коду ви зможете побачити свій модуль у списку доступних модулів та отримайте можливість включити його, як це показано на малюнку нижче.

Як тільки це буде зроблено, ми можемо додати меню зворотного виклику, використовуючи для цього hook_menu, і створимо форму на цій сторінці. Наш код буде виглядати наступним чином:

/**
* Implementation of hook_menu().
*/
function drupalform_menu() {
$items[‘drupalform/form1’] = array(
‘type’ => MENU_CALLBACK,
‘access arguments’ => array(‘доступ до контенту’),
‘page callback’ => ‘drupal_get_form’,
‘page arguments’=>array(‘drupalform_form1’));
return $items;
}
function drupalform_form1() {
$form = array();
$form[‘name’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше ім’я’),
‘#description’=>t(‘Ваше ім’я йде сюди’)
);
$form[‘last_name’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше прізвище’),
‘#description’=>t(‘Ваша прізвище йде сюди’)
);
$form[’email’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваш e-mail’),
‘#description’=>t(‘Ваш e-mail йде сюди’)
);
$form[‘country’]=array(
‘#type’=>’select’,
‘#title’=>t(‘Виберіть вашу країну’),
‘#options’=>array(‘США’,’Великобританія’,’Франція’,’Японія’)
);
$form[‘submit’]=array(
‘#type’=>’submit’,
‘#value’=>t(‘Відправити’)
);
return $form;
}

У наведеному вище коді, реалізуючи hook_menu, ми створили пункт меню, для якого значенням page_callback є drupal_get_form, а аргументом для нього буде form_id «drupalform_form1«. Функція drupalform_form1 повертає масив форм, який ми маємо намір створити.

У функції drupalform_form1 ми створюємо три текстових поля: ім’я (name), прізвище (last name), адреса електронної пошти (email) і один блок для вибору країни. У випадаючому вікні блоку ми вказуємо варіанти країн. Крім цього, ми додали кнопку «Відправити», щоб користувач зумів нарешті, відправити форму.

Тепер, у вас повинно вийти зайти в своє меню за адресою: /drupalform/form1 і побачити форму, яка буде виглядати наступним чином:

Форми вводу даних Drupal

Перевірка форми Drupal

В Drupal важко використовувати правила іменування для визначення того, які функції повинні бути звернені до яких подій. Вся система Drupal заснована на угоді в питанні іменування.

Аналогічним чином, функція, викликана для перевірки даних форми, повинна слідувати правилам іменування: _validate, і вона буде пропущена form_state в якості змінної.

Таким чином, для нашої форми функція імені буде виглядати як:

drupalform_form1_validate($form, $form_state)

Значення, які користувач ввів, будуть представлені в масив $form_state[‘значення’], і будуть збігатися з ідентифікатором, який був вказаний вами у формі.

Таким чином, якщо ми повинні провести перевірку нашої форми, функція буде наступною:

function drupalform_form1_validate($form, $form_state) {
if(empty($form_state[‘values’][‘name’]))
form_set_error(‘name’,’Name cannot be empty’);
else if(empty($form_state[‘values’][‘last_name’]))
form_set_error(‘last_name’,’Last name cannot be empty’);
else if(filter_var($form_state[‘values’][’email’], FILTER_VALIDATE_EMAIL) == false)
form_set_error(’email’,’Email is not valid’);

У наведеній вище функції ми перевіряємо, чи заповнені поля з іменем та прізвищем, а також є вказану адресу email чинним. На випадок, якщо ці умови не виконані, ми задаємо у формі помилку, використовуючи для цього функцію Drupal form_set_error.

На екрані буде відображатися повідомлення про помилки і форма не буде відправлено.
Якщо ви відправите форму, залишивши поле імені порожнім, на екрані у вас повинно з’явитися таке повідомлення про помилку:

Форми вводу даних Drupal

Відправка форм Drupal

Аналогічно функції перевірки, функція надіслати (submit) також заснована на правилах іменування і ім’я функції повинно бути: _submit. Знову ж таки, змінна $form_state буде передана їй. Таким чином, наша функція відправки буде визначена як:

f

unction drupalform_form1_submit($form, $form_state) {
//В залежності від типу форми ви можете додати алгоритм
//для зберігання відомостей про форму
//шляхом його додавання в таблицю Drupal.
//або надсилання листа адміністратору
//Запис в файл
//або передати в яке-небудь іншу службу
drupal_set_message(«Форма була відправлена»);
}

Тепер, якщо ми заповнили всі поля належним чином, то отримуємо на екрані наступне повідомлення:

Форми вводу даних Drupal

Використовуючи поля, ви можете встановити в формах Drupal окремі елементи.

Іноді, коли форма великого розміру, і в ній є багато полів, може бути корисно розбити її на невеликі секції, щоб вона представлялася користувачеві більш логічною. Для реалізації подібного рішення, ви можете сформувати об’єднання полів (fieldsets) в Drupal, щоб створити групи полів.

Щоб створити об’єднання полів з назвою basicdetails, яке міститиме поля, які ми вже визначили вище, нам потрібно буде оновити drupalform_form1 наступним чином:

function drupalform_form1() {
$form = array();
$form[‘basicdetails’]=array(
‘#type’=>’fieldset’,
‘#title’=>t(‘Введіть основні дані нижче’),
‘#description’=>t(‘Це є обов’язковою’)
);
$form[‘basicdetails’][‘name’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше ім’я’),
‘#description’=>t(‘Ваше ім’я напишіть тут’)
);
$form[‘basicdetails’][‘last_name’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше прізвище’),
‘#description’=>t(‘Ваше прізвище напишіть тут’)
);
$form[‘basicdetails’][’email’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваш email’),
‘#description’=>t(‘Ваш email напишіть тут’)
);
$form[‘submit’]=array(
‘#type’=>’submit’,
‘#value’=>t(‘Відправити’)
);
return $form;
}

Це дозволить створити об’єднання декількох полів, як показано нижче:

Форми вводу даних Drupal

Різні елементи форм, які можуть бути використані у формах Drupal

Drupal підтримує дуже багато різних типів полів, які ми можемо використовувати в наших формах. Я оновлю форми з нашого прикладу, щоб використовувати деякі з них, створивши ще два об’єднання полів для більш докладного адреси і додаткових деталей.

Оновлений код наведений нижче:

function drupalform_form1() {
$form = array();
$form[‘basicdetails’]=array(
‘#type’=>’fieldset’,
‘#title’=>t(‘Введіть основні деталі нижче’),
‘#description’=>t(‘Ці поля є обов’язковими’)
);
$form[‘basicdetails’][‘name’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше ім’я’),
‘#description’=>t(‘Ваше ім’я впишіть тут’)
);
$form[‘basicdetails’][‘last_name’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше прізвище’),
‘#description’=>t(‘Ваше прізвище напишіть тут’)
);
$form[‘basicdetails’][’email’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваш email’),
‘#description’=>t(‘Ваш email напишіть тут’)
);
$form[‘addressdetails’]=array(
‘#type’=>’fieldset’,
‘#title’=>t(‘Введіть ваш докладний адресу нижче’),
‘#description’=>t(‘Це поле є обов’язковим’)
);
$form[‘addressdetails’][‘country’]=array(
‘#type’=>’select’,
‘#title’=>t(‘Виберіть вашу країну’),
‘#options’=>array(‘США’,’Великобританія’,’Франція’,’Японія’)
);
$form[‘addressdetails’][‘city’]=array(
‘#type’=>’textfield’,
‘#title’=>t(‘Введіть ваше місто’),
‘#description’=>t(‘Назва вашого міста введіть тут’)
);
$form[‘addressdetails’][‘localaddress’]=array(
‘#type’=>’textarea’,
‘#title’=>t(‘Введіть вашу адресу’),
‘#description’=>t(‘Ваша адреса впишіть тут’)
);
$form[‘additionaldetails’]=array(
‘#type’=>’fieldset’,
‘#title’=>t(‘Введіть іншу інформацію про себе нижче’),
‘#description’=>t(‘Це необов’язкове поле’)
);
$form[‘additionaldetails’][‘gender’]=array(
‘#type’=>’radios’,
‘#title’=>t(‘Підлога’),
‘#options’=>array(‘Чоловічий’,’Жіноча’)
);
$form[‘additionaldetails’][‘suscribtion’]=array(
‘#type’=>’checkboxes’,
‘#title’=>t(‘Я хочу підписатися на’),
‘#options’=>array(‘Email-розсилку’,’Інші пропозиції’)
);
$form[‘additionaldetails’][‘birthdate’]=array(
‘#type’=>’date’,
‘#title’=>t(‘Дата народження’),
);
$form[‘#attributes’][‘enctype’] = ‘multipart/form-data’;
$form[‘additionaldetails’][‘picture’]=array(
‘#type’=>’файл’,
‘#title’=>t(‘Завантажте своє фото’),
);
$form[‘submit’]=array(
‘#type’=>’submit’,
‘#value’=>t(‘Відправити’)
);
return $form;
}

Ось як буде виглядати новий набір полів для введення:

Форми вводу даних Drupal

Висновок

Drupal допомагає створювати і обробляти форми безпосередньо всередині вашого модуля. API-інтерфейси Drupal дозволяють робити це дуже просто – можна зробити доповнення або модифікацію вашої форми у вигляді масиву форм. Також можна провести валідацію і відправку в різних функціях.

Такий модульний підхід зберігає код форми всередині вашого модуля чистим і простим в обслуговуванні. Крім того, якщо ви використовуєте форму Drupal API, вам не потрібно возитися з HTML-деталями форми: всі HTML-коди генеруються автоматично.

Всього вам найкращого, коли будете створювати наступний перелік заповнюваних форм у вашому Drupal модулі!

Якщо ви хочете, щоб ми розглянули який-небудь конкретний випадок або роз’яснили якісь нюанси, або ж ви просто хочете висловитися — відпишіться в коментарях.

Переклад статті «Understanding Forms in Drupal» був підготовлений дружною командою проекту Сайтостроение від А до Я.