Решение проблемы с подменой изображения на выход из сеанса

Давно забытая проблема с подменой источника изображения на ссылку выхода из системы, регулярно о ней забываю, вот и решил законспектировать.

Раньше пользовался громоздким регулярным выражением, но есть и другой способ: написание нескольких строк кода в своем модуле, который обычно идет почти с каждым проектом.

Основная хитрость в использовании 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();
  }
}
?>