内容访问模块隐藏菜单链接


10

我在Drupal 7中使用Content Access模块。当我限制来自特定角色的节点访问时,它还会隐藏菜单中的链接。

有什么办法可以显示主菜单中的受限链接?


您如何创建菜单?以编程方式?或使用管理员界面admin/structure/menu/manage/main-menu/add
AjitS 2012年

我在创建内容时添加菜单。“提供菜单链接”底部的选项。
monymirza

Answers:


1

访问内容系统的主要目的是控制每个用户可以看到的内容,并避免所有可能的安全问题。这是理想的行为,几乎每个模块或常规ApI都使用它,因此您将找不到默认的解决方案。

我一直处在相同的情况下,我发现的唯一解决方案是创建一个自定义模块,就我而言,直接查询菜单表以获取我想要的所有元素,然后自己检查权限以显示一个链接,或者当用户无权查看内容时只是内容的标题。


是否需要使用内容访问模块?
monymirza

菜单本身将永远不会显示被阻止的节点。我将创建一个模块来获取菜单的节点。然后,您可以选择显示每个节点的链接(如果用户没有访问权限,他将看到403页),或者检查每个节点的内容访问模块权限,如果用户没有访问权限,则不显示链接无法访问。
大卫·鲁伊斯

1

我已经通过自定义模块做到了这一点:

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

我很确定您将必须编写一个自定义模块来处理此问题。我的想法是:放宽Content Access的限制,即让用户查看您的内容。然后,您的自定义模块必须实现hook_node_load()并在加载用户不应该看到的节点时输出403 HTTP响应。另外,还应实现hook_permission(),以便您可以在权限页面上轻松配置访问权限。

这是一个隐藏整个节点并按内容类型和权限过滤的快速示例:

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();
    }
  }
}

或者,您可以隐藏某些节点字段,而不是返回403。但是根据hook_node_load()的API文档,不建议这样做


我在创建内容时添加菜单。“提供菜单链接”底部的选项。
monymirza

是否需要使用内容访问模块?
monymirza 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.