クリックしたときにフォームにボタンを作成したい:
これはDrupal 8フォームで可能ですか?
この例では、カスタムボタンアクションをDrupal 8フォームに追加しました。ボタンをクリックすると、フォームが送信されなくなり、カスタムJavaScriptがいくつかの作業を実行できるようになります。
ここに3つの部分があります:
#attached
ライブラリ.js
ファイルそして、これがサンプルコードです:
in ExampleForm.php
$form['actions']['clear'] = [
'#type' => 'button',
'#value' => $this->t('Clear'),
'#attributes' => [
'onclick' => 'return false;'
],
'#attached' => array(
'library' => array(
'example/foo',
),
),
];
example.libraries.yml
foo:
js:
js/foo.js: {}
js/foo.js
Drupal.behaviors.example_hello = {
attach: function (context, settings) {
// Attach a click listener to the clear button.
var clearBtn = document.getElementById('edit-clear');
clearBtn.addEventListener('click', function() {
// Do something!
console.log('Clear button clicked!');
}, false);
}
};
すべてのキャッシュをクリアして、新しいfoo.js
ライブラリがDrupal 8。
Button_typeをbuttonに設定します。
$form['js_action'] = array(
'#type' => 'button',
'#value' => t('Click me'),
);
添付するカスタムJS。
$form['js_action']['#attached'] => array(
'js' => array(
drupal_get_path('module', 'ajax_example') . '/ajax_example.js',
);
Ajaxの呼び出しは次のようになります。
$form['js_action']['#ajax'] => array(
'callback' => 'poll_choice_js',
'wrapper' => 'poll-choices',
'method' => 'replace',
'effect' => 'fade',
),
次のようなメニューコールバックを使用します。
/**
* Menu callback for AJAX additions. Render the new poll choices.
*/
function poll_choice_js($form, $form_state) {
return $form['choice_wrapper']['choice'];
}
詳細は [〜#〜] api [〜#〜] を確認してください。
Button_typeを 'button'に設定しても、結果のタグの 'type'属性は変更されず、クラスが追加されるだけです。 「ボタン」または「送信」フォーム要素を使用する場合、「送信」以外のタイプのボタンを作成する方法はありません。このようなボタンのデフォルトの動作を妨げるJavaScriptをいつでも添付できますが、お勧めしません。
私の好ましい方法は、汎用のhtml_tag要素を使用して専用ボタンを作成することです。
$element['nosubmit_button'] = [
'#type' => 'html_tag',
'#tag' => 'input',
'#attributes' => [
'type' => 'button',
'value' => t("It won't trigger submit"),
'class' => 'button',
'name' => 'nosubmit_button',
],
'#attached' => [
'library' => [
'mylibrary',
],
],
Drupal 8では、個々のjsまたはcssファイルではなく、ライブラリを添付する必要があることにも注意してください。
同じ目的を達成する方法は他にもあります。たとえば、「markup」要素タイプを使用して、ボタンの必要なHTMLマークアップを「#markup」プロパティとして指定できます。 #allowed_tagsプロパティにも注意してください。マークアップはフィルタリングされ、デフォルトではどのタグも通過しません(ボタンタグは通過しないなど)。