Viewsの最強の機能の一角、「Contextual Filter」使いこなせてますか?
私はWeb業界に入って、Drupalが始めてだったので理解するのに一番時間がかかった機能でした。(SQLとか知る由もない)
このシリーズでは三記事に渡って、Contextual Filter の基礎から応用までを段階的に解説していきます。
今回は Introduction編 です。
SQLの基本的な知識があると更に理解が深まります。
SQLシリーズも執筆してます。
こちらもぜひ。
【SQLマスターへの道】NULL値を制御「COALESCE」
【SQLマスターへの道】条件付きソート「CASE・WHEN」
【SQLマスターへの道】入社年度で学ぶ 「BETWEEN」
その前にContextってなに?
「ある特定の条件・状況」です。つまりシチュエーションですね。
例えば...。
- URLのPathに応じて投げるSQLクエリを変えたい
- ログインユーザーのIDを利用したSQLクエリを構築したい
- 言語に応じて、見せるコンテンツ/見せないコンテンツを制御したい
とか。シチュエーションに応じたフィルタリングをしたいために作られた機能が、Contextual Filter ですね。
Contextual Filter って?
「シチュエーションに応じたフィルタリング機能」です。
DrupalのViewsが提供するデータの絞り込み機能ですね。SQLでいうとこのWHERE句です。
Argumentを動的に設定したいSQLクエリを作るにはもってこいです。
※ 固定値を設定して、あえて静的なフィルターにすることもできます。
なにができる?
全部は紹介できませんが、私がに多用/乱用している使い方を2つ紹介します。
- フィールド値による絞り込み(BaseTableで設定しているEntityが持つフィールドのみ対象です)
- Views自体の表示制御(これめちゃくちゃ強い)
推しポイントは?
ちゃんと使いこなした際のメリットはめちゃくちゃ大きいです。
- ModelロジックのComponent化。(MVC)
- ViewロジックのCompoent化。(MVC)
Frontend Engineerにも一箇所のView Displayを説明すればいいですよね。 - クエリキャッシュを活かせるのでパフォーマンス面に優しい
- Configファイルが圧迫しない(複数のエンジニアで開発している際のコンフリクトリスク減)
- Etc…
Contextの渡し方/受け取り方の組み込みさえできれば、かなりメンテナンスしやすい作品ができます。
え待って…。Viewsって標準のフィルターもあるよね?
はい。あります。
でも決定的な違いがあります。
静的 or 動的 です。
※ 標準のフィルターを Static Filter って僕は呼んでいます。この記事でもそう呼びます。
Static Filter はいつ使うの?
Drupalに1年半捧げて、ありえないほどViews作ってきて答えが出たんですが、使うときは決まって1つ。
「Exposed Filter を利用する時」のみです。
つまり、GUIのフィルターが必要か否かです。
ExposedFilterはまじで便利。
GUI設定のみで組み込んでくれてるのはあついです。(独自のForm実装がいらないので。)
Contexual Filter はいつ使うの?
ほぼ全てですね。
Argumentを動的に設定したいSQLクエリを作るにはもってこいです。
※ 固定値を設定して、あえて静的なフィルターにすることもできます。
詳しくは次回のHow To編でご紹介します。
単一のディスプレイのみで、Model/View ロジックの Component化 ができます。(MVC)
もちろん、Context の渡し方をちゃんと組み込む必要はあります。
まさかですが、カテゴリの数だけ記事一覧のViewsDisplayを作成してないですよね?
まとめ
いかがでしょうか?
WHERE句を設定したいなら、「Contextual Filter」しかありえないです。
WHERE句を変更するようなFormを実装する要件が出て始めて、「Static Filter」の選択肢が出てくるかと思います。
(もちろんそれすらも Contextual Filter でやってしまうことも多いですが...笑)
Argumentを動的変更したり、あえて静的(固定)にするということもできます。
Component化できる、クエリキャッシュを活かせる、メリットはかなり大きいと思います。
次回は How To 編 !!
細かい設定方法とその手順を詳しく解説します。
お楽しみに。