• урок
  • pantey

Form API – часть 2. Функции валидации и обработки формы.

27.11.2014

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

Функция обработки формы

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

Для того, что бы наша кнопка заработала необходимо изменить callback нашей страницы на функцию:

  1. drupal_get_form

а функцию

  1. myform_form

передать странице в качестве аргумента, т.е функция

  1. myform_menu

должна принять следующий вид

  1. <?php
  2. function myform_menu(){
  3. $items = array();
  4. $items['myform'] = array(
  5. 'title' => 'Form API',
  6. 'page callback' => 'drupal_get_form',
  7. 'page arguments' => array('myform_form'),
  8. 'access callback' => TRUE
  9. );
  10. return $items;
  11. }

Чистим кеш Drupal, и видим, что после нажатия на кнопку отправки формы у нас перезагружается страница.

Теперь напишем функцию, которая будет обрабатывать введенные пользователем данные, за это отвечает хук:

  1. hook_form_submit

В нашем случае, данная функция будет выглядеть так:

  1. <?php
  2. /**
  3.  * Callback submit
  4.  * Implements hook_form_submit
  5.  */
  6. function myform_form_submit(){
  7. drupal_set_message('Hi people');
  8. }

Опять же чистим кеш Drupal, и жмем на кнопку отправить

Получили сообщение после нажатия на кнопку отправки формы

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

Теперь, через данную функцию мы может обрабатывать значения, которые будет вводить пользователь. Для того, что бы принимать вводимые значения пользователей, нам необходимо передать 2 параметра (переменные $form, $form_state) в функцию формы и функцию обработки формы, в результате функции формы и обработки примут следующий вид:

  1. <?php
  2. /**
  3.  * Callback myform
  4.  */
  5. function myform_form($form, &$form_state) {
  6. // Описали первое текстовое поле
  7. $form['onetextfield'] = array(
  8. '#type' => 'textfield', // тип поля
  9. '#title' => t('первое текстовое поле'), // заголовок поля
  10. );
  11.  
  12. // Описали второе текстовое поле
  13. $form['twotextfield'] = array(
  14. '#type' => 'textfield', // тип поля
  15. '#title' => t('второе текстовое поле'), // заголовок поля
  16. );
  17.  
  18. // Описали кнопку отправки форму
  19. $form['submit'] = array(
  20. '#type' => 'submit', // тип поля
  21. '#value' => t('отправить форму'), // текст кнопки формы
  22. );
  23. return $form;
  24. }
  25.  
  26. /**
  27.  * Callback submit
  28.  * Implements hook_form_submit
  29.  */
  30. function myform_form_submit($form, &$form_state){
  31. $output = 'Первое текстовое поле - ' .$form_state['values']['onetextfield'] .'<br>';
  32. $output .= 'Второе текстовое поле - ' .$form_state['values']['twotextfield'];
  33. drupal_set_message($output);
  34. }

После чего заполняем поля формы, жмем кнопку отправки формы и смотрим результат

Обработали значения введенные пользователем и показали его значения в сообщении сайта

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

  1. $form_state['values']

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

Функция валидации формы

Функция валидации формы отвечает за корректность введенных пользователем значений. Например, давайте для первого текстового поля разрешим ввод только числовых значений.

За функцию валидации отвечает хук:

  1. hook_form_validate

В нашем случае функция валидации будет выглядеть следующим образом:

  1. <?php
  2. /**
  3.  * Implements hook_form_validate
  4.  */
  5. function myform_form_validate($form, &$form_state){
  6. if(!is_numeric($form_state['values']['onetextfield'])){
  7. form_set_error('onetextfield', t('Для данного поля возможно, только числовые значения'));
  8. }
  9. }

После чего чистим кеш, заполняем поля текстом и жмем на отправку

Сработала функция валидации формы

Видим, что у нас сработала функция валидации на первое поле формы, а если мы введем числовое значение, то форма успешно отправиться.

Полный код файла myform.module

  1. <?php
  2. /**
  3.  * implements hook_menu()
  4.  */
  5. function myform_menu(){
  6. $items = array();
  7. $items['myform'] = array(
  8. 'title' => 'Form API',
  9. 'page callback' => 'drupal_get_form',
  10. 'page arguments' => array('myform_form'),
  11. 'access callback' => TRUE
  12. );
  13.  
  14. return $items;
  15. }
  16.  
  17. /**
  18.  * Callback myform
  19.  */
  20. function myform_form($form, &$form_state) {
  21. // Описали первое текстовое поле
  22. $form['onetextfield'] = array(
  23. '#type' => 'textfield', // тип поля
  24. '#title' => t('первое текстовое поле'), // заголовок поля
  25. );
  26.  
  27. // Описали второе текстовое поле
  28. $form['twotextfield'] = array(
  29. '#type' => 'textfield', // тип поля
  30. '#title' => t('второе текстовое поле'), // заголовок поля
  31. );
  32.  
  33. // Описали кнопку отправки форму
  34. $form['submit'] = array(
  35. '#type' => 'submit', // тип поля
  36. '#value' => t('отправить форму'), // текст кнопки формы
  37. );
  38. return $form;
  39. }
  40.  
  41. /**
  42.  * Callback submit
  43.  * Implements hook_form_submit
  44.  */
  45. function myform_form_submit($form, &$form_state){
  46. $output = 'Первое текстовое поле - ' .$form_state['values']['onetextfield'] .'<br>';
  47. $output .= 'Второе текстовое поле - ' .$form_state['values']['twotextfield'];
  48. drupal_set_message($output);
  49. }
  50.  
  51. /**
  52.  * Implements hook_form_validate
  53.  */
  54. function myform_form_validate($form, &$form_state){
  55. if(!is_numeric($form_state['values']['onetextfield'])){
  56. form_set_error('onetextfield', t('Для данного поля возможно, только числовые значения'));
  57. }
  58. }

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

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (2)

Profile picture for user 1541
Гена
14.12.2014

Афтар жжёт!

Profile picture for user 1541
ruslan
03.05.2015

в каком смысле?