web-dev-qa-db-fra.com

Module d'accès au contenu masquant les liens du menu

J'utilise Content Access module avec Drupal 7. lorsque je restreins l'accès aux nœuds à un rôle spécifique, il masque également le lien dans le menu.

existe-t-il un moyen d'afficher les liens restreints dans le menu principal?

10
monymirza

Je l'ai fait via un module personnalisé:

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

Le but principal du système de contenu d'accès est de contrôler ce que chaque utilisateur peut voir et d'éviter tout problème de sécurité possible. C'est le comportement souhaité et presque tous les modules ou ApI généraux l'utilisent, vous ne trouverez donc pas de solutions par défaut pour cela.

J'ai été dans la même situation et la seule solution que j'ai trouvée a été de créer un module personnalisé et, dans mon cas, d'interroger directement le tableau de menu pour obtenir tous les éléments que je veux, et de vérifier moi-même les autorisations pour afficher un lien , ou simplement un titre du contenu lorsque l'utilisateur n'est pas autorisé à le voir.

1
david ruiz

Vous pouvez utiliser le module "Toujours visible".

Une réponse plus détaillée à votre question est ici https://drupal.stackexchange.com/a/52149/731

0
Eugene Fidelin

Je suis sûr que vous devrez écrire un module personnalisé pour y faire face. Voici mon idée: assouplissez les restrictions d'accès au contenu, c'est-à-dire que les utilisateurs puissent voir votre contenu. Ensuite, votre module personnalisé doit implémenter hook_node_load () et générer une réponse HTTP 403 lors du chargement de nœuds que vos utilisateurs ne devraient pas voir. De plus, hook_permission () doit être implémenté, vous pourrez donc configurer facilement l'accès sur la page d'autorisation.

Voici un exemple rapide masquant le nœud entier et filtrant par type de contenu et autorisation:

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

Ou vous pouvez masquer certains des champs de noeud, au lieu de renvoyer un 403. Mais cela est déconseillé selon documentation API pour hook_node_load ()

0
ermannob