web-dev-qa-db-ja.com

hook_form_alter()でカスタム送信ハンドラをどのように実装しますか?

Drupal 7モジュールを8に更新していて、フォームの変更で問題が発生しています。検証関数と送信ハンドラを追加しています。検証関数は正常に呼び出されますが、送信機能は起動されません。これは、既存のフォームに送信ハンドラを追加するために実行する必要があるSymfonyスタイルのアプローチがあるかどうか疑問に思っています。多くの検索と例が見つかりません。作業中のD8モジュールも調べましたが、実際に動作する例はまだ見つかりません。

誰かが正しいDrupalこれを行う8つの方法は何かを知っていますか?

15
Arbee

ドキュメント の例によれば、Drupal 7の場合と同じです。

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

同様の(動作する)ロジックは

そして他にもいくつかあります。

13
Clive

次のコードを使用して、送信ハンドラーの数を追加できます。

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

送信ハンドラーafterをデフォルトの送信ハンドラー(送信コールバックの後に呼び出される送信ハンドラー)に追加する場合は、以下を使用できます。

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

送信ハンドラを削除するには:

unset($form["actions"]['submit']);
6
DEVARAJ JOHNSON

動作は変更されるか、ケースごとに異なります。 Node Delete Multiple Confirmation Form

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

@Cliveのコードにより、Drupalはメインハンドラーを無視します。この場合、ハンドラーを$form['#submit']セクションに追加します。

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';
3
lifecoder

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']に正常に追加できず、関数を適切に起動できませんでした。新しい記事を作成するときに保存して公開ボタンに明示的に添付するhadして、-に添付します保存して公開し続ける既存の記事を編集するときのボタン。

publishのほかに、使用可能な他のボタンアクションの一部を以下に示します。

unpublish
preview
delete
1