Edycja: Brakowało mi części dotyczącej uprawnienia do „edycji własnego węzła”, ponieważ wtedy musisz nie tylko sprawdzić uprawnienia, ale także czy ten węzeł należy do bieżącego użytkownika. Zaktualizowałem swój przykład poniżej, ale powyższe wyjaśnienie pozostawiam bez zmian.
Czy pozycja menu poniżej węzła / nid (np. Węzeł / 1234 / coś)? Prawdopodobnie nie potrzebujesz nawet niestandardowego połączenia zwrotnego.
Jeśli zdefiniujesz ścieżkę menu jak w poniższym przykładzie, będzie ona wywoływać oddzwanianie dostępu (a zatem i oddzwanianie strony), jeśli przeglądasz prawidłowy węzeł.
'node/%node/something'
Oznacza to, że wywoła node_load (1234) dla powyższego przykładu i będzie kontynuował tylko wtedy, gdy zwrócony zostanie poprawny obiekt węzła. Możesz więc jak zwykle zdefiniować swoje uprawnienie za pomocą argumentów dostępu.
To powiedziawszy, napisanie wywołania zwrotnego dostępu jest naprawdę proste. To tylko funkcja, która odbierze argumenty zdefiniowane w argumentach dostępu. Na przykład, funkcja zwrotna domyślny dostęp jest user_access () i podczas definiowania twoje argumenty dostępu podoba 'access arguments' => array('a permission string')
, będzie to prowadzić do następującego zaproszenia: user_access('a permission string')
.
Jeśli masz wiele argumentów, zostaną one przekazane do funkcji jako drugi, trzeci itd. Aby uzyskać dostęp do aktualnie aktywnego węzła, możesz użyć menu_get_object () .
Możesz więc napisać oddzwonienie dostępu w ten sposób, ale znowu może nie być konieczne utworzenie takiego.
function yourmodule_access_check() {
global $user;
$node = menu_get_object();
return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}
Zamiast na stałe wpisywać ciąg uprawnień, możesz przekazać go jako argument funkcji lub cokolwiek chcesz zrobić.
$items['node/%node/edit']['access callback'] = 'admin_access_only';
i$node = menu_get_object();
w fn oddzwonienia,$node
nigdy nie wrócił niczym. Użyłem zamiast tego,$node = node_load(arg(1));
który działał ... Dalsze wyjaśnienia byłyby bardzo mile widzianeDrupal sam w sobie jest przykładem pisania kodu.
Prostszym przykładem jest agregator_menu () , który zawiera następujący kod.
W takim przypadku wywołanie zwrotne dostępu jest domyślnym ( user_access () ), a argumentami dostępu jest tablica zawierająca ciąg uprawnień. Kod nie może sprawdzić więcej niż pozwolenia; jeśli uprawnienia do sprawdzania są dwa lub warunki sprawdzania nie są tylko uprawnieniami, wówczas wywołanie zwrotne dostępu powinno być inne, w tym niestandardowe.
node_menu () definiuje niektóre menu, które używają wywołania zwrotnego innego niż domyślne. Funkcja zawiera następujący kod.
Funkcja zdefiniowana jako wywołanie zwrotne dostępu ( node_access () ) jest następująca:
Należy zwrócić uwagę na trzy punkty:
TRUE
jeśli użytkownik ma dostęp do menu iFALSE
jeśli użytkownik nie ma dostępu do menu.źródło
access callback
funkcję, wydaje się, że musi ona znajdować się w twoim.module
pliku, ponieważ Drupal nie może znaleźć jej wfile
deklaracji (przynajmniej dla mnie).