4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

前回に引き続き、「Contextual Filter」シリーズです。

今回は How To編 です。

このシリーズでは三記事に渡って、「Contextual Filter ってなに?」「設定方法」「実践」をご紹介します。

準備

1. 事前にDrupal環境を用意してください

2. NodeをBaseTableにしたViewsを作成してください

スクリーンショット 2024-06-16 2.41.38.png

静的フィルタリング設定

まずはコンテンツを「掲載のみ」でフィルタリングをしてみましょう

「掲載」は真偽値のため、「0・1」でデータが登録されています。

固定値の箇所に、「1」を入力します。

2024-06-16.gif

クエリとプレビューを見てみましょう。

スクリーンショット 2024-06-16 0.50.52.png

WHERE (node_field_data.status = '1')

いい感じですね。

コンテンツを「掲載以外」でフィルタリングをしてみましょう

今度は、「掲載以外」のもの表示してみましょう。「※非掲載のみではないのがミソ」

設定画面内に「除外」って項目があるのでそちらを使ってみましょう。(固定値は「1」のまま)

スクリーンショット 2024-06-16 2.10.54.png

クエリとプレビューを見てみましょう。

WHERE (node_field_data.status != '1' OR node_field_data.status IS NULL)

もうお気づきでしょうか?

「0」で引っ掛けているのではなく、データが空の場合も含めるようにクエリを作ることができます。

次は複数のArgumentで絞り込みをしてみましょう

バンドルが「記事(article)」「News(news)」「ブログ(blog)」のコンテンツの一覧を作ります。

「複数の値を許可する」とあるのでチェックを入れてください。

スクリーンショット 2024-06-16 2.13.40.png

固定値の入力値に「article+news+blog」と入力します。

スクリーンショット 2024-06-16 2.15.38.png

クエリとプレビューを見てみましょう。

スクリーンショット 2024-06-16 1.08.29.png

WHERE "node_field_data"."type" IN ('article', 'news', 'blog')

いい感じですね。

今回はOR検索をしましたが、もちろんAND検索もできます。「a,b,c」

例えば、カテゴリが「Drupalタグ」「PHPタグ」の両方を持っている記事一覧というようなシチュエーションで使えますね。

動的フィルタリング設定

今までは静的なフィルタリング設定と基本的な使い方を紹介しました。

本当の強みはこれからです。

自分の作成したコンテンツ一覧

よくある動的要素、ログインユーザーです。

Qiitaでもありますよね。
「自分の投稿した記事一覧」あれを作ります。

Contextual Filter 内の「投稿者」を選択します。

固定値で、「タイプ: ログインユーザーのユーザーID」とありますので設定してください。

スクリーンショット 2024-06-16 1.15.00.png

クエリとプレビューを見てみましょう。

スクリーンショット 2024-06-16 1.15.15.png

WHERE (node_field_data.uid = '1')

ちゃんとWHERE句が設定されていますね。
「自分の投稿した記事一覧」...。思ったより簡単ですよね。
ユーザーID: 2でログインしている場合は、WHERE (node_field_data.uid = '2’)となります。

URLからArgumentを取得

次は、URLからArgumentを取得してみようと思います。

1. PageDisplayの作成

PageDisplayを作成してください。Path設定が結構大事です。

スクリーンショット 2024-06-16 1.22.50.png

「view/%bundle/%tag」

なんとなくイメージつきますか?

{サイトのURL/view/article/1}
このURLにアクセスした際には、記事(article)かつ、タグ(Taxonomy:id)が1のものをリスト化します。

つまり、動的要素を2つ渡すことができるViewsを構築します。
動作を見てみたらしっくりきます。とりあえず設定をしてみましょう。

2. Filterの設定

  • コンテンツタイプ
  • タグ

上記、2つのフィールドをフィルターに追加してください。
フィルター設定内で特別な設定はいりません。(デフォルトのまま)

順番によって、Argumentの受け取り方が変わりますので並び順が結構大事です。

スクリーンショット 2024-06-16 2.28.30.png
この順番になっていたらOK。

3. さらっとタイトルのオーバーライド

Viewsのタイトルを動的に変更できます。
以下の様に設定してみました。

スクリーンショット 2024-06-16 1.46.28.png
{{ arguments.type }}コンテンツタイプ / TermID: {{ arguments.field_tags_target_id }}

Twigが使えるようなので、カスタムフィルターやカスタム関数を実装すると幅が広がりますよね。

4. 検証の条件を指定?

現状、URLに入ってきたタグのIDでしか絞り込みをしない設定になっていますがタグのバンドルを指定したい場合ありますよね?

例えば記事専用のタグだけを使いたい。管理用のタグは含みたくない。とか。
結構設定簡単です。

スクリーンショット 2024-06-16 1.49.23.png

動作チェック!!

2つのArgumentをちゃんと受け取ってくれるか確認してみます。

/view/article/1 の場合

スクリーンショット 2024-06-16 2.36.13.png

/view/article/2 の場合

スクリーンショット 2024-06-16 2.36.19.png

/view/news/all の場合

スクリーンショット 2024-06-16 2.36.27.png

いい感じに絞り込めてますね。

いきなり2つのArgumentを設定するやり方をしてみましたが、コンテンツタイプごとでも、タグごとでも絞り込みができているようです。

まとめ

いかがでしょうか?

今回紹介できたのは、ほんの一部分...。
Contexual Filterはできることが多すぎます。

使いこなせば、HOOKやカスタムクエリの実装箇所をかなり吸収できそうですよね。

本記事では触れてませんが、EVAモジュールと組み合わせてContextの渡し方をより柔軟にしたり、CustomCacheTagsモジュールでArgument単位でのキャッシュタグ設定をしたりと、かなり幅を広げることが可能です。

次回は最終回です。Tutorial 編 !!
MBTIをテーマにViewsを作っていきます。ぜひ、いっしょに実践してみましょう。

お楽しみに。

参考

4
5
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
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?