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?

Monymirza
quelle
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.

David Ruiz
quelle
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);
       }
     }
   }
Monymirza
quelle
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.

ermannob
quelle
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
0

Sie können das Modul "Immer sichtbar" verwenden.

Eine ausführlichere Antwort auf Ihre Frage finden Sie hier /drupal//a/52149/7313

Eugene Fidelin
quelle
Ich habe aber keine Lösung verwendet.
Monymirza
Was meinst du mit "keine Lösung"? Haben Sie dieses Modul installiert?
Eugene Fidelin
Ja, ich habe dieses Modul verwendet. und das funktioniert nicht für mich ...
Monymirza