[Drupal] カスタムフォームの値でViewsの結果を絞り込む方法

## やりたいこと
- コンテンツのタイトルを入力できるカスタムフォームを用意する
- フォームを送信するとコンテンツ一覧画面(`/admin/content`)に遷移する。
- その際先程入力したタイトルであらかじめ絞り込まれた結果が表示される。

カスタムフォーム
![スクリーンショット 2021-03-03 20.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/00b881e9-20bc-9ccc-c74d-3a546d317be2.png)
で、コンテンツ一覧画面
![スクリーンショット 2021-03-03 20.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/5ba9a96c-9638-a272-4ebc-f87e5773c2c8.png)
を絞り込みたい :thinking:  

## クエリパラメーターのキーを設定
コンテンツ一覧でタイトルでフィルタリングを行うと、パスが

```
/admin/content?title=test&type=All&status=All&langcode=All
```
のように変化することからわかると思いますが、外部設置フィルターがあるビューではクエリパラメーターの値でフィルターの内容を判断しています。今回もカスタムフォーム送信時にこのパラメーターを同じように追加することで絞り込みを行います。

そのビューに対してどのようなキーが設定されているかは、外部設置フォームの設定の**フィルターの識別子**から確認できます。今回はタイトルで絞り込みたいので、タイトルのキーを確認しておきます。
![title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/cd6b274b-e44f-b297-2d19-4bce541c02fd.png)

![title_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/77b149c0-dac1-b40b-f6fd-5915666833a1.png)

## フォームを作成
カスタムフォームの基本的な作り方はこちらをご覧ください。
https://www.drupal.org/docs/drupal-apis/form-api/introduction-to-form-api

今回はタイトルフィールドだけの簡単なフォームを作成します。

まずは`my_module/src/Form/TitleForm.php`でフォームを定義します。ポイントはサブミットハンドラーでビューの画面にリダイレクトするように設定することです。

```php

<?php

namespace Drupal\my_module\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * タイトル検索フォーム.
 */
class TitleForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'title_form';
  }

  /**
   * {@inheritdoc}
   *
   * フォームの定義.
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['title'] = [
      '#type' => 'textfield',
      '#title' => 'タイトル',
    ];
    $form['actions']['#type'] = 'actions';
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => '検索',
      '#button_type' => 'primary',
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   *
   * 「検索」ボタン押下時の処理.
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    // フォームの値を取得する.
    $title_value = $form_state->getValue('title');

    // コンテンツ一覧画面に遷移する.
    $form_state->setRedirect(
      // コンテンツ一覧画面のルート名.
      'view.content.page_1',
      [],
      // クエリパラメーターを追加する.
      ['query' => ['title' => $title_value]]
    );
  }

}

```
遷移先のビューのルート名がわからない場合は[こちらの画面](https://qiita.com/863/items/d010d6da46b359b87bb3)で探してみてください。

次に、`my_module/my_module.routing.yml`でこのフォームのルートを定義します。

```yml

my_module.title_form:
  path: '/title-form'
  defaults:
    _title: 'タイトル検索フォーム'
    _form: '\Drupal\my_module\Form\TitleForm'
  requirements:
    _permission: 'access content'

```

手順としてはこれで完了です。

## 動作確認
`/title-form`に行くと画像のようなフォームが表示されます。

![スクリーンショット 2021-03-03 20.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/d02896cb-d13d-3d16-dc28-24d17f01d757.png)

タイトルフィールドに入力して検索ボタンを押すと...
![スクリーンショット 2021-03-03 21.12.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/ff2bb5df-eded-da6e-4b94-fe4c838f83e9.png)

フォームの値で絞り込まれた状態のコンテンツ一覧画面が表示されました :ok_hand: 
![スクリーンショット 2021-03-03 21.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/686fbdde-8922-5acc-1c77-df8d20824bf6.png)

この方法は [[Drupal] Viewsの結果をCSVにエクスポートする方法](https://qiita.com/863/items/3c14f5c6a93cb13a4403) で紹介したデータエクスポートディスプレイに対しても行うことができます。

カスタムフォームの変わりにウェブフォームで行う方法もありますよ。
https://www.youtube.com/watch?v=-yYj-k_Bwdw

Viewsの幅が広がるので試してみてくださいね:ok_hand: