Статьи

Понимание форм в Drupal

Сегодня веб-приложения используются во всех отраслях промышленности. Они должны принимать и обрабатывать много пользовательских данных. Захват данных происходит через формы HTML, которые позволяют создавать различные типы полей ввода, такие как текстовые поля, переключатели и т. Д., Используя теги HTML. Эти формы трудно поддерживать или обновлять, если они написаны непосредственно в коде HTML. Drupal предоставляет очень хороший способ определения форм непосредственно в вашем PHP-коде, тогда как генерация форм осуществляется самим Drupal. Это позволяет вам легко создавать и поддерживать формы. В этой статье мы рассмотрим, как мы можем создавать формы в Drupal. Окончательный код может быть клонирован из Github .

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

Вся магия создания форм в Drupal выполняется функцией drupal_get_form . Эта функция возвращает отображаемый массив форм в систему Drupal. Он принимает аргумент в качестве form_id: уникальный идентификатор для идентификации формы, и если выходит функция с тем же именем, то эта функция вызывается для ее создания. Вы можете прочитать больше о drupal_get_form по ссылке https://api.drupal.org/api/drupal/includes!form.inc/function/drupal_get_form/7.

Создание базовой формы в Drupal

Давайте начнем с создания небольшого модуля, который будет создавать обратный вызов меню, а затем на этом drupal_get_form меню создадим форму, используя функцию drupal_get_form . Чтобы создать модуль, добавьте папку на свои sites\all\modules\drupalform установки Drupal sites\all\modules\drupalform и добавьте в нее два файла: drupalform.info и drupalform.module со следующим кодом:

drupalform.info

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

drupalform.module

 <?php /** * @file * This is the main module file. */ /** * Implements hook_help(). */ function drupalform_help($path, $arg) { if ($path == 'admin/help#rupalform') { $output = '<h3>' . t('About') . '</h3>'; $output .= '<p>' . t('The drupalform module shows how to create forms using Drupal.') . '</p>'; return $output; } } 

С помощью приведенного выше кода вы сможете увидеть свой модуль в списке доступных модулей и включить его, как показано ниже. Если эти шаги кажутся загадочными или сложными, пожалуйста, ознакомьтесь с моим последним уроком для хорошего введения в модуль Drupal

Как только мы это сделаем, мы добавим обратный вызов меню с помощью hook_menu и создадим форму на странице. Код для этого выглядит следующим образом

 /** * Implementation of hook_menu(). */ function drupalform_menu() { $items['drupalform/form1'] = array( 'type' => MENU_CALLBACK, 'access arguments' => array('access content'), 'page callback' => 'drupal_get_form', 'page arguments'=>array('drupalform_form1')); return $items; } function drupalform_form1() { $form = array(); $form['name']=array( '#type'=>'textfield', '#title'=>t('Enter your name'), '#description'=>t('Your first name goes here') ); $form['last_name']=array( '#type'=>'textfield', '#title'=>t('Enter your Last name'), '#description'=>t('Your Last name goes here') ); $form['email']=array( '#type'=>'textfield', '#title'=>t('Enter your email'), '#description'=>t('Your email goes here') ); $form['country']=array( '#type'=>'select', '#title'=>t('Select your country'), '#options'=>array('USA','UK','France','Japan') ); $form['submit']=array( '#type'=>'submit', '#value'=>t('Submit') ); return $form; } 

В приведенном выше коде в реализации hook_menu мы создаем пункт меню, для которого page_callback равен drupal_get_form а аргументом является form_id «drupalform_form1». Функция drupalform_form1 возвращает массив форм, который мы хотим создать.

В функции drupalform_form1 мы создаем три текстовых поля: имя, фамилия, адрес электронной почты и одно поле выбора для страны. В поле выбора мы указываем параметры страны с массивом. Мы также добавили кнопку «Отправить», чтобы пользователь мог отправить форму. Теперь вы сможете перейти к URL-адресу вашего меню: <your drupal base url>/drupalform/form1 и увидеть следующую форму

Подтверждение формы Drupal

Drupal активно использует соглашения об именах, чтобы определить, какие функции и какие события вызывать. Полная система ловушек Drupal основана на соглашениях об именах. Аналогично, функция, вызываемая для проверки данных формы, должна соответствовать соглашению об именах <form_id>_validate и ей будет передано form_state в качестве переменной.

Следовательно, для нашей формы имя функции будет:
drupalform_form1_validate($form, $form_state) .

$form_state['values'] будут представлены в массиве $form_state['values'] с тем же идентификатором, который вы указали в форме. Так что если мы должны сделать проверки для нашей формы, функция будет:

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

В приведенной выше функции мы проверяем, не являются ли имя и фамилия не пустыми и что адрес электронной почты действителен. Если это не так, мы устанавливаем ошибку формы, используя функцию Drupal form_set_error . Это отобразит ошибку пользователю, и форма не будет отправлена.

Если вы отправите форму, введя пустое имя, вы должны увидеть следующую ошибку на экране:

Отправка формы Drupal

