ログインした(ただし管理者ではない)ユーザーに非公開コンテンツ(CSSノード非公開クラスでマークされている)を表示することを許可する権限レベルの方法があるかどうかを確認するために少しググった。これはDrupal 8にのみ予定されているようです。しかし、誰かが十分な方法で回避策を実行できましたか?
私はContent Editor
という名前のロールを持っています。このロールは、作成者であるかどうかに関係なく、すべての非公開コンテンツを表示できるはずです。
非常に小さなカスタムモジュールを作成しても問題ない場合は、 hook_permission()
と hook_node_access()
を組み合わせて使用します。
function MYMODULE_permission() {
return array(
'unconditionally view unpublished content' => array(
'title' => t('Unconditionally View Unpublished Content'),
'restrict access' => TRUE
)
);
}
function MYMODULE_node_access($node, $op, $account) {
// We're only bothered about the 'view' operation at the moment
if ($op == 'view') {
// If the user has access to our new permission, let 'em at it
if (user_access('unconditionally view unpublished content', $account)) {
return NODE_ACCESS_ALLOW;
}
}
// For everything else let the system decide.
return NODE_ACCESS_IGNORE;
}
新しい権限を割り当てたロールは、公開されているかどうかに関係なく、すべてのノードを表示できるようになります。
私は最初に上のコードを試しましたが、それは素晴らしいことです。ただし、非公開コンテンツに対する権限をロールに付与した後も、そのロールはビューに非公開コンテンツを表示できず、これは一部の編集者ロールにとって非常に役立ちます...
モジュール view_unpublished を使用して解決しました。
これには Revisioning モジュールを使用します。インストール時に、コンテンツタイプごとに次の権限を作成します。
コンテンツタイプ:自分のコンテンツのリビジョンを表示します
コンテンツタイプ:誰かのコンテンツのリビジョンを表示します
コンテンツタイプ:自分のコンテンツのリビジョンを公開します
コンテンツタイプ:誰かのコンテンツのリビジョンを公開します
編集者に誰かのコンテンツのリビジョンを表示する権限を与えることにより、他のユーザーが作成または変更したすべてのノードにアクセスして公開できます。
これは私が最終的に作ったものです...
ノードタイプごとに「コンテンツの表示権限」を作成します。これは、nodeモジュールが行うこととほとんど同じですが、追加のオプションが追加されています。
/**
* Implements hook_permission().
*/
function MODULE_permission() {
$perms = array();
foreach (node_permissions_get_configured_types() as $type) {
$info = node_type_get_type($type);
$perms += array(
"view $type content" => array(
'title' => t('%type_name: View any content', array('%type_name' => $info->name)),
)
);
}
return $perms;
}
/**
* Implements hook_node_access().
*/
function MODULE_node_access($node, $op, $account) {
$type = is_string($node) ? $node : $node->type;
if (in_array($type, node_permissions_get_configured_types())) {
if ($op == 'view' && user_access('view ' . $type . ' content', $account)) {
return NODE_ACCESS_ALLOW;
}
}
return NODE_ACCESS_IGNORE;
}
Drupal 7とDrupal 8のモジュールがあります:
このモジュールを使用すると、特定のタイプの非公開ノードを表示するためのアクセス権を特定のユーザーロールに付与できます。この点で、アクセス制御は非常に詳細です。
コンテンツをビューで表示するだけの場合は、ビューUIのOther
の下にあるSQL rewriting
のQuery Settings
を無効にします。
ユーザーには公開されていないコンテンツのフラグを解除できるようにしたいだけなので、これは私にとってはうまくいきます。
公式の管理ガイドを参照してください: https://drupal.org/node/1106606 Kojoによって提案されたview_unpublishedモジュールは、すばやく簡単なソリューションです。
シンプルで合理的な回避策は、ノードで「フロントページに昇格」フラグを使用することです。
このフラグを他に使用しない場合は、「フロントページに昇格」でビューをフィルタリングします。コンテンツエディターは、昇格する前に(直接リンクを使用して)ノードで作業できます。ただし、サイトの訪問者にはまだ表示されない可能性があります。
YouTubeの「非公開動画」アプローチからインスピレーションを得ました。