Inhaltszugriffsmodul, das Menüverknüpfungen versteckt


10

Ich verwende das Content Access- Modul mit Drupal 7. Wenn ich den Knotenzugriff von einer bestimmten Rolle aus einschränke, wird auch der Link im Menü ausgeblendet.

Gibt es eine Möglichkeit, eingeschränkte Links im Hauptmenü anzuzeigen?


Wie erstellen Sie das Menü? programmatisch? oder mit admin UI bei admin/structure/menu/manage/main-menu/add?
AjitS

Ich füge ein Menü hinzu, wenn Inhalte erstellt werden. eine Option unten 'Menülink bereitstellen'.
Monymirza

Antworten:


1

Der Hauptzweck des Zugriffsinhaltssystems besteht darin, die Kontrolle darüber zu haben, was jeder Benutzer sehen kann, und jedes mögliche Sicherheitsproblem zu vermeiden. Dies ist das gewünschte Verhalten, und fast jedes Modul oder allgemeine ApI verwendet es, sodass Sie hierfür keine Standardlösungen finden.

Ich war in der gleichen Situation und die einzige Lösung, die ich gefunden habe, bestand darin, benutzerdefinierte Module zu erstellen und in meinem Fall direkt in der Menütabelle nach allen gewünschten Elementen zu fragen und die Berechtigungen selbst zu überprüfen, um entweder einen Link anzuzeigen oder einfach ein Titel des Inhalts, wenn der Benutzer keine Berechtigung zum Anzeigen hat.


Muss ich damit das Inhaltszugriffsmodul verwenden oder nicht?
Monymirza

Das Menü selbst zeigt niemals die blockierten Knoten an. Ich würde ein Modul erstellen, um die Knoten des Menüs abzurufen. Anschließend können Sie für jeden Knoten einen Link anzeigen (wenn der Benutzer keinen Zugriff hat, wird eine 403-Seite angezeigt) oder die Berechtigungen des Inhaltszugriffsmoduls für jeden Knoten überprüfen und keinen Link anzeigen, wenn der Benutzer dies nicht tut Ich habe keinen Zugang.
David Ruiz

1

Ich habe dies über ein benutzerdefiniertes Modul getan:

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

Ich bin mir ziemlich sicher, dass Sie ein benutzerdefiniertes Modul schreiben müssen, um damit umzugehen. Hier ist meine Idee: Lockern Sie die Zugriffsbeschränkungen für Inhalte, dh lassen Sie Benutzer Ihre Inhalte anzeigen. Dann muss Ihr benutzerdefiniertes Modul hook_node_load () implementieren und eine 403-HTTP-Antwort ausgeben, wenn Knoten geladen werden, die Ihre Benutzer nicht sehen sollten. Außerdem sollte hook_permission () implementiert werden, damit Sie den Zugriff auf der Berechtigungsseite einfach konfigurieren können.

Hier ist ein kurzes Beispiel, in dem der gesamte Knoten ausgeblendet und nach Inhaltstyp und Berechtigung gefiltert wird:

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

Oder Sie können einige der Knotenfelder ausblenden, anstatt eine 403 zurückzugeben. Dies wird jedoch gemäß der API-Dokumentation für hook_node_load () nicht empfohlen.


Ich füge ein Menü hinzu, wenn Inhalte erstellt werden. eine Option unten 'Menülink bereitstellen'.
Monymirza

Muss ich damit das Inhaltszugriffsmodul verwenden oder nicht?
Monymirza

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.