「serviceentry」というカスタムコンテンツタイプを公開する「serviceentry」というカスタムモジュールを開発しています。
また、カスタム権限を次のように公開します。
function serviceentry_permission() {
return array(
'view own serviceentry content' => array(
'title' => t('view own serviceentry content'),
'description' => t('view own serviceentry content')
),
'view any serviceentry content' => array(
'title' => t('view any serviceentry content'),
'description' => t('view any serviceentry content')
),
'create serviceentry content' => array(
'title' => t('create serviceentry content'),
'description' => t('create serviceentry content')
),
'edit own serviceentry content' => array(
'title' => t('edit own serviceentry content'),
'description' => t('edit own serviceentry content')
),
'edit any serviceentry content' => array(
'title' => t('edit any serviceentry content'),
'description' => t('edit any serviceentry content')
),
'delete own serviceentry content' => array(
'title' => t('delete own serviceentry content'),
'description' => t('delete own serviceentry content')
),
'delete any serviceentry content' => array(
'title' => t('delete any serviceentry content'),
'description' => t('delete any serviceentry content')
),
'administer serviceentry' => array(
'title' => t('administer serviceentry'),
'description' => t('administer serviceentry')
),
);
}
次に、以下の機能を使用して権限を確認します。
function serviceentry_node_access($node, $op, $account) {
$type = is_string($node) ? $node : $node->type;
if (in_array($type, node_permissions_get_configured_types())) {
if ($op == 'create' && user_access('create ' . $type . ' content', $account)) {
return NODE_ACCESS_ALLOW;
}
if ($op == 'view') {
if (user_access('view any ' . $type . ' content', $account) || (user_access('view own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
return NODE_ACCESS_ALLOW;
}
}
if ($op == 'update') {
if (user_access('edit any ' . $type . ' content', $account) || (user_access('edit own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
return NODE_ACCESS_ALLOW;
}
}
if ($op == 'delete') {
if (user_access('delete any ' . $type . ' content', $account) || (user_access('delete own ' . $type . ' content', $account) && ($account->uid == $node->uid))) {
return NODE_ACCESS_ALLOW;
}
}
}
// Returning nothing from this function would have the same effect.
return NODE_ACCESS_IGNORE;
}
ここで、ユーザーが「独自のserviceentryコンテンツの表示」または「任意のserviceentryコンテンツの表示」権限を持っているかどうかに基づいて、serviceentryのノードの表示を制限したいと思います。上記のコードは、Drupalがユーザーを制限するために$ op = 'view'を渡していないため、機能していません。ユーザーが「コンテンツへのアクセス」権限を持っている場合、すべてのノードは表示されません。自分のノードタイプをより細かく制御したいのですが、どうすればよいですか?
hook_node_access()
の実装が_NODE_ACCESS_IGNORE
_を返す場合、ノードへのアクセスを拒否するのではなく、ユーザーがノードにアクセスできるかどうかを他のモジュールに決定させます。 hook_node_access()
を実装するモジュールが_NODE_ACCESS_DENY
_を返さず、hook_node_grants()
を実装するモジュールがノードに対して0を返さない場合、ユーザーはノードにアクセスできます。
管理者メニュー(人->権限)でも同じことができます。ロールごとに権限を割り当てることができます。多分私は疑いを理解していません。