Регистрация пользователя при оформлении заказа в UMI.CMS

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

Добавить комментарий

Ваш адрес email не будет опубликован.