Drupalのフォームをリッチに!select2を使ってみた

苅田 ハユセ

selectの入力を拡張するライブラリはたくさんありますが、今回実案件でselect2のライブラリをdrupalで使う機会があったのでそちらを紹介したいと思います。

selectの入力を拡張するライブラリはたくさんありますが、今回実案件でselect2のライブラリをdrupalで使う機会があったのでそちらを紹介したいと思います。

Select2とは?

select2とはwebフォームのプルダウンで選択する形式のinput type selectの機能を拡張するjavascriptライブラリです。
drupalではコントリビュートモジュールでselect2のモジュールが用意されているのでそちら使って今回は実装していきます。
https://select2.org/

特徴

select2はjqueryベースのライブラリで、比較的容易にカスタマイズができます。
様々な設定項目があるため詳細は公式ページを確認してください。
drupalではAjax通信で情報を取得することが多々あるので、その点も柔軟に対応ができます。

モジュールのインストール

今回はddevのローカル環境で作業していきます。ddev環境の構築方法は「DDEVの環境を作る方法」を参考にしてください。

それでは早速drupalにselect2モジュールをインストールしていきます。
ローカル環境のディレクトリにCUIで入ったら
https://www.drupal.org/project/select2
drupal.orgのselecr2モジュールの公式ページに記載してあるcomposer requireを入力し、エンターを押します。

composer require 'drupal/select2:^1.15' 

インストールが完了したら、drupalの機能拡張でselect2と検索して正常に追加されているか確認してみましょう。

スクリーンショット Drupal機能拡張タブの管理画面

正常に追加されていますね。
ここの画面からチェックを入れてインストールするか、CUIからインストールしていきます。

【CUIの場合】

ddev drush en select2

ddev環境ではdrushコマンドを叩く前にddevの接頭語をつけて実行します。

実行が終わったらこちらもdrupal側で確認してみましょう。

スクリーンショット Drupal機能拡張の管理画面でselect2を検索している

正常にインストールされていますね。
これでselect2モジュールのインストールは完了です。

続いてselect2自体のライブラリをdrupalに入れるためにcomposer.jsonファイルを少し書き足します。
composer.jsonファイルのrepositoriesの設定に以下の内容を追記します。


{
    "type": "composer",
    "url": "https://asset-packagist.org"
}

スクリーンショット composer.jsonファイルのrepositoriesの設定 スクリーンショット composer.jsonのrepositoriesに設定を追加

さらに、真ん中あたりにあるinstaller-pathsのweb/libraries/{$name}に以下の内容を追記します。


    "type:bower-asset",
    "type:npm-asset"

スクリーンショット libralies.ymlファイルのinstaller-pathsの設定 スクリーンショット libralies.ymlファイルのinstaller-pathsに追記している

最後にinstaller-pathsの次の行に以下の内容を挿入します。

"installer-types": ["bower-asset", "npm-asset"],

スクリーンショット libralies.ymlファイルのinstaller-pathsに追記後の全体の構成

composer.jsonの設定が終わったらターミナルで以下のコマンドを叩いて、ライブラリをdrupalにインストールします。

composer require oomphinc/composer-installers-extender npm-asset/select2

以上でselect2のインストールは完了です。

Select2の使い方

select2モジュールをインストールすると、単純にフォームの表示管理でselect2を選択することができます。

スクリーンショット Drupalのフォームの表示管理タブでタグフィールドの種類にselect2を選択している

select2を選択すると設定で少しカスタマイズすることができます。

スクリーンショット Drupalフォームの表示管理select2の表示設定

設定が終わったら保存してコンテンツ作成画面に行ってみましょう。

スクリーンショット Drupal記事編集画面タグの選択

今回は記事のタグをselect2にしたので正常に変更できていますね。
複数選択にも対応しています。

もっともっとカスタマイズ

