カスタム送信ハンドラーをフォームに追加する


19

カスタムフォーム送信ハンドラーを追加するにはどうすればよいですか?

$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()必要があります。そうしないと、何が間違っているのかを伝えるのが少し難しくなります。また、変更しようとしているフォームを言う必要があります。
キアムルノ

@kiamlaluno hook_form_alterを追加します。
ユセフ

あなたのコードはまだ$ form ['actions'] ['submit'] ['#submit']ですか?['submit']を[$ action]に置き換えてみてください。
MrD 16

回答:


25

使用hook_form_node_form_alter()する場合は、サンプルコードを使用します

function mymodule_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'mymodule_form_submit';
    }
  }
}

送信機能

function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("I'm not getting run, why :(");
    drupal_set_message("Why won't this message show?");

}

1
$form['actions'][$action]['#submit'][]どのドキュメントを見ていますか?それともタイプミスをしましたか?この中でhook_form_alterのドキュメント、それは述べています$form['actions']['submit']['#submit'][]
いいえSssweat 16


1
興味深いことに、おそらく彼はアクションをループする必要があります。ただし、この他のQ Q hook_form_alter()でカスタム送信ハンドラをどのように実装しますか?彼がやっているように働くことを想定しています。
いいえSssweat

3
各フォームには異なる構造があります。したがって、具体的な答えはありません。
MrD 16

5
そのループが必要な理由の詳細については、drupal.org / node / 1901216およびdrupal.org/node/2068063を参照してください
Berdir

18

drupal 8用のカスタムWebフォームハンドラプラグインの作成。

このドキュメントでは、webformとwebform-uiが既にインストールされ、有効になっていることを前提としています

1)Webフォームを作成します。-構造-> webformsに移動し、「+ Add webform」ボタンを押します。-UIを使用するか、yamlを使用することができます。それはユーザー次第です。電子メールアドレスを取得する1つのフィールドフォームのyamlの例:

email:
  '#type': email
  '#title': email
  '#title_display': invisible
  '#placeholder': 'ENTER YOUR EMAIL'
  '#attributes':
    class:
      - my-ip

インデントはyamlにとって重要なので、正しくインデントするようにしてください。インデントはスペースです。

フォームを保存します。

2)Webformハンドラプラグインの作成

次に、ウェブフォームを編集するときに「メール/ハンドラー」セクションに表示される新しいプラグインを作成できます。私はmyhandlerと呼びます。myhandlerのすべての言及をあなたが選んだ名前に置き換えるならば、あなたはそれをあなたが望むものと呼ぶことができます。

a)プラグイン用の新しいフォルダーを作成し、次のサブフォルダーのdrupalルート(ここでは/ var / www / html /と呼びます)でこれを行います:/ var / www / html / modules / Custom / myhandler

b)上記のディレクトリにmyhandler.info.ymlという名前の新しいファイルを作成します。このファイルには以下が含まれます。

name: My Form Handler
description: handles form submits, does something with them. 
package: Custom
type: module
version: 1.0
core: 8.x

3)モジュールディレクトリにsrcディレクトリを作成します。例:srcの/ var / www / html / modules / Custom / myhandler / src create Pluginのプラグインcreate WebformHandler

(これは、一度に使用して達成できます

mkdir -p /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/ 

mkdirに-pフラグを使用すると、構造全体が一度に作成されます。)

4)新しいファイルを作成する /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

そのファイルには次のphpコードが含まれています。必要に応じてプラグインを構成する方法を確認できるように、構成フォームのセットアップを残しました。

<?php
namespace Drupal\myhandler\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;


/**
 * Form submission handler.
 *
 * @WebformHandler(
 *   id = "myhandler_form_handler",
 *   label = @Translation("MyHandler form handler"),
 *   category = @Translation("Form Handler"),
 *   description = @Translation("Do something extra with form submissions"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class MyFormHandler extends WebformHandlerBase {

     /**
       * {@inheritdoc}
       */

     public function defaultConfiguration() {
        return [
            'submission_url' => 'https://api.example.org/SOME/ENDPOINT',
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
        $form['submission_url'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Submission URL to api.example.org'),
            '#description' => $this->t('The URL to post the submission data to.'),
            '#default_value' => $this->configuration['submission_url'],
            '#required' => TRUE,
        ];
        return $form;
    }



  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    // Your code here.
        // Get an array of the values from the submission.

        $values = $webform_submission->getData();

        // Get the URL to post the data to.
        $post_url = $this->configuration['submission_url'];

        $message = "MyHandler got form data:".print_r($values,1); 
        \Drupal::logger('myformhandler')->error($message);

        return true;
 }
}   
?>

5)MyHandlerモジュールを有効にし(drushまたはextendメニューを使用)、drupalキャッシュを再構築します(drushalを使用すると、drupalルート(/ var / www / htmlはここ)の下の任意の場所から "drush cr"を実行します)

6)Webフォームを編集し、「Email / Handlers」に進み、「+ Add Handler」ボタンをクリックします。リストにプラグインが表示され、「Add Handler」をクリックすると、送信URLを尋ねるボックスが表示されます。[保存]ボタンをクリックします。何かが正しく見えない場合、または機能していない場合は、Apacheエラーログを確認してください。そこで役立つ情報が見つかるかもしれません。

7)フォームをテストします-フォームへの送信を行い、ウォッチドッグログ(dws ws)を確認します。送信された値が表示されます。表示される出力ではそれらが切り捨てられる場合がありますが、パニックにならないでください。これで何をするかはあなた次第です。

これが誰かを助けることを願っています。私はその場所で見つけたものをまとめて一つの文書にまとめました。ここに来てくれた他の人に感謝します。


1
私は右のそれを取得する場合は、仕事へのハンドラのために、上記のコードに欠けている1つのマイナーの事は正しくからなる、submitConfigurationForm()メソッドであるparent::submitConfigurationForm($form, $form_state);parent::applyFormStateToConfiguration($form_state);
ヘンドリック

1
@Hendrikいいえ、必要ありません。submitForm()関数のみで新しいハンドラーを作成しましたが、機能します。他のすべての関数は基本クラスにあり、オーバーライドする必要はありません。ところで:あなたがそれを理解したら非常に素晴らしいシンプルなソリューション;-)
RWAM

5

Drupal 8コア8.4.3でhook_form_BASE_FORM_ID_alterを使用している場合、カスタム送信ハンドラーを追加する方法が機能しないことがわかりました。これは、送信ハンドラー関数名を追加するために機能しました:

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

Drupal 8.4.5のhook_form_FORM_ID_alterを使用する別の状況では、カスタム送信ハンドラーを追加するために上記が機能しないことがわかりました。代わりに、これはうまくいきました:

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

1

Drupal 8.7.7を使用して、search_apiモジュールからフォームに送信ハンドラーを追加しようとすると、受け入れられた答えは機能しませんでした。

私はこのエラーを受け取りました:

TypeError: Argument 2 passed to _my_module_search_api_form_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given in ...

動作させるために、関数シグネチャをインターフェイスの完全な名前空間に変更しました。

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.