W jaki sposób moduł może wykryć, kiedy Drupal wysyła stronę „odmowy dostępu”?
Wiem, jak to zrobić za pomocą Drupala 6; Muszę wiedzieć, jak to zrobić w Drupal 7.
W jaki sposób moduł może wykryć, kiedy Drupal wysyła stronę „odmowy dostępu”?
Wiem, jak to zrobić za pomocą Drupala 6; Muszę wiedzieć, jak to zrobić w Drupal 7.
Odpowiedzi:
Możesz ustawić, które strony będą wyświetlane, gdy wystąpią błędy 403 i 404 (administrator / ustawienia / raportowanie błędów).
Myślę, że możesz dodać nową stronę do swojej hook_menu(), a następnie ustawić tę stronę jako wywołanie zwrotne błędu 403. Po naciśnięciu niestandardowego menu zwrotnego menu wiesz, że wyświetlasz stronę „odmowa dostępu”!
Robię to w Boost 7.x. To nie jest ładne, ale wykonuje zadanie.
function boost_page_delivery_callback_alter(&$callback, $set = FALSE) {
if ($callback == 'drupal_deliver_html_page') {
$callback = 'boost_deliver_html_page';
}
}
function boost_deliver_html_page($page_callback_result) {
global $_boost;
// Menu status constants are integers; page content is a string or array.
if (is_int($page_callback_result)) {
// @todo: Break these up into separate functions?
switch ($page_callback_result) {
// …
case MENU_ACCESS_DENIED:
// 403 page.
$_boost['menu_item']['status'] = 403;
break;
// …
}
// …
}
// …
}
W Drupal 7 funkcją zwracającą już ustawione nagłówki HTTP jest drupal_get_http_header () , która wymaga nazwy nagłówka HTTP jako parametru. Patrząc na authorize_access_denied_page () i drupal_fast_404 () kod jasno jakie wartości przekazać do tej funkcji.
// authorize_access_denied_page()
drupal_add_http_header('Status', '403 Forbidden');
watchdog('access denied', 'authorize.php', NULL, WATCHDOG_WARNING);
drupal_set_title('Access denied');
return t('You are not allowed to access this page.');
// drupal_fast_404()
if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {
drupal_add_http_header('Status', '404 Not Found');
$fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
// Replace @path in the variable with the page path.
print strtr($fast_404_html, array('@path' => check_plain(request_uri())));
exit;
}
Gdy nagłówek „Status” zaczyna się od 403 , wtedy Drupal wyświetla stronę odmowy dostępu.
Upewnij się, że wezwanie do drupal_get_http_header('Status')nastąpi późno. Wywołanie podczas hook_init()jest zbyt wcześnie, ale wywołanie go podczas hook_page_alter()(lub dowolnego haka wstępnego przetwarzania motywu) będzie zawierało zaktualizowane informacje nagłówka.
drupal_get_http_header('Status')zwrot NULL.
Twój moduł może przechwycić wartość „ Default 403 (access denied) page”, która jest modyfikowana przez stronę „ Administer > Site configuration > Error reporting”:
W hook_enable, używając variable_get/ variable_set, skopiuj istniejącą wartość do zmiennej wtórnej i zastąp zmienną własną ścieżką (którą zarejestrowałeś hook_menu).
zmień formularz „Raportowanie błędów”, używając hook_form_FORM_ID_alterdo odczytu z / do zmiennej wtórnej
Jeśli chcesz być całkowicie niewidoczny dla użytkownika, oddzwanianie do strony może zadzwonić drupal_goto( the_value_of_the_secondary_variable ).
W hook_disable, przywrócić wartość ze zmiennej wtórnym.
I to wszystko, twój moduł jest powiadamiany w czysty sposób (i niewidoczny dla użytkownika), gdy zostanie wywołane „Odmowa dostępu”.
Na pewno możesz użyć get_headers()funkcji PHP ?
Pierwszym zwróconym elementem w tablicy będzie kod odpowiedzi. Jeśli zawiera „403”, Drupal zwrócił stronę „odmowy dostępu”.
Nie jestem pewien, gdzie byłoby to najlepsze miejsce do połączenia. Prawdopodobnie w hook_exit()zależności od potrzeb:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6
Jest to najprostszy sposób na wykrycie odmowy dostępu (403) i nie znaleziono strony (404) w Drupal 7.
// get the menu router item for the current page
$router_item = menu_get_item();
// if there is no router item, this page is not found
$is_page_not_found_404 = empty($router_item);
// if 'access' is empty for the router item, access is denied
$is_access_denied_403 = empty($router_item['access']);
Możesz do tego użyć modułu Panele .
Moduł Panele pozwala administratorowi strony tworzyć niestandardowe układy do wielu zastosowań. Jego rdzeniem jest menedżer zawartości typu przeciągnij i upuść, który pozwala wizualnie zaprojektować układ i umieścić zawartość w tym układzie. Integracja z innymi systemami pozwala tworzyć węzły, które tego używają, strony docelowe, które tego używają, a nawet zastępują strony systemowe, takie jak taksonomia i strona węzłów, dzięki czemu można dostosować układ witryny z bardzo drobnymi uprawnieniami.