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

Отримання даних відбувається за допомогою 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;
}
}

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

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

Як тільки це буде зроблено, ми можемо додати меню зворотного виклику, використовуючи для цього 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» був підготовлений дружною командою проекту Сайтостроение від А до Я.