Как ограничить пользователей в просмотре их собственного пользовательского типа контента?


Я разрабатываю пользовательский модуль под названием "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
Author: Ajinkya Kulkarni, 2011-04-11

2 answers

Когда реализация hook_node_access() возвращает NODE_ACCESS_IGNORE, она не запрещает доступ к узлу, но позволяет другим модулям решать, имеет ли пользователь доступ к узлу. Если ни один из модулей, реализующих hook_node_access(), не возвращает NODE_ACCESS_DENY, и ни один из модулей, реализующих hook_node_grants(), не возвращает 0 для узла, то пользователь имеет доступ к узлу.

 1
Author: kiamlaluno, 2011-04-11 21:27:50

Вы можете сделать то же самое через меню администратора (Люди - > Разрешения). Вы можете назначать разрешения по ролям. Возможно, я не понимаю сомнений.

 0
Author: user709, 2011-04-11 17:21:54