Модуль доступу до вмісту приховує посилання меню


10

Я використовую модуль доступу до вмісту з Drupal 7. Коли я обмежую доступ до вузла від певної ролі, він також приховує посилання в меню.

чи є спосіб відображення обмежених посилань у головному меню?


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

я додаю меню під час створення вмісту. опція внизу "Надати посилання на меню".
монімірза

Відповіді:


1

Основна мета системи вмісту доступу - мати контроль над тим, що може бачити кожен користувач, і уникати всіх можливих проблем безпеки. Це бажана поведінка, і майже кожен модуль або загальний ApI використовує його, тому ви не знайдете для цього рішення за замовчуванням.

Я опинився в тій же ситуації, і єдине знайдене нами рішення - створити спеціальні модулі і, в моєму випадку, запитувати безпосередньо в таблицю меню, щоб отримати всі потрібні мені елементи, і перевірити дозволи, щоб відобразити посилання або просто заголовок вмісту, коли користувач не має дозволу на його перегляд.


мені доведеться використовувати з ним модуль доступу до вмісту чи ні?
монімірза

Меню саме по собі ніколи не відображатиме заблоковані вузли. Я б створив модуль для отримання вузлів меню. Тоді ви можете вибрати посилання для кожного вузла (якщо користувач не має доступу, він побачить сторінку 403), або перевірити дозволи модуля доступу до вмісту для кожного вузла, а також не відображати посилання, якщо користувач не не маю доступу.
david ruiz

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

Я впевнений, що вам доведеться написати спеціальний модуль для вирішення цього питання. Ось моя ідея: зніміть обмеження доступу до вмісту, тобто дозвольте користувачам переглядати ваш вміст. Тоді ваш користувальницький модуль повинен реалізовувати прив'язку___код () та виводити відповідь 403 HTTP під час завантаження вузлів, які ваші користувачі не бачать. Також має бути реалізований прикріплення__право (), так що ви зможете легко налаштувати доступ на сторінці дозволу.

Ось короткий приклад, який приховує весь вузол та фільтрує за типом вмісту та дозволом:

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 для kuk_node_load ()


я додаю меню під час створення вмісту. опція внизу "Надати посилання на меню".
монімірза

мені доведеться використовувати з ним модуль доступу до вмісту чи ні?
монімірза

0

Ви можете використовувати модуль "Завжди видимий".

Більш детальна відповідь на ваше запитання тут https://drupal.stackexchange.com/a/52149/7313


Я використовував, але рішення не було.
монімірза

Що ви маєте на увазі "немає рішення"? Ви встановили цей модуль?
Євген Фіделін

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