Как добавить обработчик отправки пользовательской формы?
Я пытался добавить $form['#submit'][] = 'mymodule_form_submit';
или $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
к hook_form_alter()
.
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;
function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if ($form_id == 'node_trends_form' || $form_id == 'node_trends_edit_form') {
foreach (array_keys($form['actions']) as $action) {
if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
$form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
}
}
}
}
function mymodule_form_submit(array $form, FormStateInterface $form_state){
//die("why won't this execute? :(");
drupal_set_message("Why won't this message show?");
}
Кажется drupal_set_message()
, не называется. Я также пытался восстановить кэш, но функция все еще не вызывается.
Я использую Drupal 8.2.3.
hook_form_alter()
, или немного сложнее сказать, что вы делаете неправильно. Кроме того, вы должны сказать, какую форму вы пытаетесь изменить.Ответы:
Если вы используете,
hook_form_node_form_alter()
может быть использовать пример кода :и отправить функцию
источник
$form['actions'][$action]['#submit'][]
какую документацию вы просматриваете? или ты сделал опечатку? В этом документе hook_form_alter сказано$form['actions']['submit']['#submit'][]
.Создание собственного плагина обработчика веб-формы для drupal 8.
В этом документе предполагается, что вы уже установили и включили webform и webform-ui
1) Создайте свою веб-форму. - Перейдите в структуру -> веб-формы и нажмите кнопку «+ Добавить веб-форму». - Вы можете использовать пользовательский интерфейс или yaml, это ваше дело. Пример yaml для формы с одним полем, которая принимает адрес электронной почты:
Отступ важен для yaml, поэтому убедитесь, что вы правильно поняли. отступы - пробелы.
Теперь сохраните вашу форму.
2) Создание плагина обработчика веб-формы
Затем мы можем создать новый плагин, который будет отображаться в разделе «Электронная почта / обработчики» при редактировании веб-формы. Я назову это myhandler, вы можете назвать это как хотите, при условии, что вы замените все упоминания myhandler на выбранное вами имя.
a) Создайте новую папку для вашего плагина, сделайте это в корне drupal (называемом здесь / var / www / html /) в следующей подпапке: / var / www / html / modules / Custom / myhandler
б) Создать новый файл в указанном выше каталоге с именем myhandler.info.yml, в этом файле идет следующее:
3) Создайте каталог src в каталоге вашего модуля, например: / var / www / html / modules / Custom / myhandler / src в src. Плагин для создания плагинов. Создание WebformHandler.
(это может быть достигнуто за один раз, используя
который сделает всю структуру за один раз, используя флаг -p для mkdir.)
4) Создать новый файл
/var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php
в этом файле идет следующий php-код, я оставил настройку формы конфигурации, чтобы вы могли увидеть, как настроить плагин, если это необходимо.
5) Включите ваш модуль MyHandler (используя меню drush или extends), а затем перестройте кеш drupal («drush cr» из любого места под вашим корнем drupal (/ var / www / html здесь) сделает это, если вы используете drush)
6) отредактируйте свою веб-форму, перейдите в раздел «Электронная почта / обработчики» и нажмите кнопку «+ Добавить обработчик». Вы должны увидеть свой плагин в списке, нажать «Добавить обработчик», теперь вы должны увидеть окно с просьбой ввести URL-адрес отправки. нажмите кнопку Сохранить. Если что-то выглядит неправильно или не работает, проверьте журнал ошибок apache, там вы можете найти что-то полезное.
7) Протестируйте свою форму - сделайте отправку в форму, а затем проверьте контрольный журнал (drush ws), вы должны увидеть значения, отправленные в него. Они могут быть усечены в выводе, который вы видите, не паникуйте, все это есть. Что вы делаете с этим сейчас, зависит от вас.
Надеюсь, это кому-нибудь поможет. Я собрал все это вместе с вещами, которые я нашел повсюду, и записал их в единый документ. Спасибо всем, кто меня сюда привел.
источник
parent::submitConfigurationForm($form, $form_state);
иparent::applyFormStateToConfiguration($form_state);
.submitForm()
функцией, и он работает. Все остальные функции находятся в базовом классе, и мне не нужно их переопределять. Кстати, довольно хорошее простое решение, как только вы этоесли использовать hook_form_BASE_FORM_ID_alter в Drupal 8 core 8.4.3, я обнаружил, что способы добавления пользовательского обработчика отправки не работают. Это сработало для добавления имени функции обработчика отправки:
В другой ситуации, используя hook_form_FORM_ID_alter в Drupal 8.4.5, я обнаружил, что вышеописанное не работает для добавления пользовательского обработчика отправки. Вместо этого это сработало:
источник
Принятый ответ не работал для меня, используя Drupal 8.7.7, пытаясь добавить обработчик отправки в форму из
search_api
модуля.Я получил эту ошибку:
Чтобы заставить его работать, я изменил свою сигнатуру функции на полное пространство имен интерфейса:
источник