Drupal 7を使用していて、「eBook」という新しいコンテンツタイプを作成し、「MonthlySubscriber」という新しいロールを作成しました。私の意図は、「MonthlySubscriber」を持つユーザーのみを許可することです「eBook」ノードを表示するロールの権限設定を確認したところ、そのコンテンツタイプのノードを作成、編集、削除できるチェックボックスが表示されましたが、ノードを表示するためのチェックボックスがありません。
「eBook」ノードを表示できるユーザーを「MonthlySubscriber」ロールを持つユーザーのみに制限するにはどうすればよいですか?
このアクセス制御を追加するには、 コンテンツアクセス モジュールをインストールする必要があります。
このモジュールを使用すると、ロールおよび作成者ごとにコンテンツタイプの権限を管理できます。これにより、各コンテンツタイプのカスタム表示、編集、および削除権限を指定できます。
これは、権限のないユーザーからノードページ(ノード/ NID)を保護する簡単な方法です。
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
$items['node/%node']['access callback'] = 'mymodule_check_node_access';
}
/**
* Determines whether the current user may perform the operation on the node.
*/
function mymodule_check_node_access($op, $node) {
if ($node->type == 'protected_type' && !user_access('administer site configuration')) {
return FALSE;
}
return node_access($op, $node);
}
drupal 7の場合、 hook_node_access() を使用してみてください:
/**
* Implements hook_node_access().
*/
function YOURMODULE_node_access($node, $op, $account) {
if (
$node->type == 'ebook' &&
$op == 'view' &&
!in_array('MonthlySubscriber', $account->roles)
) { return NODE_ACCESS_DENY; }
return NODE_ACCESS_IGNORE;
}
Drupal 7のインストールではコンテンツアクセスが機能しなかったため、代わりに Node View Permissions を使用しました。
drupal 7の場合、これを試してください: 用語によるアクセス
D7に対して、非常に柔軟な階層型ノードアクセス制御(コンテンツアクセス制御)を提供します。
上記のya.teckによって投稿されたhook_menu_alterソリューションは機能しますが、関数名が標準のhook_node_accessと競合します。この場合、hook_menu_alterは必要ありません。そのため、上記のDenisによって投稿された答えは、私の意見ではより正確で適切な方法です。行われるようにmenu_itemを変更することは、最初の参照例であり、パイプのさらに下の別のモジュールによって破壊される可能性があります。
Node View Permissions モジュールを使用します。コンテンツアクセスモジュールよりもシンプルです。
D6と同様に、選択したコンテンツタイプに「コンテンツの表示」と「自分のコンテンツの表示」の権限を追加します。
従うべき手順:
/admin/config/content/node-view-permissions
に移動して、アクセスを制限するコンテンツタイプを選択します。次に、/admin/people/permissions#module-node_view_permissions
に移動し、コンテンツを表示できるようにするロールを選択します。権限を保存します。
できた!
hook_node_accessフック については、D7 APIドキュメントにあるコードスニペットを使用しました。
このコードは、「ebookの表示」権限を持つユーザーに「ebook」コンテンツの表示へのアクセスを許可します。
Hook_permission()を実装してアクセスを制御するには、新しい権限が必要です。
/**
* Implements hook_permission().
*/
function mymodule_permission() {
return array(
'view ebook' => array(
'title' => t('View Ebook'),
'description' => t('View Ebook nodes.'),
),
);
}
Hook_node_access()を実装することにより、Drupalはノードへのアクセスを許可または拒否できます。
/**
* Implements hook_node_access().
*/
function mymodule_node_access($node, $op, $account) {
// Checks for an ebook node in view mode.
if (is_object($node) && $node->type === 'ebook' && $op === 'view') {
// Grants permission to view the node if the current user has an role
// with the permission 'view ebook'.
if (user_access('view ebook')) {
return NODE_ACCESS_ALLOW;
}
// Otherwise disallows access to view the node.
return NODE_ACCESS_DENY;
}
// For all other nodes and other view modes, don't affect the access.
return NODE_ACCESS_IGNORE;
}
その他の権限(編集、削除など)は、通常のDrupal権限を介して処理できます。
オプションで、hook_query_TAG_NAME_alterを実装することにより、管理概要からコンテンツを削除できます。
/**
* Implements hook_query_TAG_NAME_alter().
*/
function mymodule_query_node_admin_filter_alter(QueryAlterableInterface $query) {
if (!user_access('view ebook')) {
$query->condition('n.type', 'ebook', '!=');
}
}