Накидал тут небольшой метод для автоматической регистрации пользователей при совершении заказа. Так как umi позволяет совершать оформление заказа без регистрации, то предусмотрим небольшое расширение функционала.
Для этого мы подвяжемся к событию order-status-changed
# /classes/modules/emarket/custom_events.php new umiEventListener('order-status-changed', 'emarket', 'onAutoRegisterUser');
Создадим обработчик событий onAutoRegisterUser
Для начала нам понадобится определить, что это первоначальный статус «Ожидает проверки»
if ($event->getParam("new-status-id") == 99) { // Статус "Ожидает проверки"
Скорее всего, 99 будет и у вас, но на всякий случай проверьте, это справочник «Статус заказа» и элемент «Ожидает проверки». Так с большей вероятностью можно сказать, что это новый заказ.
Далее нам надо понять что это «Гость»
$permissions = permissionsCollection::getInstance(); $currentUserId = $permissions->getUserId(); if ($currentUserId == 337) { // Это гость
337 это Id пользователя «Гость», у меня пока на проектах совпадает, но вы удостоверьтесь, что у вас так же это число 337.
Ну а дальше из ключевых моментов:
- Проверим, существует ли юзер с таким же email и если да, то я привязываю заказ к уже существующему клиенту:
$sel = new selector("objects"); $sel->types("object-type")->name("users", "user"); $sel->where("e-mail")->equals($userEmail); if ($sel->length() > 0) { // обработать, не давать регистрировать с таким же email $user = $sel->first; if($user instanceof umiObject) { $order->customer_id = $user->getId(); $order->commit(); } return true; }
- Для генерации пароля нам понадобится вспомогающий метод
public function generatePassword($length = 8) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $count = mb_strlen($chars); for ($i = 0, $result = ''; $i < $length; $i++) { $index = rand(0, $count - 1); $result .= mb_substr($chars, $index, 1); } return $result; }
Ну и полный листинг макроса для регистрации пользователя выглядит так:
<?php /** * Created by PhpStorm. * Author: Shabalin Pavel * Email: admin@aisamiery.ru * Date: 15.12.2015 * Time: 0:05 */ abstract class __emarket_custom { //TODO: Write here your own macroses public function onAutoRegisterUser(iUmiEventPoint $event) { if ($event->getMode() === "before") return true; if ($event->getMode() === "after") { if ($event->getParam("new-status-id") == 99) { // Статус "Ожидает проверки" $objects = umiObjectsCollection::getInstance(); // Если текущий пользователь — это гость, то регистриуем его $permissions = permissionsCollection::getInstance(); $currentUserId = $permissions->getUserId(); if ($currentUserId == 337) { // Это гость $order = $event->getRef('order'); if ($order) { if ($customer_id = $order->getValue("customer_id")) { $customer = $objects->getObject($customer_id); $objectTypes = umiObjectTypesCollection::getInstance(); $usersObjectTypeId = $objectTypes->getBaseType("users", "user"); //Такие свойства будет иметь новый пользователь $userLogin = $customer->getValue("email"); $userPassword = $this->generatePassword(); $userFirstName = $customer->getValue("fname"); $userLastName = $customer->getValue("lname"); $userEmail = strtolower($customer->getValue("email")); $sel = new selector("objects"); $sel->types("object-type")->name("users", "user"); $sel->where("e-mail")->equals($userEmail); if ($sel->length() > 0) { // обработать, не давать регистрировать с таким же email $user = $sel->first; if($user instanceof umiObject) { $order->customer_id = $user->getId(); $order->commit(); } return true; } //Создаем новый объект типа "Пользователь" и получаем его id $newUserId = $objects->addObject($userLogin, $usersObjectTypeId); //Получаем объект пользователя $newUser = $objects->getObject($newUserId); if($newUser instanceof umiObject) { //Заполняем объект пользователя новыми свойствами $newUser->setValue("login", $userLogin); $newUser->setValue("password", md5($userPassword)); //Пароль должен храниться в MD5 $newUser->setValue("fname", $userFirstName); $newUser->setValue("lname", $userLastName); $newUser->setValue("e-mail", $userEmail); $newUser->setValue("is_activated", true); //Без этого свойства пользователь будет неактивен $order->customer_id = $newUserId; $order->commit(); //Подтверждаем внесенные изменения $newUser->commit(); // Отправляем письмо на адрес пользователя $mail = new umiMail(); if ($mail->checkEmail($userEmail)) { $mail->addRecipient($userEmail); $mail->setFrom('robot@example.com'); $mail->setSubject("Вы успешно зарегистрированы на сайте"); $mail->setContent("Поздравляем! Вы успешно зарегистрированы на сайте.<br>\nДля входа на сайт, используйте следующие данные:<br>\nЛогин:{$userLogin}<br>\nПароль:{$userPassword}"); $mail->commit(); $mail->send(); } } } } } } } return true; } public function generatePassword($length = 8) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $count = mb_strlen($chars); for ($i = 0, $result = ''; $i < $length; $i++) { $index = rand(0, $count - 1); $result .= mb_substr($chars, $index, 1); } return $result; } };
Нам же остается добавить только права в файл permissions.custom.php и наслаждаться результатом 🙂