web-dev-qa-db-ja.com

ユーザーが自分のカスタムコンテンツタイプを表示することを制限するにはどうすればよいですか?

「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'を渡していないため、機能していません。ユーザーが「コンテンツへのアクセス」権限を持っている場合、すべてのノードは表示されません。自分のノードタイプをより細かく制御したいのですが、どうすればよいですか?

2

hook_node_access()の実装が_NODE_ACCESS_IGNORE_を返す場合、ノードへのアクセスを拒否するのではなく、ユーザーがノードにアクセスできるかどうかを他のモジュールに決定させます。 hook_node_access()を実装するモジュールが_NODE_ACCESS_DENY_を返さず、hook_node_grants()を実装するモジュールがノードに対して0を返さない場合、ユーザーはノードにアクセスできます。

1
kiamlaluno

管理者メニュー(人->権限)でも同じことができます。ロールごとに権限を割り当てることができます。多分私は疑いを理解していません。

0
user709