Używam, hook_node_access()
aby odmówić użytkownikom dostępu do niektórych węzłów na podstawie niestandardowych kryteriów. Nie chcę jednak, aby ta treść była wyświetlana w widoku z listą, jeśli użytkownik nie spełni kryteriów. Czy istnieje sposób, aby poglądy szanowały hook_node_access()
wdrożenia?
14
hook_node_access()
, należy zrobić tylko jedną rzecz: zmienić kod modułu Widoki.hook_node_access()
implementacje nie są przestrzegane. Ponieważ jest to „z założenia”, zgłaszanie obejścia jest w porządku.Odpowiedzi:
Miałem to samo pytanie jakiś czas temu tutaj .
hook_node_access
nie jest rozpoznawany przezviews
lubmenus
. Powinien być używany tylko jako ostatnia linia obrony.Lepszym sposobem kontroli dostępu do węzła jest
hook_node_access_records
ihook_node_grants
jak opisano tutaj i tutaj .źródło
Funkcja hook_node_access () jest wywoływana tylko podczas próby wyświetlenia pełnego węzła. Musisz zaimplementować hook_node_access_records () i hook_node_grants () .
źródło
Widoki wykorzystują SQL do określania węzłów do wyświetlenia. Niestety, ze względu na wydajność, po prostu nie byłoby możliwe, aby Drupal wykonał obciążenie węzła na wszystkich potencjalnych kandydatach, a następnie wywołał dostęp hook_node na każdym z nich. Wyobraź sobie widok, który pokazuje tysiące węzłów (szczególnie podczas korzystania z pagera). Jeśli logika nie jest wykonywana w SQL, pagery miałyby bardzo nietypową funkcjonalność, dlatego Drupal zmusza cię do zrobienia tego, jak wspomniano rik przy użyciu rekordów dostępu w bazie danych.
Wykonanie access_records to o wiele więcej pracy, ale sprawi, że będzie działać z SQL. Dlatego zalecam użycie istniejącego modułu node_access do rozwiązania twojej funkcjonalności tam, gdzie to możliwe, ponieważ prawdopodobnie zostanie ona zaimplementowana przy użyciu rekordów dostępu, a zatem będzie działać z widokami.
Nawiasem mówiąc, rekordy dostępu są przechowywane w tabeli node_access, jak pokazano poniżej: Poprzez komentarze do każdej kolumny można zrozumieć ich przeznaczenie. Pomyśl o królestwie jako o systemie używanym do dostępu do węzła, a gid jako o grupie w królestwie. Ta grupa może mieć uprawnienia do przeglądania, aktualizowania i usuwania. Zasadniczo każdy moduł node_access definiuje jedną lub więcej dziedzin (czasami wiele modułów node_access może również pracować równolegle). Użytkownik ma jedną lub więcej kategorii w każdej dziedzinie.
W Drupal do wszystkich zapytań, które mają znacznik „node_access” automatycznie dodana zostanie specjalna logika. Zobacz dokumentację, aby dowiedzieć się więcej o tagowaniu. Ta specjalna logika dołącza do tabeli „node_access” dla każdej dziedziny i dodaje warunek, że gdy „gid” jest równy jednej z linii zastosowanych do użytkownika, użytkownik ma odpowiednie uprawnienia.
Cały ten system pozwala wszystkim zapytaniom poprawnie obsługiwać dostęp do węzła, nawet zliczać zapytania itp. Jest bardzo wydajny, ale ma wyższą krzywą uczenia się niż tylko prosty hook_node_access. O ile to możliwe, użycie istniejącego modułu node_access może zaoszczędzić ci całego bólu głowy.
źródło