Возникла на сайте задача создать кучу пользователей и разослать им уведомления (с кастомным сообщением). Как обычно, решил выполнить это с помощью родного MODX-процессора. Как оказалось, здесь не мало подводных камней имеется… Сразу опубликую итоговый код, а детали далее разберем. <?php
$modx->switchContext('web');
print '<pre>';
$site_url = $modx->getOption("site_url");
$msg = "
<p>Здравствуйте!</p> <p>Ваши данные для авторизации на сайте <a href='{$site_url}'>[[+sname]]</a>:</p> <p><strong>Логин:</strong> [[+uid]]<br /> <strong>Пароль:</strong> [[+pwd]]</p> <p>После авторизации на сайте вы сможете изменить свой пароль.</p> <p>С уважением,<br /> Администрация сайта.</p> ";$modx->setOption('signupemail_message', $msg);
$username = "username"; $email = "user_email"; $fullname = 'user_fullname';
$data = array(
"passwordnotifymethod" => 'g', // Указываем, что пароль надо сгенерировать
"username" => $username,
"email" => $email,
"fullname" => $fullname,
"active" => 1,
"passwordnotifymethod" => "e", // Данные регистрации надо отправить на почту пользователю
"groups" => array(
array(
"usergroup" => 1, // ID группы пользователей
"role" => 1, // Роль. 1 - Member
),
),
);
$modx->error->reset();
$response = $modx->runProcessor('security/user/create', $data);
if($response->isError()){ print_r($response->getResponse()); }
print "OK"; Первое: путаница. В системе есть две настройки: signupemail_message и websignupemail_message. Предполагаю, что это пережиток прошлого (времен MODX Evolution). Тогда было четкое разделение пользователей на системных манагеров и веб-пользователей. Хотя может просто закладывали основу, но так и не довели до ума. Так или иначе, но настройка websignupemail_message (шаблон письма для веб-пользователей) не используется, используется только signupemail_message. Второе: неприятность. При отправки письма пользователю, MODX формирует ссылку на сайт, да не просто ссылку, а ссылку на админ-панель. И переопределить это нельзя. 'surl' => $this->modx->getOption('url_scheme') . $this->modx->getOption('http_host') . $this->modx->getOption('manager_url'), Вот это совсем не круто. Поэтому мы в свой кастомный шаблон прописали свой $site_url. Можно было, конечно, задать $modx->setOption('manager_url', '/'), но все равно не круто. Третье: вообще досадная неприятность: MODX при обработке письма использует не парсер, а str_replace(). foreach ($placeholders as $k => $v) { $message = str_replace('[[+'.$k.']]',$v,$message); } В итоге нельзя ни системные настройки в шаблоне использовать, ни чанки-сниппеты, нифига.
т.е. получается, самое надёжное — руками, через xPDO?
Что ты сейчас имеешь ввиду? Через $modx->newObject('modUser')->save();?
Ну, типа того, плюс Profile
ну и в группы сразу приписать
Нет, это слишком много кода (проверка прав, генерация пароля, проверки (включая можно или нельзя использовать неуникальные емейлы), емейл-уведомления, события-плагины и т.п.). Не надо так :) Вот я привел вполне рабочий код. Это если программно. А во фронте традиционно используется компонент Login (на самом деле у нас не всегда), там совсем другие механизмы используются.
понял. в заблуждение ввело, что сверху — конечный результат :)