回答:
triggering_element
から使用する必要があります$form_state['triggering_element']
。
ベストプラクティスは#name
、ボタンの属性を定義することです。そのため、でこの値を使用できますtriggering_element
。
例えば:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
この属性triggering_element
を定義しない場合、ボタンの#value
(ユーザーが読み取れるテキスト)が保持されますが、他のモジュールがこの値を変更したり、ローカライズによって変更されたりする可能性があるため、これは推奨されません。
使用することもできます$form_state['clicked_button']
が、これは非推奨です。
詳細については、drupal_build_form関数のドキュメントページをご覧ください。
$form_state['clicked_button']['#value']
フォームでクリックされたボタンがわかります。
$form_state['clicked_button']['#value']
:)
$form_state
Drupal 6で行ってきたこれらの値を比較してください。Drupal7でも同じです
if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
//Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
//Process if Cancel is pressed
}
次の#name
ように、属性にボタンの名前を付けます。
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
次に使用します:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
まだトリガーされたイベントにアクセスする方法を見つけようとしている人のために、Drupal 8ソリューションがあります。
$form_state->getTriggeringElement()
これは、トリガーとなる送信要素の配列を返します。というマークアップを追加する#name
と、次の方法でアクセスできます。
$button_clicked = $form_state->getTriggeringElement()['#name']
この変更の理由はそれですFormStateInterface
、今でreadOnly
拡張するクラスだけがいるファイルFormStateInterface
の変数にアクセスすることができます。そのgetTriggeringElement()
ため、変数にアクセスするためのようなアクセサメソッドを使用する必要があります。
Drupal 8.6.7
以下のようなボタンを作成します。
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
送信関数で、以下のコードのようなボタン名を取得します。
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
比較は次のように行うことができます
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
#Drupal8
hook_submit()
か、それともフォーム送信ハンドラですか?フォーム送信ハンドラはの実装ではありませんhook_submit()
。