Wie kann ich einen Link basierend auf einer Berechtigung ein- oder ausblenden?

7

Ich suche nach einer Möglichkeit, einen Link im Hauptmenü auszublenden / anzuzeigen, wenn der aktuelle Benutzer eine bestimmte Berechtigung hat. Der Menüpunkt wurde bereits erstellt und der Menüpunkt ist mit einem Knoten verknüpft, der von hook_node_access () gesteuert wird.

Camsoft
quelle
Womit verknüpft der Menüpunkt?
Kiamlaluno
Es ist mit einem Knoten verbunden, aber die Knotenzugriffsregeln sind in hook_node_access () definiert, da ich bereits Knotenzugriffsregeln habe, die von einem anderen Modul definiert wurden. Ich verwende hook_node_access (), um einen Knoten auf Benutzer mit einer bestimmten Berechtigung zu beschränken.
Camsoft

Antworten:

4

Standardmäßig blendet Drupal alle Menüelemente aus, auf die der Benutzer keinen Zugriff hat. Am einfachsten ist es daher, den ausgewählten Zugriff für die Seite zu benötigen, auf die das Menüelement verweist.

googletorp
quelle
Leider funktioniert dies nicht, da der Knoten nicht die Tabelle node_access verwendet und stattdessen hook_node_access () verwendet und die Menüberechtigungen die Funktion hook_node_access () anscheinend ignorieren.
Camsoft
Hook_node_access funktioniert nur für das Modul, das den Knoten IIRC definiert.
Googletorp
In Drupal 7 kann hook_node_access () von jedem Modul aus implementiert werden, nicht nur von denjenigen, die einen Inhaltstyp definieren.
Kiamlaluno
1
hook_node_access () kann von jedem Modul aus implementiert werden und verhindert bei korrekter Implementierung den Zugriff auf den Knoten. Dies betrifft aber leider nicht die Generierung der Menüpunkte. Wenn Sie sich den Code von menu_tree_check_access ansehen, sehen Sie, dass eine Auswahlabfrage mit dem Tag node_accessverwendet wird, um Zugriffsrechte abzurufen. Eine einfache Implementierung reicht also hook_node_access()nicht aus.
Berliner
2

Sie können den mit "node /% node" verknüpften Zugriffsrückruf mithilfe von hook_menu_alter () ändern und dann den Code für Ihren Zugriffsrückruf basierend auf dem Code von node_access () schreiben . Es gibt bestimmte Fälle, die Sie weiterhin behandeln möchten node_access(). Beispielsweise würden Benutzer mit der Berechtigung "Knotenzugriff umgehen" immer auf den Knoten zugreifen.

function mymodule_menu_alter(&$items) {
  if (isset($items['node/%node'])) {
    $items['node/%node']['access callback'] = 'mymodule_node_access';
  }
}

Beachten Sie, dass der Zugriffsrückruf entscheidet, wer einen Link sehen und wer auf eine Seite zugreifen kann, wenn der Benutzer die URL direkt in die Adressleiste des Browsers schreibt.

kiamlaluno
quelle
1

Möglicherweise möchten Sie das Drupal-Modul menu_item_visibility berücksichtigen

So zitieren Sie die Projektseite:

Wenn Sie beispielsweise einen Link "Mein Konto" erstellen möchten, der auf / user verweist, haben sowohl anonyme als auch registrierte Benutzer Zugriff auf den Pfad / user, sodass beide den Link sehen, auch wenn anonyme Benutzer technisch gesehen kein Konto haben . Wenn Sie dieses Modul verwenden, können Sie Ihren Link "Mein Konto" nur für registrierte Benutzer sichtbar machen und ihn vor anonymen Benutzern verbergen.

Das Modul verwendet aus Gründen der Vertrautheit genau dieselbe Benutzeroberfläche, die für die Einstellungen der Blocksichtbarkeit verwendet wird.

Oder das menu_views- Modul, das einen auf Ansichten basierenden Ansatz für die Menügenerierung bietet (der meiner Meinung nach basierend auf dem Benutzer enthalten ist).

Therobyouknow
quelle