Как мне ограничить доступ к меню по ролям в Drupal? - PullRequest
5 голосов
/ 21 февраля 2011

Я создаю сайт на Drupal и добавил два пользовательских меню для предоставления двух разных групп ссылок управления (некоторые люди увидят одно меню или другое, некоторые увидят оба, и анонимные пользователи / пользователи низкого уровня увидятни один).

Проблема в том, что на данный момент все пользователи могут видеть меню (но пункты меню не видны).

Я пытаюсь создать простой модуль разрешений -и создали формы администрирования, в которых указывается, какие меню можно просматривать с какой ролью.

Но я не могу найти хук, который позволил бы мне изменить видимость определенного меню - только элементы.

Итак, как мне ограничить доступ к меню по роли в Drupal теперь, когда у меня есть список разрешений в базе данных?

-

Я посмотрел на Меню на роль и Доступ к меню .К сожалению, они работают на уровне предметов, а не непосредственно в меню.

Ответы [ 6 ]

6 голосов
/ 01 февраля 2012

Каждое меню находится в блоке, и блоки могут быть установлены, чтобы быть видимыми для данной группы пользователей (уровень доступа). На админском сайте drupal: Структура / Блоки

2 голосов
/ 21 февраля 2011

Модуль меню на роль?

http://drupal.org/project/menu_per_role

1 голос
/ 28 февраля 2011

Пока вы используете блок в качестве меню, вы можете использовать доступ по ролям для настройки блока, предоставляемый ядром.

0 голосов
/ 21 февраля 2011

Я пришел к решению - вместо использования автоматически сгенерированных блоков меню для отображения, я создал один блок и поместил следующий код в мой модуль:

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

ThisВроде нормально работает.

0 голосов
/ 21 февраля 2011

Это не самое элегантное решение, но вы можете проверить доступ в теме.

0 голосов
/ 21 февраля 2011

Для перечисления меню эта функция работает: menu_get_names ();
Но у него нет никаких проверок прав доступа или крючков.
Где вы хотели ограничить список меню? если при редактировании узла вы можете изменить меню там через hook_form_alter.

...