web-dev-qa-db-ja.com

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

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

_$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を使用しています。

20
Yusef

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?");

}
26
MrD

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ハンドラープラグインの作成

次に、Webフォームを編集するときに「メール/ハンドラー」セクションに表示される新しいプラグインを作成できます。私はそれをmyhandlerと呼びます。myhandlerのすべての記述を選択した名前に置き換えることを条件に、好きな名前を付けることができます。

a)プラグイン用の新しいフォルダーを作成します。これは、次のサブフォルダーのdrupal root(ここでは/ var/www/html /と呼びます)のルート)で行います:/ var/www/html /モジュール/カスタム/ 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ディレクトリを作成します。例:/ var/www/html/modules/Custom/myhandler/src in src create Plugin in Plugin create WebformHandler

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

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

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

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キャッシュ( "drush cr"をdrupal root(/ var/www/html here)は、drushを使用する場合にそれを行います)

6)Webフォームを編集し、[Email/Handlers]に移動して[+ Add Handler]ボタンをクリックします。プラグインが一覧表示され、[Add Handler]をクリックすると、送信URLを要求するボックスが表示されます。保存ボタンをクリックします。何かがおかしい、または機能していない場合は、Apacheエラーログを確認してください。何か役立つ情報があるかもしれません。

7)フォームをテストします-フォームに送信してから、ウォッチドッグログ(drush ws)を確認します。フォームに送信された値が表示されます。表示される出力では切り捨てられる可能性があります。慌てないでください。すべて揃っています。これで今何をするかはあなた次第です。

これが誰かを助けることを願っています。あちこちで見つけたものをまとめて、1つのドキュメントに書きました。ここに来てくれた他の人たちに感謝します。

18
CptnObvious

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';
6

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) { ...
1
user1359