ertttert
menu_router
и изменении таблиц menu_link
(например, во время активации нового модуля) модули имеют возможность изменить любой элемент меню, реализовав функцию hook_menu_alter()
. Например, элемент меню Log off
(Выход) выполняет выход текущего пользователя с помощью вызова user_logout()
, который уничтожает сеанс этого пользователя, а затем перенаправляет его на домашнюю страницу сайта.
Функция user_logout()
находится в файле modules/user/user.pages.inc
, поэтому в элементе меню для пути Drupal определен ключ file
. Так что обычно Drupal загружает файл modules/user/user.pages.inc
и выполняет обратный вызов страницы user_logout()
при щелчке пользователя на ссылке Log out
(Выход) в блоке навигации. Изменим это поведение, чтобы перенаправлять пользователя после выхода на сайт drupal.org:
До выполнения нашей реализации/** * Реализация hook_menu_alter(). * * @param array $items * Элементы меню, снабженные ключами из пути. */ function menufun_menu_alter( &$items) {// Замена обратного вызова 'user_logout' обращением к нашему обратному вызову $items['logout']['page callback'] = 'menufun_user_logout'; $items['logout']['access callback'] = 'user_is_logged_in';// Теперь Drupal не нужно загружать файл user.pages.inc, // т.к. будет вызываться функция menufun_user_logout(), // которая находится в нашем модуле – и уже в области видимости. unset( $items['logout']['file']) ; }/** * Обратный вызов меню; выполняет выход текущего пользователя * и его перенаправление на drupal.org. * Это измененная версия user_logout(). */ function menufun_user_logout() { global $user;watchdog( 'menufun', 'Session closed for %name.',array( '%name' => $user->name)) ;// Уничтожение текущего сеанса: session_destroy() ;// Выполнение операции logout хука user, чтобы при // необходимости модули могли отреагировать на выход. module_invoke_all( 'user', 'logout', NULL, $user) ;// Загрузка анонимного пользователя, чтобы глобальный объект // $user был коррекнтым для всех реализаций hook_exit(). $user =drupal_anonymous_user() ;drupal_goto( 'http://drupal.org/
') ; }
hook_menu_alter()
элемент меню для пути выхода имел следующий вид:
А после его изменения обратный вызов страницы замененarray( 'access callback' => 'user_is_logged_in','file' => 'user.pages.inc','module' => 'user','page callback' => 'user_logout','title' => 'Log out','weight' => 10,)
menufun_user_logout
:
array( 'access callback' => 'user_is_logged_in','module' => 'user','page callback' => 'menufun_user_logout','title' => 'Log out','weight' => 10,)
Всего комментариев: 0 | |