今回はContextual Filterシリーズ Tutorial 編 です。最終回!!
MBTIを題材に「3つ」の一覧を作成します。
このシリーズでは三記事に渡って、「Contextual Filter ってなに?」「設定の仕方」「実践」をご紹介しています。
ぜひ、前回・前々回の記事もご覧ください。
何をつくるの?
今回は、MBTIとユーザーを紐づけた一覧を3つ作成します。
1つ目はMBTI一覧!!
正直説明不要ですよね。
ナレーションベースで流します。
2つ目はMBTI別のユーザー一覧!!
前回の記事を読んでくれた方はなんとなくイメージつくんじゃないでしょうか?
(え、見てない?大丈夫!ちゃんと解説するんで!)
3つ目は自分のMBTIと同じユーザー一覧!!
これが結構テクいですね。
どうでしょうか?まだイメージつかないですか?
では先に完成イメージをお見せします。
完成イメージ
ちょっと不安になりましたか?
大丈夫です。全部ノーコードでやっちゃいます。
テーブル設計とデータの登録しよ
一覧を作ろうにもデータがないと作れませんよね。
以下を参考にフィールド定義を行ってください。
MBTIテーブル(TaxonomyTerm/MBTI)
Field名 | Type |
---|---|
id | int |
label(標準) | string |
type(任意です。正直不要。) | text(list) |
Userテーブル(標準のUser)
Field名 | Type |
---|---|
id | int |
name(標準) | string |
mbti | int(Reference) |
テーブルができたら、必要に応じてデータの登録をしてください。
僕は「MBTI」16件、「User」50件のデータを作成しました。
データ登録めんどくさいですか?(スクリプト作ったので気が向けば別記事書きます。)
では早速、Views組んでいきます。
1. MBTI一覧つくるよ
簡単ですよね。TaxonomyTermをBaseTableに設定してクエリを構築するだけです。
説明不要だと思いますので軽く流します。
手順
- TaxonomyTermをBaseTableに設定したViewsを作成
- FieldにLabelを表示するように出力
- フィルターに、MBTIバンドルを設定
特にソートにこだわりもないので、こんなところだと思います。
ワンポイント
テーブルのところで、type(任意です。正直不要。) って所に疑問覚えた方いらしますか?
よく読んでいただきありがとうございます。
はい。タイプでGroupingをすることで見やすくなりますよね。
2. MBTI別のユーザー一覧つくるよ
URLに応じて、MBTI別のユーザー一覧を作成します。
URL設計はこんな感じ。
/mbti/{id}
でIDに応じて、MBTIを切り替える。
16個もディスプレイ作ってられませんよね。
手順
- UserをBaseTableに設定したViews/PageDisplayを作成
- Pathに「
mbti/%taxonomy_term
」を設定 - UserとTaxonomyTermのTableをInnerJoinで結合
- URLからArgumentを受けとりTaxonomyTermのIDで絞り込む
ちょっと複雑になりましたね。
(※ 1. と 2. は簡単なので省きます)
解説
3. UserとTaxonomyTermのTableをInnerJoinで結合。
UserFieldのMBTIのテーブルとMBTIデータをRelationshipで結合します。
表現むずいので簡単に図を作成しました。
ちょっと整理できましたか?
4. URLからArgumentを受けとりTaxonomyTermのIDで絞り込む
「mbti/%taxonomy_term
」の「%taxonomy_term
」からArgumentを受け取り絞り込みができるようにContextual Filterを設定します。
TaxonomyTermのIDを選択してください。
ワンポイント
必要に応じてタイトルのオーバーライドをしてくださいね。
私は{{ arguments.tid }}
で設定をしました。
※ 絞り込みのみであればRelationshipは必要ありません。タイトルのオーバーライド時にRelationshipを行うことでラベル名を引っ張ってきてくれるのでRelationshipをしています。
プレビューとクエリを確認
どうですか?想像通りですか?
FROM
でUserデータを抽出して、WHERE
でMBTIデータが3
のUserのみを絞り込んでいますね。
3. 自分と同じMBTIのユーザー一覧つくるよ
いよいよ最後です。
自身のMBTIと同じユーザーを確認できるブロックを作りましょう。
手順
- UserをBaseTableに設定したViews/BlockDisplayを作成
- Relationshipを2つする。User→MBTI→User
- Relation先のUserTableはCurrentUserで絞り込みをする
説明むずいっす。図作ったんでそちらで勘弁してください。
ワンポイント
BaseTableのUserは自身を省いてもいいかもですね。
(「自身のMBTIと同じユーザー」だから自分が出ないでいいのでは?って意味)
ContextualFilterの「除外」項目を使うと楽です。
プレビューとクエリを確認
いい感じですね。
BaseTableはLoginUserを除外。RelationTableではLoginUserのみを絞る。
最高のビルドができていると思います。
お疲れ様でした。
Viewsの構築完了です。
あとは、Layoutを組んでBlockを配置してみてください。
まとめ
記事書いててふと思ったんですが、これ全部ノーコードで作れるってDrupalのViews激強ですよね。
Argumentの渡し方さえしっかりビルドすれば、コードなしで大抵はできると思います。
(本音ですが...。今回自分で要件考えたんですけど、コード書くかモジュール入れるか少し悩みました。)
本シリーズでは、Contextual Filterの基礎から応用、Tutorialをお届けしました。
いかがでしたか?
気が向けば番外編でも出そうと思います。
最後に
BaseTableはLoginUserを除外。RelationTableではLoginUserのみを絞る。
このフレーズが気に入っています。
あと、僕は人をカテゴライズする考え方に対して否定派です。