Как и где написать хук отправки веб-формы?

Я новичок в Drupal(7) и поэтому мне нужна помощь в следующих ситуациях.

Я создал одну веб-форму (у меня есть и другая веб-форма), и теперь вместо вставки в таблицу webform_submitted_data по умолчанию я хочу, чтобы эта веб-страница вставлялась в myTable. Из того, что я нашел, мне нужно написать хук для этого. На самом деле я запутался, как написать этот хук. У меня есть вопросы ниже.

  1. Куда прописать этот хук (в какой файл).
  2. Как написать этот хук только для одной веб-формы.

Пожалуйста, помогите и дайте мне знать, если вам нужна дополнительная информация для этого.


person Rahul M    schedule 03.10.2014    source источник


Ответы (3)


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

При этом, если вы хотите изменить поведение других модулей, таких как Webform, вам придется написать свой собственный крошечный модуль. На некоторые из этих хуков также можно повлиять через слой шаблонов (используя ваш файл шаблонов template.php), но, на мой взгляд, это неправильное место для изменения такого поведения.

Модуль Drupal 7 в основном состоит как минимум из двух файлов: файла *.info и файла *.module. Первый содержит некоторые метаданные, необходимые Drupal для категоризации вашего модуля и вычисления возможных зависимостей. Последний содержит фактический код PHP.

Эти файлы должны быть сохранены в каталоге (предпочтительно) с тем же именем, что и ваши файлы info и module. Чтобы Drupal нашел ваш модуль, вы можете поместить его в sites/all/modules.

Если, например, вы назовете свой модуль changemyform, это минимально необходимые файлы:

  • changemyform.info
  • changemyform.module

И оба должны находиться в: sites/all/modules/changemyform.

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

В вашем файле info вы должны как минимум написать название модуля, небольшое описание, для какой версии ядра он применим и какие у него есть зависимости. Что-то вроде этого было бы достаточно для нашего примера:

name = Change my form
description = Changes the submission behavior of my form.
core = 7.x
dependencies[] = webform

Далее мы должны написать логику для самого файла module. Общий хук для перехвата отправки любой формы (включая веб-форму):

function mymodule_form_alter( &$form, &$form_state,$form_id ){
  ...
}

С помощью этого хука вы можете, как следует из названия, изменить все формы, отображаемые с помощью Drupal. Не только обработчик отправки, но и добавление/удаление полей, добавление разметки, ... . Замените mymodule на фактическое имя вашего модуля, в нашем примере changemyform. Затем вам нужно ограничить его, чтобы получить только желаемую форму:

function changemyform_form_alter( &$form, &$form_state,$form_id ){
  if ($form_id == 'my_desired_webform_form_id') {
    $form['#submit'][] = 'changemyform_submit_handler';
  }
}

Обратите внимание, что теперь я заменил mymodule на changemyform. Как вы также можете видеть, я добавил пользовательский обработчик к свойству отправки формы. Вам придется написать этот обработчик как функцию, которая будет содержать всю желаемую логику. Таким образом, общий файл module теперь становится (минус теги <?php ?>):

function changemyform_form_alter( &$form, &$form_state,$form_id ){
  if ($form_id == 'my_desired_webform_form_id') {
    $form['#submit'][] = 'changemyform_submit_handler';
  }
}

function changemyform_submit_handler($form, &$form_state) {
  ... your submission logic ...
}

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

Поскольку это модуль, вам, конечно же, следует включить его на экране обзора модулей администрирования, чтобы он работал.

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

person Timusan    schedule 03.10.2014
comment
Спасибо, Тимусан, за подробное объяснение. Это помогло мне решить эту проблему. - person Rahul M; 03.10.2014
comment
@RahulM Добро пожаловать. Не забудьте принять ответ, если он вам помог. - person Timusan; 03.10.2014


В Drupal 8 лучший способ обратиться к хуку entity_insert —

Запишите этот хук в файл MODULE_NAME.module папки вашего модуля.

function MODULE_NAME_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
    if($entity->getEntityTypeId() == 'webform_submission') {
        $result = \Drupal::database()->insert('TABLE_NAME')
            ->fields([
                'nid' => $node->nid, 
                'sid' => $submission->sid, 
                'foo' => 'foo_data'
            ])
            ->execute();
    }
}
person Kashmiri    schedule 03.02.2019
comment
Какова цель добавления этого кода Drupal 8, когда вопрос касается Drupal 7? - person Yasha Huynh; 05.10.2020