Как ограничить пользователей в просмотре их собственного пользовательского типа контента?
Я разрабатываю пользовательский модуль под названием "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='просмотр', чтобы ограничить пользователя. Если у пользователя есть разрешение "доступ к контенту", то в противном случае отображаются все узлы. Я хочу иметь более точный контроль над своим собственным типом узла. Как это сделать?
2 answers
Когда реализация hook_node_access()
возвращает NODE_ACCESS_IGNORE
, она не запрещает доступ к узлу, но позволяет другим модулям решать, имеет ли пользователь доступ к узлу. Если ни один из модулей, реализующих hook_node_access()
, не возвращает NODE_ACCESS_DENY
, и ни один из модулей, реализующих hook_node_grants()
, не возвращает 0 для узла, то пользователь имеет доступ к узлу.
Вы можете сделать то же самое через меню администратора (Люди - > Разрешения). Вы можете назначать разрешения по ролям. Возможно, я не понимаю сомнений.