2015年7月10日金曜日

Drupalで、使用者ごとに異なる選択肢を提示するけど管理者に全選択肢を提示

いや~、かなりハマったけどできるようになったんで、覚書っす。

前提:


  • 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

すなわち、逆にcoordinatorは認証されなかったために全選択肢を提示されるということになります。ちょっとトリッキーです。

ハマり点:


  • はじめ、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週間です。