Модуль Content Access скрывает ссылки меню


10

Я использую модуль доступа к контенту с Drupal 7. Когда я ограничиваю доступ к узлу из определенной роли, он также скрывает ссылку в меню.

Есть ли способ показать ограниченные ссылки в главном меню?


как вы создаете меню? программно? или используя интерфейс администратора на admin/structure/menu/manage/main-menu/add?
AjitS

я добавляю меню при создании контента. опция внизу «Предоставить ссылку меню».
monymirza

Ответы:


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

Я уверен, что вам придется написать собственный модуль, чтобы справиться с этим. Вот моя идея: ослабить ограничения доступа к контенту, то есть позволить пользователям просматривать ваш контент. Тогда ваш пользовательский модуль должен реализовать hook_node_load () и вывести HTTP-ответ 403 при загрузке узлов, которые ваши пользователи не должны видеть. Также должна быть реализована функция 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. Но это не рекомендуется в соответствии с документацией API для hook_node_load ()


я добавляю меню при создании контента. опция внизу «Предоставить ссылку меню».
monymirza

я должен буду использовать модуль доступа к контенту с этим или нет?
monymirza

0

Вы можете использовать «Всегда видимый» модуль.

Более подробный ответ на ваш вопрос здесь https://drupal.stackexchange.com/a/52149/7313


Я использовал, но нет решения.
monymirza

Что вы имеете в виду "нет решения"? Вы установили этот модуль?
Евгений Фиделин

да, я использовал этот модуль. и это не работает для меня ...
monymirza
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.