Приветствую.
В очередной раз встала проблема с созданием заказа в интернет-магазине без регистрации пользователя.
Тут вроде понятно - штатный функционал позволяет делать скрытую регистрацию (в данной теме речь о компоненте 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>";
}
}
} |
Вобщем буду рад любым мнениям.
Помог - плюсани