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


やりたいこと

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

カスタムフォーム

で、コンテンツ一覧画面

を絞り込みたい

クエリパラメーターのキーを設定

コンテンツ一覧でタイトルでフィルタリングを行うと、パスが

/admin/content?title=test&type=All&status=All&langcode=All

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

そのビューに対してどのようなキーが設定されているかは、外部設置フォームの設定のフィルターの識別子から確認できます。今回はタイトルで絞り込みたいので、タイトルのキーを確認しておきます。

フォームを作成

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

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

まずはmy_module/src/Form/TitleForm.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]]
    );
  }

}

遷移先のビューのルート名がわからない場合はこちらの画面で探してみてください。

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


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

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

動作確認

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

タイトルフィールドに入力して検索ボタンを押すと...

フォームの値で絞り込まれた状態のコンテンツ一覧画面が表示されました

この方法は [Drupal] Viewsの結果をCSVにエクスポートする方法 で紹介したデータエクスポートディスプレイに対しても行うことができます。

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

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