カスタムフォーム送信ハンドラを追加するにはどうすればよいですか?
_$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_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?");
}
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つのドキュメントに書きました。ここに来てくれた他の人たちに感謝します。
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';
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) { ...