Во-первых, будьте очень уверены, прежде чем вы начнете выкручивать руку 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