Накидал тут небольшой метод для автоматической регистрации пользователей при совершении заказа. Так как 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 и наслаждаться результатом 🙂