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?


¿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.


¿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);
       }
     }
   }

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.