Короч как-то раз пришлось делать регистрацию и авторизацию на одной странице. Комплект сниппетов Login не был готов к этому и пришлось колхозить регистрацию с добавлением пользователя в группу. 

Валидатор не стал юзать, просто сговнокодил if-ами =).

Крч код. 

<?php
$errors = array();
if (isset($_POST['register'])) {
    //  $username = $_POST['username'];
    $fullname = $_POST['fullname'];
    $password = $_POST['password'];
    $password_confirm = $_POST['password_confirm'];
    $email = $_POST['email'];
    if ($modx->getCount('modUserProfile', ['email' => $email])) {
        $errors['username'] = 'Email уже занят';
    }
    if (strlen($fullname) < 3) {
        $errors['fullname'] = 'Поле "ФИО" заполнено не верно';
    }
    if ($password != $password_confirm) {
        $errors['password'] = 'Пароли не совпадают!';
    }
    if (count($errors) > 0) {
        return $modx->parseChunk('login_tpl', ['reg.error' => implode('<br>', $errors), 'username' => $username, 'password' => $password, 'password_confirm' => $password_confirm, 'fullname' => $fullname, 'email' => $email]);
    }
    $user = $modx->newObject('modUser', array('username' => $email));
    $user->set('password', $password);
    $userProfile = $modx->newObject('modUserProfile');
    $userProfile->set('fullname', $fullname);
    $userProfile->set('email', $email);
    $success = $user->addOne($userProfile);
    if ($success) {
        $user->save();
        $modx->user = & $user;
        $modx->getUser();
        $groupname = 'Пользователи';
        if (!($modx->user->isMember($groupname))) {
            $modx->user->joinGroup($groupname);
            $userId = $modx->user->get('id');
            // fix for a bug in joinGroup()
            unset($_SESSION["modx.user.{$userId}.userGroups"]);
            $context = 'web';
            // get the attributes to reload
            $targets = explode(',', $modx->getOption('principal_targets', null, 'modAccessContext,modAccessResourceGroup,modAccessCategory,sources.modAccessMediaSource'));
            array_walk($targets, 'trim');
            // reload the attributes
            $modx->user->loadAttributes($targets, $context, true);
        }

        ////
        $url = $modx->makeUrl(2, '', '#signin');
        $modx->sendRedirect($url);
    } else {
        return $modx->parseChunk('login_tpl', ['errors' => 'Неизвестная ошибка']);
    }
} elseif (isset($_POST['login'])) {
    $c = array(
        'username' => $_POST['username'],
        'password' => $_POST['password']
    );
    $response = $modx->runProcessor('security/login', $c);
    if ($response->response['success'] == 1) {
        $url = $modx->makeUrl(7);
        $modx->sendRedirect($url);
    } else {
        return $modx->parseChunk('login_tpl', ['errors' => $response->response['message']]);
    }
} elseif (isset($_GET['logout'])) {
    $modx->runProcessor('/security/logout');
    $url = $modx->makeUrl(2);
    $modx->sendRedirect($url);
} else {
    if ($modx->user->isAuthenticated('web')) {
        $url = $modx->makeUrl(7);
        $modx->sendRedirect($url);
    }
    return $modx->getChunk('login_tpl');
}