##対象バージョン
Moodle 2.8
##ケイパビリティとコンテキスト
has_capability()の2番目の引数にコンテキストを渡す必要がある
その際のコンテキストは、$context = context_xxxx::instance();で生成する(古いバージョンだと記法が違う)
context_xxxxには、以下の6種類がある
context_system, context_user, context_coursecat, context_course, context_module, context_block
どのcontext_xxxxを使えばいいかは、チェックしたいケイパビリティの定義部分にある'contextlevel'の値が参考になる
→必ずここに書いてある値を使わなければならないわけではないが、とりあえずcontext_systemを使っておけ的な考えだと、本来はtrue(権限あり)なのにfalseが返ってきてしまうことがある
has_capability()は、デフォルトでは$USER->idのユーザのケイパビリティをチェックする
他のユーザのケイパビリティをチェックしたければ、3番目の引数を渡せばいい
・コアのケイパビリティはだいたいlib/db/access.phpの中に定義されている
・context_xxxx系クラスの定義はlib/accesslib.phpの中に存在する
##ロールとコンテキスト
https://docs.moodle.org/2x/ja/%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6
あるコンテキストに対してロールが割り当てられた場合、それより下のコンテキストに対して常にそのロールが適用される
例:「マネージャ」というロールは、システムロールとして割り当てることもできるし、コース内でだけ割り当てることもできる
「コース作成者」というロールは、その性質上システムロールとして割り当てることしかできない(コース内で割り当てても肝心のコース作成ができないので)
##has_capability
・has_capability()の中で、管理者だったら問答無用でtrue等の処理を行うが、
そうでない場合はhas_capability_in_accessdata()を呼び出す
・has_capability_in_accessdata()の中で、渡されたコンテキストのpath情報を見て、
どこかの階層でCAP_ALLOWされていたりCAP_PROHIBITされていないかを見てtrue/falseを返す
→context_systemを渡すと、システムコンテキストのレベルでしかケイパビリティの有無をチェックしないが、
context_course, context_coursecat等を渡せば、コースやコースカテゴリのレベルでもケイパビリティの有無をチェックする
→つまり、context_systemを使ってしまうと「本来はtrueなのにfalseを返してしまう」可能性が高くなる?
「本来はfalseなのにtrueを返してしまう」という心配は要らない?