LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-03

やりたいこと

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

カスタムフォーム
スクリーンショット 2021-03-03 20.51.54.png
で、コンテンツ一覧画面
スクリーンショット 2021-03-03 20.18.09.png
を絞り込みたい :thinking:

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

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

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

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

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

title_key.png

フォームを作成

カスタムフォームの基本的な作り方はこちらをご覧ください。
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に行くと画像のようなフォームが表示されます。

スクリーンショット 2021-03-03 20.51.54.png

タイトルフィールドに入力して検索ボタンを押すと...
スクリーンショット 2021-03-03 21.12.24.png

フォームの値で絞り込まれた状態のコンテンツ一覧画面が表示されました :ok_hand:
スクリーンショット 2021-03-03 21.13.06.png

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0