Приветствую.
В очередной раз встала проблема с созданием заказа в интернет-магазине без регистрации пользователя.
Тут вроде понятно - штатный функционал позволяет делать скрытую регистрацию (в данной теме речь о компоненте sale.basket.order.ajax). Но есть как всегда одна загвоздка - в разрабатываемом ИМ нет авторизации. Вот так. Ну нет и все.
Соответственно, пользователь купивший что-то однажды и введя свой email больше не сможет создать заказ, т.к. система его зарегистрировала при совершении первой покупки и пользователь получает сообщения:
"Такой логин уже зарегистрирован. Пожалуйста, авторизуйтесь.
Такой E-Mail адрес уже зарегистрирован. Пожалуйста, авторизуйтесь."
А авторизации нет. Вот и получается что скорее всего придется "сверлить зубы через задний проход." Итак, в теме приветствуются все, кто может подсказать как лучше решать данную задачу.
Первым, пожалуй, начну я.
Моё решение только в теории, осуществлять не пробовал. Вобщем вся загвоздка в том что пользователь уже зарегистрирован. Тогда, если пользователь второй раз вводит своё мыло (совершает вторую покупку) - вместо заполнения массива с ошибкой будем скрыто его авторизовывать (тут пара моментов с паролем - либо регистрировать с каким нибудь дефолтным, либо, на сколько я понял, можно авторизовывать по хешу). Тогда проблема вроде решается. Для этого прийдется кастомизировать вот этот фрагмент кода в компоненте sale.basket.order.ajax
Возможно я все усложняю и можно найти более простой или красивый метод (генерирование на каждый заказ рандомного юзера, привязка всех заказов к одному юзеру и т.п.), может быть и так что решение уже где-то в интернетах плавает, но я к сожалению его не нашёл.
Вобщем буду рад любым мнениям.
В очередной раз встала проблема с созданием заказа в интернет-магазине без регистрации пользователя.
Тут вроде понятно - штатный функционал позволяет делать скрытую регистрацию (в данной теме речь о компоненте sale.basket.order.ajax). Но есть как всегда одна загвоздка - в разрабатываемом ИМ нет авторизации. Вот так. Ну нет и все.
Соответственно, пользователь купивший что-то однажды и введя свой email больше не сможет создать заказ, т.к. система его зарегистрировала при совершении первой покупки и пользователь получает сообщения:
"Такой логин уже зарегистрирован. Пожалуйста, авторизуйтесь.
Такой E-Mail адрес уже зарегистрирован. Пожалуйста, авторизуйтесь."
А авторизации нет. Вот и получается что скорее всего придется "сверлить зубы через задний проход." Итак, в теме приветствуются все, кто может подсказать как лучше решать данную задачу.
Первым, пожалуй, начну я.
Моё решение только в теории, осуществлять не пробовал. Вобщем вся загвоздка в том что пользователь уже зарегистрирован. Тогда, если пользователь второй раз вводит своё мыло (совершает вторую покупку) - вместо заполнения массива с ошибкой будем скрыто его авторизовывать (тут пара моментов с паролем - либо регистрировать с каким нибудь дефолтным, либо, на сколько я понял, можно авторизовывать по хешу). Тогда проблема вроде решается. Для этого прийдется кастомизировать вот этот фрагмент кода в компоненте sale.basket.order.ajax
Код |
---|
/* * register user if to order basket */ if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["BasketOrder"]) AND !$USER->IsAuthorized()) { if (strlen($payerEMail) <= 0) $errorMessage .= GetMessage("STOF_ERROR_REG_EMAIL")."<br>"; elseif (!check_email($payerEMail)) $errorMessage .= GetMessage("STOF_ERROR_REG_BAD_EMAIL")."<br>"; $pos = strpos($payerEMail, "@"); $payerEMailNew = substr($payerEMail, 0, $pos); $dbUserLogin = CUser::GetByLogin($payerEMailNew); if ($arUserLogin = $dbUserLogin->Fetch()) $errorMessage .= GetMessage("STOF_ERROR_REG_UNIQUE_LOGIN")."<br>"; $rsUsers = CUser::GetList(($by="id"), ($order="desc"), array("EMAIL" => $payerEMail)); $arUser = $rsUsers->Fetch(); if (count($arUser) > 1) // Здесь вывод сообщения об ошибке, значит здесь заменяем его на авторизацию пользователя. $errorMessage .= GetMessage("STOF_ERROR_REG_UNIQUE_EMAIL")."<br>"; //Здесь происходит регистрация пользователя, если нет ошибок. if ('' == $errorMessage) { //Если переписываем регистрацию, то переписываем этот метод (в своём пространстве имен конечно же). $user_id = CSaleUser::DoAutoRegisterUser($payerEMail, $payerName, SITE_ID, $arErrors, array()); if ($user_id > 0 && empty($arErrors)) { $USER->Authorize($user_id); $currentUserId = (int)$USER->GetID(); //send mail register user //Почтовое событие естественно не отправляем, т.к. не нужно. if ($arParams["SEND_NEW_USER_NOTIFY"] == "Y") { $userNew = str_replace("#FIO#", "(".$arUser["LOGIN"].") ".$payerName, GetMessage("NEWO_BUYER_REG_OK")); CUser::SendUserInfo($user_id, SITE_ID, $userNew, true); } } else { foreach ($arErrors as $val) $errorMessage .= $val["TEXT"]."<br>"; } } } |
Вобщем буду рад любым мнениям.
Помог - плюсани