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

10

J'utilise le module d' accès au contenu 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?

monymirza
la source
comment créez-vous le menu? par programme? ou en utilisant l'interface utilisateur d'administration à admin/structure/menu/manage/main-menu/add?
AjitS
j'ajoute un menu lors de la création de contenu. une option en bas «Fournir un lien de menu».
monymirza

Réponses:

1

L'objectif 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 chaque module ou ApI général l'utilise, 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 la table 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.

david ruiz
la source
devrai-je utiliser le module d'accès au contenu avec ou non?
monymirza
Le menu en lui-même n'affichera jamais les nœuds bloqués. Je créerais un module pour récupérer les nœuds du menu. Ensuite, vous pouvez choisir d'afficher un lien pour chaque nœud (si l'utilisateur n'a pas accès, il verra une page 403), ou vérifier les autorisations du module d'accès au contenu pour chaque nœud, et ne pas afficher de lien si l'utilisateur ne le fait pas. n'y ai pas accès.
david ruiz
1

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

Je suis sûr que vous devrez écrire un module personnalisé pour y faire face. Voici mon idée: assouplir les restrictions d'accès au contenu, c'est-à-dire permettre aux utilisateurs de visualiser 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 la documentation de l'API pour hook_node_load ()

ermannob
la source
j'ajoute un menu lors de la création de contenu. une option en bas «Fournir un lien de menu».
monymirza
devrai-je utiliser le module d'accès au contenu avec ou non?
monymirza
0

Vous pouvez utiliser le module "Toujours visible".

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

Eugene Fidelin
la source
j'ai utilisé mais pas de solution.
monymirza
Que voulez-vous dire "pas de solution"? Avez-vous installé ce module?
Eugene Fidelin
oui j'ai utilisé ce module. et cela ne fonctionne pas pour moi ...
monymirza