Drupal hook_form_FORM_ID_alter

Опубликовано 2013.07.16

Друпальский хук hook_form_FORM_ID_alter бывает нужен очень часто. Данный хук следует применить, если нужно слегка(или не слегка) изменить любую форму на сайте. Это может быть форма добавления материала, форма модуля Webform или любого другого. Для того чтобы реализовать хук - потребуется модуль. Как его написать - смотрите тут. В нём можно сразу же реализовать hook_form_FORM_ID_alter, при условии, что вы знаете id формы. Если не знаете - то узнать его не составит труда. Создайте функцию my_module_form_alter(&$form, &$form_state, $form_id) , где my_module - имя текущего модуля. В ней напишите
  1. print $form_id;
Если на сайте установлен и включен модуль Devel - то:
  1. dpm($form_id);
И затем открывайте страницу, на которой есть форма, которую нужно изменить. Строчка кода, написанная в функции my_module_form_alter выведет на экран id формы.
  1. function my_module_form_alter(&$form, &$form_state, $form_id){
  2. //dpm($form_id);
  3. print $form_id;
  4. }
Теперь зная идентификатор формы можно реализовать hook_form_FORM_ID_alter. Пусть на экран вывелось webform_form_325. Тогда ваша функция будет выглядеть так:
  1. function my_module_form_webform_form_325_alter(&$form, &$form_state, $form_id){
  2.  
  3. }
И эта функция будет вызываться каждый раз, когда друпал будет отрисовывать(или даже загружать) форму с id = webform_form_325. Ничего лишнего. И уже в этом своём хуке развлекайтесь как хотите. Если не работали с Form API - поглядите как оно работает, посмотрите официальную документацию. Например добавить к полю title описание.
  1. function my_module_form_webform_form_325_alter(&$form, &$form_state, $form_id){
  2. $form['title']['#description'] = 'Описание поля для глухонемых';
  3. }
Добавить для формы валидатор.
  1. function my_module_form_webform_form_325_alter(&$form, &$form_state, $form_id){
  2. $form['#validate'][] = 'my_custom_validator';
  3. }
  4.  
  5. function my_custom_validator($form, &$form_state) {
  6. if (drupal_strlen($form_state['values']['title']) < 10) {
  7. form_set_error('title','Заголовок короче десяти символов.');
  8. }
  9.  
  10. // Содержимое всех полей формы
  11. // dpm($form_state['values']);
  12. /*
  13.   print '<pre>';
  14.   print_r($form_state['values']);
  15.   print '';
  16.   */
  17. }
  18. </>