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


16

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

誰もこれを行う正しいDrupal 8の方法が何であるか考えていますか?


2
既存のコードを投稿して、人々がそれを見て、問題/提案の代替案を見つけられるようにしてください。
ユリバベンコ

D8 beta9の時点では、送信ハンドラーのゲッターとセッターがありますが、それらを機能させることができなかったようで、以下の回答を使用しました。フックを使用するよりもイベントをサブスクライブするので、ノードインターフェイスが将来ディスパッチされるイベントを取得することを望みます。
アレックスFinnarn

回答:


13

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

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

同様の(動作する)ロジックを見つけることができます

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


1
APIドキュメントについて議論することはできません。おそらく、私の実装には厄介なものがありますので、さらに掘り下げます。
アルビー

上記の私の更新を参照してください。$ form ['actions'] ['submit']の他に、送信ハンドラを添付できる$ form ['actions'] ['publish']および['unpublish']セクションもあります。
アルビー

送信ハンドラに$ form ['actions'] ['submit'] ['#submit'] []の代わりに$ form ['actions'] ['publish'] ['#submit'] []を使用する必要がありましたノードが公開されたときに機能します。ただし、ノードが未公開として最初に保存されたときに、コールバックを機能させることができないようです。
アレックスFinnarn

6

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

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

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

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

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

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

3

動作は変更されるか、ケースごとに異なります。Node Delete Multiple確認フォームを使用

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

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

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

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

Drupal 8.7.3にmy_module_node_article_form_submit($form, FormStateInterface $form_stateTypeError: 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.