DrupalのForm APIで #statesというプロパティがありそれについてのご紹介をしたいと思います。
#statesプロパティとは
例えば、チェックボックスの選択状態によって、特定のテキストボックスの表示/非表示を切り替える場合
通常であればJavaScriptを実装すると思います。
Drupalの場合Form API の #states プロパティに表示/非表示の条件を書くことにより、DrupalがJavaScriptを生成し、JSで実装した場合と変わらない機能を提供します。
既存フォームへの #states プロパティの実装例
試しにノード編集フォームへ #states プロパティを追加してみましょう。
今回は 備考有無
チェックボックスの内容によって 備考欄
テキストフィールドの表示/非表示を切り替えます。
モジュール構造
d842_form_states
├── d842_form_states.info.yml
└── d842_form_states.module
コンテンツタイプ(基本ページ)定義
基本ページコンテンツタイプに画像のように、2つのフィールドを追加します。
- 備考(field_remarks)
- 備考有無(field_remarks_flg)
ノード編集フォーム(#states実装前)
#states 実装前は、画像のように 備考
テキストフィールドが常に表示された状態となります。
モジュール実装
フィールドの表示/非表示を行うのは 備考欄
フィールドなので
備考欄
フィールドに対し #states
プロパティを追加します。
<?php
/**
* @file
* ノード編集フォームの特定のフィールドに#statesプロパティを追加.
*/
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_form_FORM_ID_alter().
*/
function d842_form_states_form_node_page_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if (array_key_exists('field_remarks', $form) && array_key_exists('field_remarks_flg', $form)) {
// Form APIの #states プロパティを利用し、フィールドの表示/非表示を切り替え.
$form['field_remarks']['#states'] = [
'visible' => [
':input[name="field_remarks_flg[value]"]' => ['checked' => TRUE],
],
];
}
}
ノード編集フォーム(#states実装後)
#states プロパティでチェックボックスの状態によりテキストフィールドの表示/非表示が切り替わります。
まとめ
以上のように Form API の #states プロパティを利用することにより、JavaScriptでコードを書くより短いコードで実装できます。
visible
以外の state もありますので、様々な動作をさせることが可能です。
簡単ですが、Form API の #states プロパティのご紹介でした。
募集しています
スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。