Estoy usando el módulo de acceso al contenido con Drupal 7. cuando restrinjo el acceso a los nodos desde un rol específico, también oculta el enlace en el menú.
¿Hay alguna forma de mostrar enlaces restringidos en el menú principal?
Estoy usando el módulo de acceso al contenido con Drupal 7. cuando restrinjo el acceso a los nodos desde un rol específico, también oculta el enlace en el menú.
¿Hay alguna forma de mostrar enlaces restringidos en el menú principal?
Respuestas:
El objetivo principal del sistema de contenido de acceso es tener el control de lo que cada usuario puede ver y evitar cualquier posible problema de seguridad. Este es el comportamiento deseado y casi todos los módulos o ApI generales lo usan, por lo que no encontrará soluciones predeterminadas para esto.
He estado en la misma situación y la única solución que encontré fue crear módulos personalizados y, en mi caso, consultar directamente a la tabla de menú para obtener todos los elementos que quiero, y verificar los permisos para mostrar un enlace , o simplemente un título del contenido cuando el usuario no tiene permisos para verlo.
Lo hice a través del módulo personalizado:
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);
}
}
}
Estoy bastante seguro de que tendrá que escribir un módulo personalizado para lidiar con esto. Aquí está mi idea: relajar las restricciones de acceso al contenido, es decir, permitir que los usuarios vean su contenido. Luego, su módulo personalizado debe implementar hook_node_load () y generar una respuesta HTTP 403 al cargar nodos que sus usuarios no deberían ver. También se debe implementar hook_permission (), por lo que podrá configurar el acceso fácilmente en la página de permisos.
Aquí hay un ejemplo rápido que oculta todo el nodo y filtra por tipo de contenido y permiso:
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();
}
}
}
O puede ocultar algunos de los campos de nodo, en lugar de devolver un 403. Pero esto se desaconseja de acuerdo con la documentación de la API para hook_node_load ()
Puede usar el módulo "Siempre visible".
Una respuesta más detallada sobre su pregunta está aquí /drupal//a/52149/7313
admin/structure/menu/manage/main-menu/add
?