Як можливо модулю виявити, коли Drupal видає сторінку "заборонений доступ"?
Я знаю, як це зробити з Drupal 6; Мені потрібно знати, як це зробити з Drupal 7.
Як можливо модулю виявити, коли Drupal видає сторінку "заборонений доступ"?
Я знаю, як це зробити з Drupal 6; Мені потрібно знати, як це зробити з Drupal 7.
Відповіді:
Ви можете встановити, які сторінки відображатимуться при помилках 403 та 404 (адміністратор / налаштування / повідомлення про помилки).
Я думаю, ви можете додати нову сторінку у свою hook_menu()
, а потім встановити цю сторінку як зворотний виклик 403 помилок. Коли ви звертаєтесь до вашого зворотного дзвінка в користувальницьке меню, ви знаєте, що виводить сторінку "доступ заборонено"!
Я роблю це в Boost 7.x. Це не дуже, але це справді справляється.
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;
// …
}
// …
}
// …
}
У Drupal 7 функцією, яка повертає вже встановлені заголовки HTTP, є drupal_get_http_header () , яка вимагає ім'я заголовка HTTP як параметр. Дивлячись на authorize_access_denied_page () , і drupal_fast_404 () код ясно , які значення для передачі цієї функції.
// 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;
}
Коли заголовок "Статус" починається з 403 , то Drupal виводить сторінку з забороненим доступом.
Переконайтеся, що дзвінок drupal_get_http_header('Status')
відбувається пізно. Дзвінки під час hook_init()
занадто рано, але при виклику під час hook_page_alter()
(або будь-якого гачка попередньої обробки теми) буде оновлена інформація заголовка.
drupal_get_http_header('Status')
повертається NULL
.
Ваш модуль може перехопити значення " Default 403 (access denied) page
", яке змінюється сторінкою " Administer > Site configuration > Error reporting
":
В hook_enable
, використовуючи variable_get
/ variable_set
, скопіювати наявне значення для вторинних змінних і замінити змінний за власним шляху (який ви зареєструвалися з допомогою hook_menu
).
змінити форму "Повідомлення про помилки" за допомогою hook_form_FORM_ID_alter
читання з / запису на вторинну змінну
Якщо ви хочете бути повністю непомітними для користувача, зворотний дзвінок на сторінку може зателефонувати drupal_goto( the_value_of_the_secondary_variable )
.
В hook_disable
, відновіть значення з вторинної змінної.
І це все, ваш модуль отримує сповіщення в чистому вигляді (і невидиме для користувача), коли спрацьовує "Заборонено доступ".
Невже ви могли використовувати get_headers()
функцію PHP ?
Першим елементом у масиві, що повертається, буде код відповіді. Якщо він містить "403", то Drupal повернув сторінку "заборонений доступ".
Я не впевнений, де було б найкраще місце для дзвінка. Можливо hook_exit()
, залежно від ваших потреб:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_exit/6
Це найпростіший спосіб виявити заборонений доступ (403) та сторінку не знайдено (404) у 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']);
Для цього можна використовувати модуль Панелі .
Модуль Панелі дозволяє адміністратору сайту створювати спеціальні макети для багаторазового використання. По суті, це диспетчер вмісту, який дозволяє візуально спроектувати макет і розмістити вміст у межах цього макета. Інтеграція з іншими системами дозволяє створювати вузли, які використовують це, цільові сторінки, які використовують це, і навіть переосмислювати системні сторінки, такі як систематика та вузлова сторінка, щоб ви могли налаштувати макет свого сайту з дуже дрібними дозволами.