Skip to content

Instantly share code, notes, and snippets.

@andronex
Last active April 7, 2022 13:18
Show Gist options
  • Save andronex/f9a6fb64ceab5412d55d242e97bea1c3 to your computer and use it in GitHub Desktop.
Save andronex/f9a6fb64ceab5412d55d242e97bea1c3 to your computer and use it in GitHub Desktop.
Создание юзера и добавление его в группу (hook для FormIt MODX Revolution) - 2 способа + отдельным файлом с запросом Ajax
<?php
$allFormFields = $hook->getValues();
if(is_array($allFormFields)){
foreach($allFormFields as $k => $v){
if (filter_var($v, FILTER_VALIDATE_EMAIL)) {
$mail = trim($v);
}
}
if($mail){
$keys = array('name', 'order-name'); //имена полей формы с именами юзеров <input name="name"> и т.п.
foreach($keys as $key){
if(isset($allFormFields[$key])){
$name = $allFormFields[$key];
break;
}
}
$count = $modx->getCount('modUserProfile', array('email' => $mail)); //проверяем наличие юзера по e-mail
// Если такого пользователя нет
if($count == 0) {
$pass = md5($mail);
$user = $modx->newObject('modUser', array('username' => $name ? $name : 'Неизвестно имя'));
$user->set('password', $pass);
$profile = $modx->newObject('modUserProfile');
$user->addOne($profile);
// Назначаем дополнительные поля
$profile->set('fullname', $name ? $name : 'Неизвестно имя');
$profile->set('email', $mail);
$profile->save();
$user->save();
//добавляем в группу с ID = 2
$user->joinGroup(2, null, null);
}
/*else
$modx->log(modX::LOG_LEVEL_ERROR, print_r('Юзер уже существует', true));*/
}
}
return true;
<?php
$allFormFields = $hook->getValues();
if(is_array($allFormFields)){
foreach($allFormFields as $k => $v){
if (filter_var($v, FILTER_VALIDATE_EMAIL)) {
$mail = trim($v);
}
}
if($allFormFields['accept'] != 1) {
$hook->addError('accept', 'Чтобы зарегистрироваться, вы должны принять Условия пользовательского соглашения путём постановки галочки!');
return false;
}
if($mail){
if(isset($allFormFields['level'])) $level_group = $allFormFields['level'];
$count = $modx->getCount('modUserProfile', array('email' => $mail));
// Если такого пользователя нет, то пробуем его зарегистрировать
if($count == 0) {
// Определяем группу и роль нового юзера
$group = $modx->getObject('modUserGroup', array('name' => $level_group));
$userGroup = $group->get('id');
$role = $modx->getObject('modUserGroupRole', array('name' => 'Member'));
$userRole = $role->get('id');
// Присваиваем значения для последующей регистрации
$options = array(
'username' => $mail,
'passwordnotifymethod' => 's',
'email' => $mail,
'fullname' => 'Ваши ФИО?',
'extended' => array('paid' => false, 'oldlevel' => 'new'),
'active' => true
);
$options['groups'] = array(array('usergroup' => $userGroup, 'role' => $userRole));
// Запускаем стандартный процессор регистрации
$response = $modx->runProcessor('security/user/create', $options);
if ($response->isError()) {
$errors = $response->response['errors'];
$modx->log(modX::LOG_LEVEL_ERROR, print_r($modx->error->failure($response->getMessage()), true));
}
else {
$userArray = $response->getObject();
//$modx->log(modX::LOG_LEVEL_ERROR, print_r($userArray, true));
return true;
}
}
else
$modx->log(modX::LOG_LEVEL_ERROR, print_r('Юзер уже существует', true));
$hook->addError('mail', 'Вы уже зарегистрированы! Повторная регистрация не требуется!');
}
}
return false;
<?php
//шлём заголовки
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json; charset=utf-8');
// инициализация MODX API
define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)) . '/core/config/config.inc.php';
require_once MODX_BASE_PATH . 'index.php';
// Включаем обработку ошибок
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'FILE');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->getService('error','error.modError');
$modx->error->message = null;
//проверем указан ли e-mail
if(!$_POST['sub_email']){
$out = array('success' => false, 'message' => 'Не указан e-mail!');
die(json_encode($out));
}
//принимаем e-mail и фильтруем его
if(!$email = filter_var($_POST['sub_email'], FILTER_SANITIZE_EMAIL)){
$out = array('success' => false, 'message' => 'Неверный e-mail!');
die(json_encode($out));
}
if($profile = $modx->getObject('modUserProfile', array('email' => $email))){
$out = array('success' => false, 'message' => 'Вы уже подписаны!');
die(json_encode($out));
}
if($email){
$pass = md5($email . time());
$user = $modx->newObject('modUser', array('username' => $email));
$user->set('password', $pass);
$profile = $modx->newObject('modUserProfile');
$user->addOne($profile);
// Назначаем дополнительные поля
$profile->set('fullname', 'Подписчик ' . $email);
$profile->set('email', $email);
if(!$user->save()){
$out = array('success' => false, 'message' => 'Не удалось оформить подписку! Ошибка сервера!');
die(json_encode($out));
}
//добавляем в группу с ID = 2
$user->joinGroup(2, null, null);
}
$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY, 'У вас новый подписчик: ' . $email);
$modx->mail->set(modMail::MAIL_FROM, $modx->getOption('mail_smtp_user'));
$modx->mail->set(modMail::MAIL_SENDER, $modx->getOption('mail_smtp_user'));
$modx->mail->set(modMail::MAIL_SUBJECT, 'Подписка ' . MODX_HTTP_HOST);
$modx->mail->address('to', $modx->getChunk('email'));
$modx->mail->setHTML(true);
if (!$modx->mail->send()) {
$modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$modx->mail->mailer->ErrorInfo);
}
$modx->mail->reset();
$out = array('success' => true, 'message' => 'Вы успешно подписаны на нашу рассылку! Мы НЕ рассылаем спам!');
die(json_encode($out));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment