Как все непросто.
Во-первых, как и ожидалось, в хук не приходит ID пользователя. Проверьте, точно ли оно установлено в $_GET. Вы можете слегка усовершенствовать свой сниппет get_user:
<?php
if (isset($_GET["id"])) {
return $_GET["id"];
} else {
$modx->log(1, 'get_user: не установлен ID!');
return false;
}
И посмотреть, будет ли сыпаться что-то в лог ошибок MODX.
Во-вторых, этот код:
$profile->set('username', $hook->getValue('username'));
некорректен.
Дело в том, что в MODX есть неочевидный момент, где именно хранится информация о пользователе.
Каждый пользователь - это объект класса modUser, где хранится только базовая информация - username, пароль, активен/неактивен и т.д. И есть привязанный к каждому юзеру профиль - объект класса modUserProfile, где хранится расширенная информация - fullname, почта-телефоны-адреса и т.д. В профиле нет поля username, оно хранится с самом user-e и сохранять его отдельно не нужно.
Посмотреть, какая информация в каком классе хранится, можно здесь -
http://bobsguides.com/modx-object-quick-reference.html#modUserProfile