Módulo de acceso al contenido que oculta los enlaces del menú

10

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?

monymirza
fuente
¿Cómo estás creando el menú? programáticamente? o usando la interfaz de usuario de administrador en admin/structure/menu/manage/main-menu/add?
AjitS
Estoy agregando menú cuando se crea contenido. una opción en la parte inferior "Proporcionar un enlace de menú".
monymirza

Respuestas:

1

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.

david ruiz
fuente
¿tendré que usar el módulo de acceso al contenido con él o no?
monymirza
El menú por sí solo nunca mostrará los nodos bloqueados. Crearía un módulo para buscar los nodos del menú. Luego, puede elegir mostrar un enlace para cada nodo (si el usuario no tiene acceso verá una página 403), o verificar los permisos del módulo de acceso al contenido para cada nodo, y no mostrar un enlace si el usuario no No tengo acceso.
david ruiz
1

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);
       }
     }
   }
monymirza
fuente
0

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 ()

ermannob
fuente
Estoy agregando menú cuando se crea contenido. una opción en la parte inferior "Proporcionar un enlace de menú".
monymirza
¿tendré que usar el módulo de acceso al contenido con él o no?
monymirza
0

Puede usar el módulo "Siempre visible".

Una respuesta más detallada sobre su pregunta está aquí /drupal//a/52149/7313

Eugene Fidelin
fuente
Solía ​​pero no hay solución.
monymirza
¿Qué quieres decir con "sin solución"? ¿Has instalado ese módulo?
Eugene Fidelin
Sí, usé este módulo. y esto no funciona para mí ...
monymirza