ertttert
Books-CMS.clan.su

Изменение элементов меню из других модулей

При перестройке таблицы 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
Имя *:
Email *:
Код *:


Бесплатный конструктор сайтов - uCoz