Ich habe eine benutzerdefinierte Entität. In ist ein Zugriffsrückruf definiert, der hook_entity_info()
aufgerufen wird, wenn ich auf die Entität zugreife. Auch in Ansichten, in denen ich gerenderte Objekte anzeigen möchte, wird das Objekt nur angezeigt, wenn der Benutzer das Objekt sehen darf.
Wenn ich jedoch die Ansicht so ändere, dass "Felder" anstelle von "gerenderten Entitäten" angezeigt werden, wird der Zugriffsrückruf nicht mehr aufgerufen, und Benutzer können alle Felder (und Eigenschaften) der Entität unabhängig von Berechtigungen anzeigen. Wenn Sie sich die ausgeführte Abfrage ansehen, ist dies sinnvoll, die Feldwerte werden zusammengefügt und die Entität wird nie wirklich geladen.
Wie sollte man also den Entitätszugriff für Ansichten implementieren, wenn Felder angezeigt werden (in Drupal 7)?
Ich habe festgestellt, wie bei Verwendung von hook_field_access in Ansichten nach Entitätstypen gesucht werden kann. Ich gehe jedoch davon aus, dass dies nur für verknüpfte Felder und nicht für Eigenschaften von Basisentitäten funktioniert, sodass dies nur ein Teil einer Lösung wäre.
nodes
Drupal betrifft .Antworten:
Angenommen, für Ihr Modul zur Bereitstellung von Entitäten ist die Views-Integration bereits eingerichtet, und Sie müssen sich keine Gedanken über die Paginierung machen . Sie können
hook_views_pre_render()
die Ergebnisse aufrufen und Ihren Zugriffsrückruf für jede Entität in Ihrer Basistabelle aufrufen und Einträge herausfiltern, die der Benutzer nicht herausfiltert Zugang haben zu:Wenn Paginierung ein Problem darstellt, ist es ein schwierigeres Problem. Durch Anpassen der Ansichtsergebnisse wird ein konsistenter Versatz unterbrochen (z. B. Seite 1 liefert möglicherweise 4 Ergebnisse, Seite 2 liefert möglicherweise 10 Ergebnisse). Außerdem können die Ergebnisse der SQL-Abfrage nicht an Informationen angepasst werden, die nur durch Ausführen von PHP bekannt sind.
In diesen Fällen müssen Sie Ihre Methode anpassen (z. B.
hook_views_query_alter()
wenn der Zugriffsrückruf auf einer DB-Abfrage basiert, Ihre View-Pager-Optionen geändert werden usw.), um den Zugriffsrückruf zu berücksichtigen, der die Ansicht manipuliert.quelle
... LIMIT 25 OFFSET 0
Die einzige Möglichkeit, die Paginierung am Laufen zu halten, besteht darin, vor Abschluss der Abfrage zu handeln. Ich kann meinen Zugriffsrückruf jedoch nicht in die Abfrage einbetten. Also kann es nicht gemacht werden?$query
Fall enthält das Ansichtsobjekt die Eigenschaft, welche Pager-Eigenschaft bearbeitet werden kann, um die geänderte Anzahl widerzuspiegeln.Am Ende habe ich es geschafft, eine Arbeitsmethode zu finden, die ähnlich funktioniert wie die Ansichten mit Knoten.
Stellen Sie in
hook_views_data()
(oderhook_views_data_alter()
) sicher, dass Sie denaccess query tag
Tabellenschlüssel hinzufügen . Sie können sehen, dass Ansichten dies auch für Knoten in tunnode_views_data()
.Fügen Sie dann Ihre eigene Implementierung von hinzu
hook_query_TAG_alter
. Dadurch wird jede Abfrage geändert, bei der dieses Tag hinzugefügt wird. Aufgrund unserer obigen Änderung wird dies automatisch auf alle Views-Datenlisten angewendet, das Tag kann jedoch auch manuell hinzugefügt werden .Es gibt einige großartige Tricks,
_node_query_node_access_alter()
die von node_query_node_access_alter () aufgerufen werden (Implementierung der Knotenmodule von hook_query_TAG_alter).quelle