Limitar quais funções podem exibir um nó com base em seu tipo de conteúdo

18

Estou usando o Drupal 7 e criei um novo tipo de conteúdo chamado "eBook" e criei uma nova função chamada "MonthlySubscriber". Minha intenção é permitir que apenas usuários com o "MonthlySubscriber" visualizem os nós do "eBook". Quando examinei as configurações de permissão de uma função, vi as caixas de seleção que permitem criar, editar e excluir nós desse tipo de conteúdo, mas não existem caixas de seleção para visualizar nós.

Como limito os usuários que podem visualizar os nós do "eBook" a apenas os usuários com a função "MonthlySubscriber"?

John
fonte

Respostas:

13

Você precisa instalar o módulo Content Access para adicionar esse controle de acesso.

Este módulo permite gerenciar permissões para tipos de conteúdo por função e autor. Ele permite que você especifique a visualização personalizada, edite e exclua permissões para cada tipo de conteúdo.

iStryker
fonte
5

Para o drupal 7, tente usar 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;
}
Denis
fonte
11
Evite respostas somente de código. Eles não servem a nenhum propósito de aprendizado. Pelo menos explique em uma frase ou três como exatamente esse código específico é uma resposta? Como funciona? por que isso funciona? O tipo de descrição que ajudará outras pessoas a escrever código semelhante em situações semelhantes, em vez de perguntar repetidamente.
Mołot 17/09/2015
Essa deve ser a resposta correta.
GrafiCode 16/01
5

Aqui está uma maneira simples de proteger as páginas dos nós (nó / NID) de usuários não privilegiados.

/**
 * 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);
}
ya.teck
fonte
2
Observe que o uso hook_node_accessnão funcionará com nada que "lista" nós, como uma Visualização. Portanto, você pode restringir o acesso à visualização hook_node_access, mas uma consulta de visualização ou nó personalizado ainda pode mostrar esse nó ao usuário. hook_node_accessé mais útil para o controle editorial, para controlar criar / operações update / delete
Brian
Seu código não funciona para mim, mas você me apontou na direção certa. Encontrei código de trabalho na documentação hook_node_access api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo
Este é um mau exemplo, pois usa mymodule_node_access como função personalizada, enquanto o Drupal fornece um gancho hook_node_access. Isso pode se tornar confuso.
batigolix
@batigolix, como indicado na resposta, é uma maneira de proteger as páginas dos nós, não os nós.
usar o seguinte comando
1

Para o drupal 7, tente este: Acesso por termo

Fornece controle de acesso de nó hierárquico muito flexível (controle de acesso a conteúdo), para D7.

washooo
fonte
0

A solução hook_menu_alter postada acima por ya.teck funciona, mas entra em conflito com o hook_node_access padrão em seu nome de função. Nesse caso, o hook_menu_alter não é necessário e, portanto, a resposta postada por Denis acima é, na minha opinião, mais precisa e correta. Alterar o menu_item, como é feito, é o primeiro exemplo referenciado que pode ser derrotado por outro módulo mais abaixo no canal.

ben.hamelin
fonte
0

Usei um trecho de código encontrado na documentação da API D7 para o gancho hook_node_access .

Este código concederá acesso para visualizar o conteúdo de "e-book" para usuários que tenham a permissão "ver e-book".

Você precisa de uma nova permissão para controlar o acesso implementando hook_permission ().

/**
 * Implements hook_permission().
 */
function mymodule_permission() {
  return array(
    'view ebook' => array(
      'title' => t('View Ebook'),
      'description' => t('View Ebook nodes.'),
    ),
  );
}

Ao implementar hook_node_access (), o Drupal pode conceder ou negar o acesso ao nó.

/**
 * 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;
}

Outras permissões (editar, excluir etc.) podem ser tratadas através das permissões normais do Drupal.

Opcionalmente, você pode remover o conteúdo da visão geral do administrador implementando 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', '!=');
  }
}
batigolix
fonte
0

Eu prefiro usar o módulo Permissões de exibição de nó . É mais simples que o módulo de acesso a conteúdo.

Como no D6, ele adiciona permissões "Visualizar qualquer conteúdo" e "Exibir conteúdo próprio" a qualquer tipo de conteúdo que você escolher.

insira a descrição da imagem aqui

Passos a seguir:

  1. Depois de instalar e ativar, vá para /admin/config/content/node-view-permissionse selecione quais tipos de conteúdo você deseja limitar o acesso.
  2. Em seguida, vá para /admin/people/permissions#module-node_view_permissions e selecione as funções que deseja visualizar o conteúdo. Salve as permissões.

    Feito!

Chris Happy
fonte
para o Drupal 8 "Nó Exibir permissões" não está funcionando
Karthikeyan Manivasagam
@KarthikeyanManivasagam How so?
Chris Happy
Usamos esse módulo em um de nosso projeto, no qual precisamos fornecer acesso à visualização de conteúdo com base na função e no tipo de conteúdo, mas não está funcionando. o comportamento permanece o mesmo sem o uso deste módulo.
Karthikeyan Manivasagam