Módulo de acesso a conteúdo ocultando links de menu


10

Estou usando o módulo de acesso a conteúdo com o Drupal 7. Quando restrito o acesso ao nó de uma função específica, ele também oculta o link no menu.

existe alguma maneira de mostrar links restritos no menu principal?


como você está criando o menu? programaticamente? ou usando a UI do administrador em admin/structure/menu/manage/main-menu/add?
AjitS

estou adicionando menu quando o conteúdo é criado. uma opção na parte inferior 'Fornecer um link de menu'.
amigos estão dizendo sobre monymirza

Respostas:


1

O principal objetivo do sistema de conteúdo de acesso é controlar o que cada usuário pode ver e evitar todos os possíveis problemas de segurança. Esse é o comportamento desejado e quase todos os módulos ou APIs em geral o utilizam, portanto, você não encontrará soluções padrão para isso.

Eu estive na mesma situação e a única solução que encontrei foi criar módulos personalizados e, no meu caso, consultar diretamente a tabela de menus para obter todos os elementos desejados e verificar as permissões para exibir um link , ou simplesmente um título do conteúdo quando o usuário não tem permissão para vê-lo.


vou ter que usar o módulo de acesso a conteúdo com ele ou não?
monymirza

O menu por si só nunca exibirá os nós bloqueados. Eu criaria um módulo para buscar os nós do menu. Em seguida, você pode optar por exibir um link para cada nó (se o usuário não tiver acesso, ele verá uma página 403) ou verificar as permissões do módulo de acesso a conteúdo para cada nó e não exibir um link se o usuário não tem acesso.
David ruiz

1

Eu fiz isso via módulo personalizado:

function mymodule_form_menu_edit_item_alter(&$form, &$form_state, $form_id) {
     if ($form_state['build_info']['args'][0] == 'edit') {
       $item = $form_state['build_info']['args'][1];

       $form['ignore_access_roles'] = array(
         '#type' => 'checkboxes',
         '#multiple' => TRUE,
         '#title' => t("Ignore access"),
         '#options' => user_roles(),
         '#description' => t("If a user with one of the selected roles has no access to the menu item's path, the menu item is <strong>not</strong> hidden."),
         '#default_value' => empty($item['options']['ignore_access_roles']) ? array() : $item['options']['ignore_access_roles'],
       );

       $form['#validate'][] = 'mymodule_form_menu_edit_item_validate';
     }
   }

   function mymodule_form_menu_edit_item_validate(&$form, &$form_state) {
     if (isset($form_state['values']['ignore_access_roles'])) {
       $form_state['values']['options']['ignore_access_roles'] = $form_state['values']['ignore_access_roles'];


       $form_state['values']['options']['alter'] = TRUE;
     }
   }


   function mymodule_translated_menu_link_alter(&$link, $map) {
     if (!empty($link['options']['ignore_access_roles']) && empty($link['access'])) {

       global $user;

       // Get role ids for which the ignore access option applies.
       $rids = array_values($link['options']['ignore_access_roles']);

       $matching_rids = array_intersect(array_keys($user->roles), $rids);

       if (!empty($matching_rids)) {
         // User has one of the specified roles: override menu link access.
         $link['access'] = TRUE;

         // Localize. This must be done because it is only done for links with
         // access TRUE in _menu_link_translate.
         _menu_item_localize($link, $map, TRUE);
       }
     }
   }

0

Tenho certeza que você precisará escrever um módulo personalizado para lidar com isso. Aqui está minha ideia: relaxe as restrições de acesso a conteúdo, ou seja, permita que os usuários visualizem seu conteúdo. Em seguida, seu módulo customizado precisa implementar hook_node_load () e gerar uma resposta 403 403 ao carregar nós que seus usuários não devem ver. Hook_permission () também deve ser implementado, para que você possa configurar o acesso facilmente na página de permissão.

Aqui está um exemplo rápido ocultando o nó inteiro e filtrando por tipo de conteúdo e permissão:

function mymodule_permission() {
  return array('access reserved content');
}

function mymodule_node_load($nodes, $types) {
  if (in_array('my_reserved_content_type', $types)) {
    if (!user_access('access reserved content')) {
      drupal_access_denied();
    }
  }
}

Ou você pode ocultar alguns dos campos do nó, em vez de retornar um 403. Mas isso é desencorajado de acordo com a documentação da API para hook_node_load ()


estou adicionando menu quando o conteúdo é criado. uma opção na parte inferior 'Fornecer um link de menu'.
Dec.

vou ter que usar o módulo de acesso a conteúdo com ele ou não?
monymirza

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.