Давно забытая проблема с подменой источника изображения на ссылку выхода из системы, регулярно о ней забываю, вот и решил законспектировать.
Раньше пользовался громоздким регулярным выражением, но есть и другой способ: написание нескольких строк кода в своем модуле, который обычно идет почти с каждым проектом.
Основная хитрость в использовании hook_translated_menu_link_alter() - чтобы его использовать нужно в массиве options для элемента меню разрешить перекрытие $items['logout']['options']['alter'] = TRUE;
Обращение к пункту меню выхода перенаправляется на свою функцию, которая в данном случае проверяет уникальный для сессии пользователя маркер.
Код написан для drupal 6
<?php
/**
* Implementation of hook_menu_alter()
*
* Разрешаем перекрытие вывода для пункта выхода
* и перенаправляем его на свою функцию.
*/
function andy_menu_alter(&$items) {
$items['logout']['options']['alter'] = TRUE;
$items['logout']['page callback'] = 'andy_logout';
}
/**
* Implementation of hook_translated_menu_link_alter()
*
* Добавляем уникальный маркер, зависящий от сессии.
*/
function andy_translated_menu_link_alter(&$item, $map) {
if ($item['href'] == 'logout' && user_is_logged_in()) {
$item['href'] = 'logout/'.drupal_get_token();
}
}
/**
* Menu callback
*
* Проверяем маркер поступивший из меню с системным.
*/
function andy_logout($token = NULL) {
if (drupal_valid_token($token)) {
user_logout();
}
else {
print '?';
exit();
}
}
?>