На самом деле, то, что вы хотите сделать, это:
function YOURTHEME_preprocess_page(&$variables) {
// This disables message-printing on ALL page displays
$variables['show_messages'] = FALSE;
}
function YOURTHEME_preprocess_node(&$variables) {
$variables['messages'] = theme('status_messages');
}
Как это работает: ядро Drupal проверяет значение show_messages в theme_process_page. Если это TRUE (по умолчанию), тогда он вызывает theme ('status_messages'), как указано выше, и эффективно очищает хранилище сообщений, поэтому последующий вызов той же функции theme просто вернет пустую строку. Однако, если мы установим для этой переменной значение FALSE, это предотвратит вызов указанной функции темы на странице process_page, что позволит нам получать все сообщения с использованием одной и той же функции темы в выбранном нами шаблоне.
template_preprocess_node
поэтому drupal_get_messages пуст, когда вы вызываете его.