Отправка 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
Поблагодарить автора
Отправить деньги
Комментарии: 21
Пароль хорошо бы генерировать так, он так генерируется с учетом настроек modx
modx.pro/help/2766#comment-32619
modx.pro/help/2766#comment-32619
Пофиксил, закоммитил.
Еще, пользователя у $order можно получить через связь, не обязательно получать через getObject.
github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/schema/minishop2.mysql.schema.xml#L270
github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/schema/minishop2.mysql.schema.xml#L270
Думаешь быстрее будет? Все равно же запрос в базу. Или это ближе к Join чем к запросу?
Быстрее не будет, но элегенатнее точно будет)
Вряд ли, быстрее. Удобнее и проще — точно!
Полезная статья, Николай! В идеале, пулл реквест в ядро miniShop2 не помешал бы, с системной настройкой включения данного функционала. :)
Полезная статья, Николай! В идеале, пулл реквест в ядро miniShop2 не помешал бы, с системной настройкой включения данного функционала. :)
Боюсь Володя не пропустит, вон ругаться уже начал
Зачем это пихать в плагин на смену статуса? Ладно если еще пароль, так еще и письмо отправить.
Затем будем решать проблемы:
— долго создается заказ
— дублируется заказ, пользователь кликает на создании заказа
— и тд и тп.
проще вывести в форму создания чекбокс для неавторизованного юзера о намерением зарегаться на сайте.
далее скрипт на крон который выбирает данные заказы и если пользователь новый проводить подобные манипуляции и слать письмо.
При этом никаких задержек при оформлении заказа.
Затем будем решать проблемы:
— долго создается заказ
— дублируется заказ, пользователь кликает на создании заказа
— и тд и тп.
проще вывести в форму создания чекбокс для неавторизованного юзера о намерением зарегаться на сайте.
далее скрипт на крон который выбирает данные заказы и если пользователь новый проводить подобные манипуляции и слать письмо.
При этом никаких задержек при оформлении заказа.
При этом никаких задержек при оформлении заказа.А как же задержки при отсылке писем менеджерам и юзеру о новом заказе?)
От них тоже можно избавиться. Но а навешивать лишнее точно не стоит.
Твой вариант может и проще и правильнее. Но уж точно это не то решение, которое будет работать из коробки при минимуме затрат.
А вообще я же не претендую на максимальную точность. Просто рассказал о том, как я сделал, показал возможное решение вопроса, и примерно дал понять в какую сторону думать, при кастомизации.
А вообще я же не претендую на максимальную точность. Просто рассказал о том, как я сделал, показал возможное решение вопроса, и примерно дал понять в какую сторону думать, при кастомизации.
Как вариант еще можно вместе с галкой о согласии регистрации показывать поле пароль. И в случае регистрации пользователя ставить выбранный пользователем пароль. Необходимость в оправке писем тогда вовсе пропадает.
Можно еще что то придумать…
Можно еще что то придумать…
Я что то упустил?
Разве на данный момент, метод getCustomerId() не регистрирует пользователя в обязательном порядке? Если да, регистрирует — то по идее уведомление пользователю обязательно должно быть. Это как минимум хороший тон, а местами и соответствие законодательству.
Если нет, не обязательна регистрация — то КОГДА ЭТО СЛУЧИЛОСЬ черт побери?
Разве на данный момент, метод getCustomerId() не регистрирует пользователя в обязательном порядке? Если да, регистрирует — то по идее уведомление пользователю обязательно должно быть. Это как минимум хороший тон, а местами и соответствие законодательству.
Если нет, не обязательна регистрация — то КОГДА ЭТО СЛУЧИЛОСЬ черт побери?
Вообще в ядро бы конечно это тему закинуть, потому что пользователи пытаются заново зарегаться а им пишут, что вы уже есть. И он в ступоре, начинает думать когда и как, ну и восстанавливать пароль. Хотя принудительная регистрация тоже весьма спорна (
Абсолютно согласен, сколько не делал магазинов на miniShop2, клиенты все без исключения просили потом как-нибудь допилить этот момент, пользоватлеи всё время пытались регатся на сайте, а им в ответ, а — Вы уже есть, и дальше им нужно делать какие-то действия чтобы восстановить пароль, который они никогда сами и не создавали.
Видишь какую тему больную поднял. По любому нужно что то придумать в ядре
Присоединяюсь к вопросу
Это актуально очень! В последнем проекте я указал в письме с новым заказом пометку о том как войти в личный кабинет, но чуть ли не каждый 2 испытывает проблемы, так как, ему нужно сначала запросить сброс пароля.
Вообще, если в любой системе какое-либо действие пиводит к созданию сущности пользователя, то об этом нужно уведомлять. Обязательно. И это не оверхэд, а нормальное поведение системы. Кстати, хорошо бы еще мелким шрифтом хотя бы информировать юзера на сайте, о том, что при совершении действия в системе будет создана сущность пользователя с его реквизитами. Ну и закон о Персональных данных теперь нас обязывает это все учитывать. Автор фичи молодец!
Благодарствую, Николай, за публикацию, очень помогло
В этом и смысл публикации. На здоровье.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.