DrupalのGUIでカスタマイズできる範囲は限られています。
要件によってはもっと柔軟にカスタマイズしたい場合もあるかと思います。
その場合はdrupalのform alterを使ってさらにカスタマイズしていきます。
select2の公式HPに利用可能な設定項目の一覧があるので、参考にしてみてください。(※中にはHookだけではできないものもあったりします。)
https://select2.org/configuration/options-api
では実際にカスタムモジュールを作ってselect2のカスタマイズをしていきましょう。

web/module/custom/ に適当な名前のカスタムモジュール用のディレクトリを作ります。

スクリーンショット select2モジュールのファイル構成

そこに必要最低限のinfo.ymlファイルとオーバーライド用の.moduleファイルを作成します。

スクリーンショット custom/select2_customにselect2_custom.info.ymlファイルとselect2_custom.moduleファイルを作成している

それぞれのファイルを以下のように記述します。

info.yml


    name: Select2 Custom //適時変更してください
    type: module
    description: 'For select2 customize' //適時変更してください
    package: Custom
    core_version_requirement: ^10

.module


<?php

    use Drupal\Core\Form\FormStateInterface;
    /**
    * Implements hook_form_alter().
    */
    function select2_custom_form_alter(&$form, FormStateInterface $form_state, $form_id) {


    }

 

ここまでファイルが作れたら、ターミナルで

ddev drush en {カスタムモジュール名}

を入力してカスタムモジュールをインストールして完了です。

では実際にオーバーライドしていきます。
まず最初にdump($form)を使ってオーバーライドしていきたいフィールドを探しにいきます。


<?php

    use Drupal\Core\Form\FormStateInterface;
    /**
    * Implements hook_form_alter().
    */
    function select2_custom_form_alter(&$form, FormStateInterface $form_state, $form_id) {
        dump($form);
    }

上記のように記述して保存したら、select2で表示しているwebフォームのページにアクセスしてみてください。(もし表示されない場合は``drush cr``を行ってください。)
すると下の画像のようにそのページの情報が表示されます。

スクリーンショット select2のhookでdumpをしたときのデータ構造

今回オーバーライドするフィールドの「タグ」フィールドをここから探していきます。

スクリーンショット dumpのデータのfield_tagsの中のデータ構造

ありましたね。さらにwidgetの部分を展開します。

スクリーンショット field_tagsのデータ構造のwidgetをさらに展開している

そうするとselect2のフィールドの設定が細かく出てきます。
ここの#select2という配列にselect2.orgに乗ってる設定項目を記述するとライブラリの機能を使うことができます。
ではオーバーライドしたいフィールドの場所がわかったので実際に記述してみましょう。


<?php

    use Drupal\Core\Form\FormStateInterface;
    /**
    * Implements hook_form_alter().
    */
    function select2_custom_form_alter(&$form, FormStateInterface $form_state, $form_id) {
         $form['field_tags']['widget']['#select2'] = [
           'allowClear' => TRUE
         ];
    }      

dumpを消して上記のように書いてみました。この設定は選択項目のクリアボタンを表示させるか、させないかの設定です。ここで保存してもう一度同じページにアクセスしてみましょう。

スクリーンショット select2のフォームにクリアボタンが表示されている

一番右に選択項目をクリアするボタンが表示されましたね。
このようにして、select2のドキュメントに書いてある機能を追加することができます。

最後に

select2はajax通信にも対応しているので、drupalとは相性が良さそうです。
他にもselect2自体にはたくさんのカスタマイズがあるので皆さんもぜひ使ってみてください。

苅田 ハユセ/ フロントエンドエンジニア

フロントエンドの実装や、スタイル適用を担当しています。

趣味はガジェットを漁ったり、PCをいじったりすることです。最近、個人的なデスクトップPCのCPUをIntelからRyzenに変えたらintel信者の友達にちょっと怒られました。

苅田 ハユセ の書いた記事一覧

最新の関連記事

Contact お問い合わせ

Drupalでの開発・運用、サーバー構築、Webサイト構築全般、制作費用などに関してお気軽にご相談ください。