Я використовую модуль доступу до вмісту з Drupal 7. Коли я обмежую доступ до вузла від певної ролі, він також приховує посилання в меню.
чи є спосіб відображення обмежених посилань у головному меню?
Я використовую модуль доступу до вмісту з Drupal 7. Коли я обмежую доступ до вузла від певної ролі, він також приховує посилання в меню.
чи є спосіб відображення обмежених посилань у головному меню?
Відповіді:
Основна мета системи вмісту доступу - мати контроль над тим, що може бачити кожен користувач, і уникати всіх можливих проблем безпеки. Це бажана поведінка, і майже кожен модуль або загальний ApI використовує його, тому ви не знайдете для цього рішення за замовчуванням.
Я опинився в тій же ситуації, і єдине знайдене нами рішення - створити спеціальні модулі і, в моєму випадку, запитувати безпосередньо в таблицю меню, щоб отримати всі потрібні мені елементи, і перевірити дозволи, щоб відобразити посилання або просто заголовок вмісту, коли користувач не має дозволу на його перегляд.
Я зробив це за допомогою спеціального модуля:
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);
}
}
}
Я впевнений, що вам доведеться написати спеціальний модуль для вирішення цього питання. Ось моя ідея: зніміть обмеження доступу до вмісту, тобто дозвольте користувачам переглядати ваш вміст. Тоді ваш користувальницький модуль повинен реалізовувати прив'язку___код () та виводити відповідь 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 ()
Ви можете використовувати модуль "Завжди видимий".
Більш детальна відповідь на ваше запитання тут https://drupal.stackexchange.com/a/52149/7313
admin/structure/menu/manage/main-menu/add
?