Накидал тут небольшой метод для автоматической регистрации пользователей при совершении заказа. Так как umi позволяет совершать оформление заказа без регистрации, то предусмотрим небольшое расширение функционала.
Для этого мы подвяжемся к событию order-status-changed
1 2 |
# /classes/modules/emarket/custom_events.php new umiEventListener('order-status-changed', 'emarket', 'onAutoRegisterUser'); |
Создадим обработчик событий onAutoRegisterUser
Для начала нам понадобится определить, что это первоначальный статус «Ожидает проверки»
1 |
if ($event->getParam("new-status-id") == 99) { // Статус "Ожидает проверки" |
Скорее всего, 99 будет и у вас, но на всякий случай проверьте, это справочник «Статус заказа» и элемент «Ожидает проверки». Так с большей вероятностью можно сказать, что это новый заказ.
Далее нам надо понять что это «Гость»
1 2 3 4 |
$permissions = permissionsCollection::getInstance(); $currentUserId = $permissions->getUserId(); if ($currentUserId == 337) { // Это гость |
337 это Id пользователя «Гость», у меня пока на проектах совпадает, но вы удостоверьтесь, что у вас так же это число 337.
Ну а дальше из ключевых моментов:
- Проверим, существует ли юзер с таким же email и если да, то я привязываю заказ к уже существующему клиенту:
1 2 3 4 5 6 7 8 9 10 11 12 |
$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; } |
- Для генерации пароля нам понадобится вспомогающий метод
1 2 3 4 5 6 7 8 9 10 11 |
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; } |
Ну и полный листинг макроса для регистрации пользователя выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
<?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 и наслаждаться результатом 🙂