Как реализовать пользовательский обработчик отправки в hook_form_alter ()?

16

Я обновил один из моих модулей Drupal 7 до 8, и у меня возникла проблема с изменением формы. Я добавляю функцию проверки и обработчик отправки. Функция проверки вызывается просто отлично, но функция отправки не запускается. Мне интересно, означает ли это, что существует подход в стиле Symfony, который необходимо использовать для добавления обработчиков отправки в существующие формы. Я много искал и не могу найти никаких примеров. Также просмотрел некоторые модули D8, находящиеся в стадии разработки, но я не нашел там ни одного рабочего примера.

Кто-нибудь знает, как правильно сделать это на Drupal 8?

Arbee
источник
2
Вы должны опубликовать свой существующий код, чтобы люди могли взглянуть на него и определить любые проблемы / предложить альтернативы.
Юрий Бабенко
Начиная с D8 beta9, есть методы получения и установки обработчиков отправки, но я не мог заставить их работать и использовал ответ ниже. Я надеюсь, что интерфейс узла получит некоторые события в будущем, так как я предпочел бы подписаться на событие, чем использовать ловушку.
Алекс Финнарн

Ответы:

13

В соответствии с примером в документации, он такой же, как для Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Вы можете найти похожую (рабочую) логику в

И еще несколько других.

Клайв
источник
1
Я не могу спорить с документами API. Возможно, что-то пошло не так с моей реализацией, я буду копать глубже.
Арби
Смотрите мое обновление выше, кроме $ form ['actions'] ['submit'], есть также секции $ form ['actions'] ['publish'] и ['unpublish'], к которым могут быть прикреплены обработчики отправки.
Арби
Мне пришлось использовать $ form ['actions'] ['publish'] ['# submit'] [] вместо $ form ['actions'] ['submit'] ['# submit'] [] для моего обработчика отправки работать, когда узел был опубликован. Тем не менее, я не могу заставить работать обратный вызов, когда узел впервые сохраняется как неопубликованный.
Алекс Финнарн
6

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

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

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

$form['#submit'][1] = test_function;

Чтобы удалить обработчик отправки:

unset($form["actions"]['submit']);
ДЕВАРАЖ ДЖОНСОН
источник
3

Поведение либо меняется, либо отличается от случая к случаю. С формой подтверждения удаления нескольких узлов

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Код @ Clive заставляет Drupal игнорировать основной обработчик. В этом случае добавьте обработчик в $form['#submit']раздел:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';
lifecoder
источник
1

Вот как прикрепить пользовательский обработчик отправки к форме добавления / редактирования узла статьи в Drupal 8:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

Я не смог успешно добавить собственный обработчик отправки $form['#submit']и правильно запустить функцию. При создании новой статьи мне пришлось явно прикрепить ее к кнопке « Сохранить и опубликовать» и прикрепить к кнопке « Сохранить и опубликовать» при редактировании существующей статьи.

Кроме того publish, вот некоторые другие доступные действия кнопки:

unpublish
preview
delete
tyler.frankenstein
источник
Я в Drupal 8.7.3, и my_module_node_article_form_submit($form, FormStateInterface $form_stateдал мне TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; изменив его, чтобы _submit($form, $form_state)исправить ошибки.
user1359