Подобно функции проверки, функция submit также вызывается в соответствии с соглашением об именах, и имя функции должно быть <form_id>_submit . Опять же, переменная $form_state будет передана ему. Таким образом, наша функция отправки будет определена как:

 function drupalform_form1_submit($form, $form_state) { //Depending on the type of form you can add the logic //to store the details of the form //by adding it in a Drupal table. //or sending a mail to the admin //Storing in a file //or pass it to some other service drupal_set_message("Form has been submitted"); } 

Теперь, если мы пропустим все действительные поля, вы получите следующее сообщение на экране.

Использование наборов полей в Drupal Forms для разделения элементов.

Иногда, когда форма больше и имеет много полей, вы можете разбить ее на маленькие секции, чтобы форма выглядела более логичной для пользователя. Для этого вы можете создать наборы полей в Drupal для создания групп полей.

Чтобы создать набор basicdetails под названием basicdetails для хранения полей, которые мы определили выше, нам нужно обновить drupalform_form1 следующим образом

 function drupalform_form1() { $form = array(); $form['basicdetails']=array( '#type'=>'fieldset', '#title'=>t('Enter your Basic details below'), '#description'=>t('These are all madatory') ); $form['basicdetails']['name']=array( '#type'=>'textfield', '#title'=>t('Enter your name'), '#description'=>t('Your first name goes here') ); $form['basicdetails']['last_name']=array( '#type'=>'textfield', '#title'=>t('Enter your Last name'), '#description'=>t('Your Last name goes here') ); $form['basicdetails']['email']=array( '#type'=>'textfield', '#title'=>t('Enter your email'), '#description'=>t('Your email goes here') ); $form['submit']=array( '#type'=>'submit', '#value'=>t('Submit') ); return $form; } 

Это создаст отдельный набор полей, как показано ниже

Различные элементы формы, которые можно использовать в формах Drupal

Drupal предоставляет множество различных типов полей, которые мы можем использовать в наших формах. Я обновлю нашу форму, чтобы использовать некоторые из них, создав еще два набора полей для деталей адреса и дополнительных деталей.
Обновленный код ниже:

 function drupalform_form1() { $form = array(); $form['basicdetails']=array( '#type'=>'fieldset', '#title'=>t('Enter your Basic details below'), '#description'=>t('These are all madatory') ); $form['basicdetails']['name']=array( '#type'=>'textfield', '#title'=>t('Enter your name'), '#description'=>t('Your first name goes here') ); $form['basicdetails']['last_name']=array( '#type'=>'textfield', '#title'=>t('Enter your Last name'), '#description'=>t('Your Last name goes here') ); $form['basicdetails']['email']=array( '#type'=>'textfield', '#title'=>t('Enter your email'), '#description'=>t('Your email goes here') ); $form['addressdetails']=array( '#type'=>'fieldset', '#title'=>t('Enter your Address details below'), '#description'=>t('These are all madatory') ); $form['addressdetails']['country']=array( '#type'=>'select', '#title'=>t('Select your country'), '#options'=>array('USA','UK','France','Japan') ); $form['addressdetails']['city']=array( '#type'=>'textfield', '#title'=>t('Enter your city'), '#description'=>t('Your city name goes here') ); $form['addressdetails']['localaddress']=array( '#type'=>'textarea', '#title'=>t('Enter address'), '#description'=>t('Your Address name goes here') ); $form['additionaldetails']=array( '#type'=>'fieldset', '#title'=>t('Enter your other details below'), '#description'=>t('These are all optional') ); $form['additionaldetails']['gender']=array( '#type'=>'radios', '#title'=>t('Gender'), '#options'=>array('Male','Female') ); $form['additionaldetails']['suscribtion']=array( '#type'=>'checkboxes', '#title'=>t('I want to subscribe for'), '#options'=>array('Email newsletter','Offer vouchers') ); $form['additionaldetails']['birthdate']=array( '#type'=>'date', '#title'=>t('Birthdate'), ); $form['#attributes']['enctype'] = 'multipart/form-data'; $form['additionaldetails']['picture']=array( '#type'=>'file', '#title'=>t('Upload your picture'), ); $form['submit']=array( '#type'=>'submit', '#value'=>t('Submit') ); return $form; } 

Вот как выглядят новые наборы полей:

Вывод

Drupal помогает вам создавать и обрабатывать формы прямо внутри вашего модуля. API-интерфейсы, предлагаемые Drupal, упрощают добавление или изменение формы, поскольку формы являются массивами, и даже проверка и отправка выполняются в другой функции. Этот модульный подход обеспечивает чистоту и простоту обслуживания кода формы в вашем модуле. Вам также не нужно беспокоиться о деталях HTML формы, если вы используете API формы Drupal — весь HTML генерируется автоматически. Получайте удовольствие, создавая следующую форму в своем модуле Drupal!

Если вы хотите, чтобы мы рассмотрели более конкретный вариант использования, или попали в подробности, или просто оставили отзыв, сообщите нам об этом в комментариях ниже!