Ich verwende hook_node_access()
, um Benutzern den Zugriff auf einige Knoten basierend auf benutzerdefinierten Kriterien zu verweigern. Ich möchte jedoch nicht, dass dieser Inhalt in einer Ansicht angezeigt wird, die ihn auflistet, wenn der Benutzer die Kriterien nicht erfüllt. Gibt es eine Möglichkeit, Ansichten bezüglich hook_node_access()
Implementierungen zu haben ?
14
hook_node_access()
es festgelegt wurde , nicht wirklich einhält, sollten Sie nur Folgendes tun: den Code des Moduls "Ansichten" ändern.hook_node_access()
Implementierungen nicht beachtet werden. Das Melden einer Problemumgehung ist "von vornherein" in Ordnung.Antworten:
Ich hatte die gleiche Frage vor einiger Zeit hier .
hook_node_access
wird vonviews
oder nicht erkanntmenus
. Es sollte nur als letzte Verteidigungslinie verwendet werden.Eine bessere Möglichkeit zu Steuerknoten Zugriff ist durch
hook_node_access_records
undhook_node_grants
wie hier und hier .quelle
hook_node_access () wird nur aufgerufen, wenn versucht wird, den vollständigen Knoten anzuzeigen. Dazu müssen Sie hook_node_access_records () und hook_node_grants () implementieren .
quelle
Views verwendet SQL, um die anzuzeigenden Knoten zu bestimmen. Leider wäre es aus Performance-Gründen für Drupal einfach nicht machbar, eine node_load für alle potenziellen Kandidaten durchzuführen und dann hook_node_access für jeden dieser Kandidaten aufzurufen. Stellen Sie sich eine Ansicht vor, die Tausende von Knoten zeigt (insbesondere bei Verwendung eines Pagers). Wenn die Logik nicht in SQL ausgeführt wird, weisen die Pager eine sehr ungewöhnliche Funktionalität auf. Drupal erzwingt daher, dass Sie dies tun, wie von rik erwähnt, indem Sie Zugriffsdatensätze in Ihrer Datenbank verwenden.
Das Erstellen von access_records ist einiges aufwändiger, wird aber mit SQL funktionieren. Daher empfehle ich, ein vorhandenes node_access-Modul zu verwenden, um Ihre Funktionalität nach Möglichkeit zu lösen, da es wahrscheinlich mithilfe von Zugriffsdatensätzen implementiert wird und daher mit Ansichten funktioniert.
Übrigens werden die Zugriffsdatensätze in der Tabelle node_access gespeichert (siehe unten): Durch die Kommentare für jede Spalte erhalten Sie einen Überblick über deren Zweck. Stellen Sie sich den Bereich als das System vor, das für den Knotenzugriff verwendet wird, und die GID als die Gruppe innerhalb eines Bereichs. Diese Gruppe kann über Berechtigungen zum Anzeigen, Aktualisieren und Löschen verfügen. Im Allgemeinen definiert jedes node_access-Modul einen oder mehrere Bereiche (manchmal können auch mehrere node_access-Module parallel arbeiten). Ein Benutzer hat in jedem Bereich ein oder mehrere Gids.
In Drupal werden allen Abfragen mit dem Tag "node_access" automatisch spezielle Logikfunktionen hinzugefügt. Weitere Informationen zum Taggen finden Sie in der Dokumentation . Diese spezielle Logik verknüpft die Tabelle "node_access" für jeden Bereich und fügt die Bedingung hinzu, dass der Benutzer über die entsprechende Berechtigung verfügt, wenn "gid" einer der auf einen Benutzer angewendeten Gids entspricht.
Dieses gesamte System ermöglicht es allen Abfragen, node_access ordnungsgemäß zu verarbeiten, sogar Abfragen zu zählen usw. Es ist sehr leistungsfähig, weist jedoch eine höhere Lernkurve auf als nur hook_node_access. Wenn immer möglich, können Sie durch die Verwendung eines vorhandenen node_access-Moduls diesen ganzen Kopfschmerz sparen.
quelle