Отправка Email о регистрации при оформлении заказа в miniShop2
Буквально на днях я столкнулся с вопросом, о котором как то не задумывался.
При оформлении заказа в minishop2 создается пользователь, но сам пользователь о собственной регистрации ничего не знает.
Как отправить пользователю письмо, с первоначальными регистрационными данными (логин, пароль)?
Стандартный комплект методов нашего любимого интернет-магазина такого не предусматривает. А значит руки в плечи и пишем плагин.
Насколько я понимаю, при регистрации пользователя со случайным паролем, пароль этот нигде не светится, и сохранить его не переписывая класс минишопа не получится. В событие он никак не попадет, только в виде хеша из объекта modUser. Значит в плагине нужно сгенерировать собственный случайный пароль, и сохранить его.
Для начала определимся с событием, на которое отрабатывает плагин. По идее это должно быть событие onUserSave с режимом NEW, но ведь наша задача предусматривает отправку писем, именно после оформления заказа, а не при любом создании пользователя.
Покопавшись в интернете, я наткнулся на статью в блоге Ильи Уткина, который в свою очередь сделал репост от Марата Марабара.
Автор предлагает использовать событие msOnChangeOrderStatus со следующей логикой
Меня не устроили два момента.
1. Изменение пароля пользователя происходит через процессор, который требует определенных прав. Нужно предварительно, авторизовать скрипт в админке. А это мне не нравится из соображений безопасности. Да и громоздко как то.
2. Стандартный процессор, шлет письмо, используя текст системной настройки signupemail_message, которая не поддерживает fenom и файловые элементы, да и количество плейсхолдеров ограничено. А я не хочу писать текст письма прямо в строке системной настройки. Я хочу создать привычным образом файл — шаблон письма, подставить удобные для меня плейсхолдеры, сделать верстку письма. В общем хотя бы как это сделано в стандартных шаблонах писем от miniShop2.
Оставив скрипт Марата, как основу, я переписал часть, касающуюся изменения пароля и отправки письма.
По моему получилось гибче и проще. Без процессоров, но с MODX API
При оформлении заказа в minishop2 создается пользователь, но сам пользователь о собственной регистрации ничего не знает.
Как отправить пользователю письмо, с первоначальными регистрационными данными (логин, пароль)?
Стандартный комплект методов нашего любимого интернет-магазина такого не предусматривает. А значит руки в плечи и пишем плагин.
Насколько я понимаю, при регистрации пользователя со случайным паролем, пароль этот нигде не светится, и сохранить его не переписывая класс минишопа не получится. В событие он никак не попадет, только в виде хеша из объекта modUser. Значит в плагине нужно сгенерировать собственный случайный пароль, и сохранить его.
Для начала определимся с событием, на которое отрабатывает плагин. По идее это должно быть событие onUserSave с режимом NEW, но ведь наша задача предусматривает отправку писем, именно после оформления заказа, а не при любом создании пользователя.
Покопавшись в интернете, я наткнулся на статью в блоге Ильи Уткина, который в свою очередь сделал репост от Марата Марабара.
Автор предлагает использовать событие msOnChangeOrderStatus со следующей логикой
- Определяем что статус заказа именно, новый
- Получаем пользователя, проверяем, что он зарегистрирован менее 10 секунд назад, то есть новый пользователь
- Ну и далее меняем пароль, сохраняем пользователя, шлем письмо
Меня не устроили два момента.
1. Изменение пароля пользователя происходит через процессор, который требует определенных прав. Нужно предварительно, авторизовать скрипт в админке. А это мне не нравится из соображений безопасности. Да и громоздко как то.
2. Стандартный процессор, шлет письмо, используя текст системной настройки signupemail_message, которая не поддерживает fenom и файловые элементы, да и количество плейсхолдеров ограничено. А я не хочу писать текст письма прямо в строке системной настройки. Я хочу создать привычным образом файл — шаблон письма, подставить удобные для меня плейсхолдеры, сделать верстку письма. В общем хотя бы как это сделано в стандартных шаблонах писем от miniShop2.
Оставив скрипт Марата, как основу, я переписал часть, касающуюся изменения пароля и отправки письма.
По моему получилось гибче и проще. Без процессоров, но с MODX API
switch ($modx->event->name){
case 'msOnChangeOrderStatus':
if ($status == 1) {
$userId = $order->user_id;
$user = $modx->getObject('modUser', $userId);
$time = time();
$newUser = 10; // Сколько секунд пользователь считается новым
if ($user) {
$username = $user->get('username');
$createdon = strtotime($user->get('createdon')) + $newUser;
if ($createdon > $time) {
//Генератор пароля. Взят из исходников MODX
//Длина пароля
$length = 8;
$pass = $modx->user->generatePassword($length);
//Сохраняем новый пароль
$user->set('password', $pass);
$user->save();
//Шлем письмо
$pdo = $modx->getService('pdoFetch');
$message = $pdo->getChunk('@FILE chunks/email/user.register.tpl', array('username' => $username, 'password' => $pass));
$sent = $user->sendEmail($message, array('subject' => 'Регистрация в интернет-магазине'));
//Мгновенная авторизация на сайте без набора пароля, кому надо раскомментируйте
//$user->addSessionContext('web');
}
}
}
break;
}Саму верстку письма я не прикладываю, она почти полностью взята из примеров minishop2 Комментарии: 23
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
modx.pro/help/2766#comment-32619
github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/schema/minishop2.mysql.schema.xml#L270
Полезная статья, Николай! В идеале, пулл реквест в ядро miniShop2 не помешал бы, с системной настройкой включения данного функционала. :)
Затем будем решать проблемы:
— долго создается заказ
— дублируется заказ, пользователь кликает на создании заказа
— и тд и тп.
проще вывести в форму создания чекбокс для неавторизованного юзера о намерением зарегаться на сайте.
далее скрипт на крон который выбирает данные заказы и если пользователь новый проводить подобные манипуляции и слать письмо.
При этом никаких задержек при оформлении заказа.
А вообще я же не претендую на максимальную точность. Просто рассказал о том, как я сделал, показал возможное решение вопроса, и примерно дал понять в какую сторону думать, при кастомизации.
Можно еще что то придумать…
Разве на данный момент, метод getCustomerId() не регистрирует пользователя в обязательном порядке? Если да, регистрирует — то по идее уведомление пользователю обязательно должно быть. Это как минимум хороший тон, а местами и соответствие законодательству.
Если нет, не обязательна регистрация — то КОГДА ЭТО СЛУЧИЛОСЬ черт побери?
Подскажите, где искать почтовый шаблон?
и можно выложить сам шаблон письма?
Спасибо