Пишем модуль, Form API в Drupal 7 (уровень 2.1). Часть 2

Сложность: 
2

Продолжение (см. Пишем модуль, Form API в Drupal 7 (уровень 2.1) часть 1) . В этой части статьи мы научимся тому, как правильно писать функцию проверки  к форме (валидации) а также функцию отправки  формы (сабмита1).

В первой части статьи (линк) мы приступили к изучению процедуры написания модуля с использованием базовых возможностями hook_menu. Также мы научились создавать форму, содержащую 2 элемента: “textfiled” (текстовое поле), “select” (выпадающий список)  с “submit” (кнопкой отправки формы). В данной части мы распишем валидацию нашей формы, а также, ее отправку.

Система Form API в Drupal 7 составлена довольно интересно. Для каждой формы есть возможность применять функции обработки - такие, например, как валидация (проверка) и сабмит (финальная функция). 

В функции валидации формы должны прописываться различные проверки. Если в функции валидации будет вызвана функция “form_set_error”, тогда функция отправки формы не будет запущена. Если же валидация у нас пройдена успешно, то есть вызванной функции “form_set_error” нет, тогда после валидации обязательно запуститься функция сабмита. 

Начинаться функция валидации, также как и функция сабмита, должна с названия функции формы, плюс в конце названия функции необходимо добавить соотвествующую приставку.

Пример: у нас есть функция, которая выводит форму с названием “calculator_page_form”, тогда функция валидации будет с именем “calculator_page_form_validate”, а функция сабмита будет называться “calculator_page_form_submit”.

Давайте составим функцию валидации и сабмита в модуле, написанном нами в предыдущий раз. Сама функция будет иметь следующий вид:

/**
 * Validate function for calculator_page_form.
 */
function calculator_page_form_validate($form, &$form_state) { }

/**
 * Submit function for calculator_page_form.
 */
function calculator_page_form_submit($form, &$form_state) { }

Обратите внимание на то, что функции уникальны, имеют соответственные приставки (“_validate” и “_submit”), и в них, также, доступны 2 аргумента - “$form” и “$form_state”.

Функции  написаны, но пока что они у нас не заполнены. Чтобы начать работать с представленными функциями в функциях валидации и сабмита, нам следует воспользоваться уже 2м аргументом, то есть переменной “form_state”. Отметим, что данная переменная содержит массив. Значения отправленных данных следует искать в ключе “values”. Например, если на валидации нам нужно взять число, которое было введено в поле “number”, тогда его следует искать здесь: “$form_state[‘values’][‘number1’]”.

Давайте опишем функцию валидации, с помощью которой нам предстоит проверять, введены числа или нет:

/** 
* Validate function for calculator_page_form.
*/
function calculator_page_form_validate($form, &$form_state) { if (!is_numeric($form_state['values']['number1'])) { form_set_error('number1', t('Value in field "Number 1" is wrong.')); } if (!is_numeric($form_state['values']['number2'])) { form_set_error('number2', t('Value in field "Number 2" is wrong.')); } }

Прописанные условия вполне обычны. Единственное, на что стоит особо обратить внимание, так это на функцию “form_set_error”. Первый аргумент функции указывает, какой элемент следует подсветить красным в случаи ошибки. Второй аргумент выводит сообщение об ошибке. Обратите внимание на то, что функция сабмита не заработает, если в функции валидации будет исполнятся функция “form_set_error”. Пример срабатывания валидации:

 

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

/** 
* Submit function for calculator_page_form.
*/
function calculator_page_form_submit($form, &$form_state) { $num1 = $form_state['values']['number1']; $num2 = $form_state['values']['number2']; switch ($form_state['values']['operator']) {       case 0:       $result = $num1 + $num2;       break;       default:       $result = $num1 - $num2;       break; } drupal_set_message(t('Result is @num', array('@num' => $result))); }

Здесь мы видим, что сначала идет переприсвоение результатов в отдельные переменные. Далее, относительно ключа значения массива оператора (но не самого значения!), производим сложение или вычитание чисел. Затем выводим сообщение с использованием функции “drupal_set_message”.

Архив с модулем можно скачать внизу, под статьей.

Вот мы и закончили. Нами написан модуль, отображающий все основные моменты Form API в Друпал 7. Усвоив и применяя в дальнейшем на практике изложенные выше приемы создания форм, проблем с их написанием у Вас не будет.

Рассказать друзьям: