私はDrupalに学校のサイトを構築しています。他にも、2つのコンテンツタイプがあります。1つは教師用、もう1つはコース用です。教師もユーザーアカウントを持ち、「教師」などの役割に属しています。
教師(「teacher」の役割に属する認証済みサイトユーザー)が、教えるコースのページを編集できるようにしたい。問題は、複数の教師が教えるコースがあるため、「自分のコンテンツを編集」を有効にして所有者にするだけではこれを解決できないことです。
全体として、特定のノード、場合によっては複数のユーザーに特定のノードの「編集アクセス」を付与したいと思います。
このかなり単純な質問をする前に調査しました。
非常によく似た質問がここにあります -しかし、その4年前のものであり、解決策として提案されている node access module はDrupal 8にはまだ使用できません。
別のモジュール flexi access についての言及がありますが、これはDrupal 7でのみ使用できます。
[〜#〜] acl [〜#〜] へのリンクもあります。「他のモジュールがユーザーのリストを作成してノードにアクセスできるようにするためのAPI」ですが、それ自体はDrupal 8のプレリリースにのみあり、それを使用しているように見えるモジュール Content Access にはオープンセキュリティの問題(およびはプレリリースステータスです)。
周りを検索して、 Permissions by Term モジュールも見つかり、安定していて非常によく文書化されているように見えますが、正直に言うと直感的ではなく、基本的には対応しているようですノードへのビューアクセスを制限するため(推奨 こちら だけでなく、その ビデオチュートリアル からも))。
もっとシンプルなものが欲しい。そしてもちろん、すべてのノードが誰でも(もちろん匿名ユーザーであっても)誰でも一般に公開できるようにしたいのです。したがって、Permissions by Termは可能な選択肢のように思えましたが、それを使用できるかどうか、または使用すべきかどうかはわかりません。
頻繁に参照される Group module もありますが、これもやりすぎであり、私が達成したい単純なタスクには複雑すぎるようです。
私はこれで少し迷っています..とてもシンプルに見えますが、それを行う方法が見つかりません。どんな助けでも大歓迎です...
久しぶりですが、この質問に答えて、ここにたどり着いて答えを探している人に役立つと思います。
まず、私は回答とコメントを書くために時間と労力を費やしてくれたすべての人に感謝したいと思います-Drupal自分自身初心者として、それはより経験豊富な人からこの種のフィードバックを得るのに役立ちますユーザー(私の意見では、Drupalは少し欠けています。)
とにかく、私の質問で述べたように、私は 非常によく似た質問 を見つけましたが、それはかなり古く、提案されたモジュールがDrupal 8(まだベータ版です-そして、このメモには「このモジュールにはDrupal 8.」のプレリリースバージョンがあります)」と示唆されています。
しかし、その(現在5年前の)スレッドで言及されている Nodeaccess module を使用して問題を解決しました-D8のベータ版ですが、問題なく動作します。開発サイトでテストし、本番サイトで使用しましたが、私が望むことを実行します(つまり、特定の、場合によっては複数のユーザーに編集アクセスを許可します)。
だから私はこれを将来の参照のためにここに残します。
Group モジュールは注目すべきものです...(質問のように)°overkill°ではありません。代わりに、今日利用可能な唯一の安定したコントリビュートD8モジュールは、ニーズにも対応します。
この特定の質問では、gnode
サブモジュールを有効にし、グループタイプごとに、さまざまなコンテンツタイプに適切な権限(表示、編集、削除など)を定義します。設定例については、「 教師と生徒のコースへのアクセスを設定する方法 」に対する私の回答を参照してください。
注:
この回答の下にあるあなたの追加のコメント(の一部)にも対応させてください。
私の場合、かなりの数のグループが必要になります-複数の教師が教えるコースごとに1つ。
あなたのケースに合わせてグループモジュールを構成する場合は、次のようなアプローチを使用します。
完了しました...
コンテンツタイプcourse
にエンティティ参照フィールドfield_teachers
がある場合、次のように複数のユーザーの編集を有効にできます。
mymodule.module:
use Drupal\node\NodeInterface;
use Drupal\Core\Access\AccessResult;
/**
* Implements hook_node_access().
*/
function mymodule_node_access(NodeInterface $node, $op, $account) {
$type = $node->bundle();
if ($type != 'course' || $op != 'update') {
return AccessResult::neutral();
}
$uids = array_column($node->field_teachers->getValue(), 'target_id');
return AccessResult::allowedIf(in_array($account->id(), $uids))->cachePerUser()->addCacheableDependency($node);
}
Field_teachersがユーザーではなく別のコンテンツタイプを参照している場合、教師のuidはおそらく参照されているコンテンツタイプに格納されており、そこから各教師のuidをフェッチする必要があります。この場合、関連するすべてのノードをキャッシュ可能な依存関係として追加します。これにより、教師のノードが別のuidで変更されたときに、アクセス結果が無効になります。
Workbench Access モジュールを調べることができます。これにより、メニュー構造または分類法に基づいて、ノードへの編集権限を制限できます。
さまざまな編集者グループの分類語彙を作成できます。用語の例としては、4年生の数学、5年生の科学など、または単に数学、科学などがあります。分類基準参照フィールドをコースノードに追加します。これは、コンテンツをグループに割り当てるために使用されます。次に、ユーザー(教師)を正しいグループ(分類の語彙に基づくだけ)に割り当て、グループ内のすべての教師がノードを編集できます。
コースノードが作成されるときに、各コースが対応する分類用語を自動的に作成する状況を実装できます。 hook_ENTITY_TYPE_insert でこれを行うことができます。
次のようなもの:
function hook_node_insert($node) {
if ($node->bundle() == 'course') {
// Check if a term with the $node->title() already exists. (See below [1])
// Or create a term (See below [2])
// Then set your taxonomy term reference field with the new tid, or existing tid
$node->field_my_tax_group_field[] = ['target_id' => $the_tid];
// Then save the node.
$node->save();
}
}
この手法を使用する場合、コースノードの作成後に手動で行う必要があるのは、正しいユーザーをグループに割り当てて編集できるようにすることだけです。
[1] 用語が存在するかどうかを確認 。
[2] 新しい分類用語を作成する
一部のD7インスタンスで頻繁に使用され、他の貢献者と同様に、D8に完全に対応していない別のオプションは Organic Groups です。ただし、プライムタイムの準備ができていても、学習曲線は少しありますが、非常に便利です。あなたのニーズに似たユースケース(まだD7にあります)はCOD(Conference Organizer Distribution)で、DrupalConなどの主要なイベントを実行するために使用されます。
うまくいくかどうかを確認したいかもしれませんが、事前に注意してください。私が使用している一部のソリューションアーキテクトは、D8バージョンにかなり不満を感じています。これは、D7とD8の間の重要なアーキテクチャの変更によるものですが、ケースによっては機能する場合があります。