Создайте форму загрузки изображения:
<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="photo"/>
    <button type="submit">загрузить</button>
</form>
Создайте сниппет или отдельный файл (не забудьте подключится) и укажите его в атрибуте action, поместите следующие внутрь:
$user=$modx->getUser(); // получаем данные текущего пользователя
if(!$user){
    return;
}
$profile=$user->getOne('Profile'); // данные профиля полученного юзера
if(!$profile){
    return;
}
if (!empty($_FILES['photo'])) {
    $allowedExts = array("jpg", "jpeg", "gif", "png");  // допустимые форматы
    $extension = strtolower(end(explode(".", $_FILES["photo"]["name"])));
    if ((($_FILES["photo"]["type"] == "image/gif") 
        || ($_FILES["photo"]["type"] == "image/jpeg") 
        || ($_FILES["photo"]["type"] == "image/png") 
        || ($_FILES["photo"]["type"] == "image/pjpeg")) 
        && ($_FILES["photo"]["size"] < 5000000) // максимальный размер изображения
        && in_array($extension, $allowedExts)) 
    { 
        if($_FILES["photo"]["error"]>0){ 
            $answer="Неизвестная ошибка"; 
        }else{
            $uploadfile =$_SERVER['DOCUMENT_ROOT']."/img/".strtotime(date('Y-m-d H:i:s'))."_".$_FILES["photo"]["name"]; // путь и название будущего файла
            if(file_exists($uploadfile)){ 
                $answer="Файл с таким названием существует"; 
            }else{ 
                $answer="Ваше фото успешно обновлено"; 
                move_uploaded_file($_FILES['photo']['tmp_name'],$uploadfile); // загрузка изображения
                $profile->set('photo', $uploadfile); // запись в базу
            } 
        } 
    }else{
        $answer="Неверный файл, попробуйте выбрать другой файл!";
    } 
}else{
    $answer="Файл не найден, попробуйте повторить попытку!";
}
$profile->save();