【问题标题】:How do I limit access to menu by role in Drupal?如何在 Drupal 中按角色限制对菜单的访问?
【发布时间】:2011-02-21 03:26:04
【问题描述】:

我正在构建一个 Drupal 站点,并添加了两个自定义菜单来提供两组不同的管理链接(有些人会看到一个菜单或另一个,有些人会同时看到,匿名/低级别用户会看到两者都没有)。

问题是,目前所有用户都可以看到菜单(但菜单项不可见)。

我正在尝试创建一个简单的权限模块 - 并创建了管理表单,用于指定哪些菜单可由哪个角色查看。

但是我找不到一个可以让我覆盖特定菜单的可见性的钩子 - 只有项目。

那么,既然我在数据库中有一个权限列表,如何在 Drupal 中按角色限制对菜单的访问?

--

我查看了每个角色的菜单菜单访问。不幸的是,这些在项目级别而不是直接在菜单上工作。

【问题讨论】:

    标签: drupal drupal-6 drupal-navigation


    【解决方案1】:

    每个菜单都在一个块中,并且可以将块设置为对给定的用户组(访问级别)可见。 在 drupal 管理站点上:结构/块

    【讨论】:

    • 完美。这帮了我很多忙。此外,我所做的是为其他角色(“匿名用户”、“经过身份验证的用户”和“管理员”)创建一个类似的菜单,这样每个角色都会有一个菜单。
    【解决方案2】:

    Menu Per Role 模块?

    http://drupal.org/project/menu_per_role

    【讨论】:

    • 我已经看过了 - 但尽管有模块的名称,但它实际上只适用于项目而不是菜单。
    【解决方案3】:

    只要你使用一个块作为菜单,你就可以使用由核心提供的按角色访问来设置块。

    【讨论】:

      【解决方案4】:

      对于列出此功能的菜单:menu_get_names();
      但它没有任何权限检查或挂钩。
      您想在哪里限制菜单列表?如果在节点编辑时,您可以通过 hook_form_alter 更改菜单。

      【讨论】:

        【解决方案5】:

        这不是最优雅的解决方案,但您可以在主题中进行访问检查。

        【讨论】:

          【解决方案6】:

          我想出了一个解决方案 - 我没有使用自动生成的菜单块进行显示,而是创建了一个块并将以下代码放入我的模块中:

          function amh_menu_block($op = 'list', $delta = 0, $edit = array())
          {
              if ($op == 'list') {
                  $blocks[0] = array(
                      'info' => t('AMH Menu block'),
                      'weight' => 0,
                      'status' => 1,
                      'region' => 'left',
                  );
          
                  return $blocks;
              } elseif ($op == 'view') {
                  switch($delta) {
                      case 0:
                          $block = array(
                              'subject' => '',
                              'content' => _amh_menu_display(),
                          );
          
                          break;
                  }
          
                  return $block;
              }
          }
          
          function _amh_menu_display()
          {
              global $user;
          
              $content = '';
          
              if ($user->uid != 0) {
                  $result = db_query('SELECT * FROM {amh_menu_permission} p LEFT JOIN {menu_custom} m ON p.menu_name = m.menu_name LEFT JOIN {users_roles} u ON p.rid = u.rid WHERE u.uid = %d OR p.rid = 2', $user->uid);
              } else {
                  $result = db_query('SELECT * FROM {amh_menu_permission} p LEFT JOIN {menu_custom} m ON p.menu_name = m.menu_name WHERE p.rid = 1');
              }
              $menus = array();
              while ($m = db_fetch_object($result)) {
                  $menu = menu_tree($m->menu_name);
          
                  if ($menu) {
                      $content .= "\r\n<h2>" . $m->title . "<h2>\r\n";
                      $content .= theme_menu_tree($menu);
                  }
              }
          
              return $content;
          }
          

          这似乎工作正常。

          【讨论】:

            【解决方案7】:

            Menu Admin Per Menu 模块将允许您按角色限制对每个菜单的编辑访问权限。 https://www.drupal.org/project/menu_admin_per_menu

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-13
              • 1970-01-01
              • 1970-01-01
              • 2021-11-06
              相关资源
              最近更新 更多