前提:
- Customerエンティティ型のCustomerバンドルにはPurchaserフィールド(ユーザーへのエンティティ参照型)とCustomerフィールド(テキスト型)がある。
- Jobエンティティ型のJobバンドルのCustomerフィールド(エンティティ参照型)がCustomerエンティティ型のバンドルすべてのCustomersビューのEntity ReferenceディスプレイのCustomerフィールドを参照。
- 使用者は役割purchaserを持つ。管理者(Drupalのadministratorとは限らない、組織を回すひと)は役割coordinatorを持つ(が、役割purchaserを持たない。ここ重要)。
実現方法:
上記Entity Referenceディスプレイにおいて- FILTER CRITERIAでユーザーをフィルタしない。
- RELATIONSHIPSでPurchaserフィールドへのリレーションを作成。
- CONTEXTUAL FILTERSでCustomer: Purchaserへのフィルタを作成。
-> WHEN THE FILTER VALUE IS NOT AVAILABLE -> Provide default value
-> タイプ: User ID from logged in user
-> EXCEPTIONS
-> Exception value: 空欄
-> WHEN THE FILTER VALUE IS AVAILABLE OR A DEFAULT IS PROVIDED -> Specify validation criteria: オン
-> Validator: ユーザー
-> Restrict user based on role: オン
-> Restrict to the selected roles
-> coordinator: オフ(ここがミソ)
-> purchaser: オン
-> Action to take if filter value does not validate: Display all results for the specified field
ハマり点:
- はじめ、Entity Referenceディスプレイを2つ作って、片方のAccessを役割coordinator、もう片方のAccessを役割purchaserとしました。Pageディスプレイはこの方法で、アクティブユーザーの役割に応じて振り分けてくれますので。しかしEntity Referenceディスプレイはこの方法ダメなんですね。ディスプレイのMachine Nameがいちばん若いヤツだけをしか見てくれません。Entity Referenceモジュールバージョン7.x-1.1です。もうちょっとバージョン行ったらいつのまに直されてくれそうな気もします。
- FILTER CRITERIAでもあれこれ苦戦してみましたがダメでした。
- Provide default valueのUser ID from URLとかRaw value from URLでURLの実パラメタを読ませようとしましたが、administratorじゃないひとが編集画面へ行くとURLの実パラメタが消えてしまうのでありました。
したがって上記実現方法は僕の4つめのアプローチにしてようやく成功した方法です。1日つぶれました。この記事がお役に立って皆様の1日が潰れませんように :)
きょうでDrupal使いはじめて2週間です。