В эпоху роста удобств веба я всячески лоббирую свободу пользователей интернет. Табу на капчи, табу на регистрации. И пока я делаю сайты (кстати, решил завязать), я буду это и дальше лоббировать. Представляю вашему вниманию способ как можно избавить посетителей от нудятины в виде регистрации при оформлении заказа.
UPD: небольшие изменения в коде, закрывающие брешь в безопасности. Спасибо за замечание Сергееву Ивану. Изменения помечены красным.
[spoiler]
Итак, для начала переносим компонент оформления заказа в свое пространство имен. Как это сделать - опущу. Я выбрал sale.order.ajax из последней версии модуля.
Изменения будут только в component.php.
1. В самом верху (28-29 строчка) убираем этот код:
Этот код запрещает гостям вообще попадать на страницу заказа.
2. Где-то 920-я строчка кода:
После $arUserResult["CONFIRM_ORDER"] = "Y"; сразу пишем:
С данного кода удалил одну строчку.
Ниже по тексту наполняется $arFields.
Там меняем один параметр:
"USER_ID" => $userID,
Внимание! Данный отрезок кода просто добавляет пользователя, но не отсылает ему письмо с регистрационными данными. Чтобы это происходило, надо воспользоваться CUser::Register заместо CUser::Add.
Но проще после создания пользователя (строка $userID = $obUser->Add($arFields)
дописать строку:
Тут особо отмечу моменты:
$_POST["ORDER_PROP_$EMAIL_PROPS_ID"] - это e-mail, у вас обязательно должно быть такое свойство заказа. У меня ID этого свойства 3. Надеюсь все поняли о чем речь.
$_POST["ORDER_PROP_$FNL_PROPS_ID"] - это ФИО. Тоже свойство заказа. Ведь нам надо гостя как-то обозвать. Тут подход индивидуальный. У меня одно свойство на ФИО. Если у вас несколько (отдельно под фамилию, отдельно под имя), то исправьте код:
В $arNames у нас должны оказаться фамилия, имя и, если хотите, отчество. Именно в таком порядке.
"GROUP_ID" => explode(",", COption::GetOptionString("main", "new_user_registration_def_group")), - хитрый финт, который пользователя помещает сразу в группы, которые указаны в настройках главного модуля. Сам когда-то допер
$userLogin = "client".time(); - это будущий логин клиента. будет что-то типа client123654987
Теперь нам необходимо обработать завершающий шаг.
Весь component.php по сути разбит на два больших блока.
if(IntVal($_REQUEST["ORDER_ID"]) <= 0)
//тут подготавливаем оформление заказа, собираем данные с пользователя
и
} else {
вот тут нам и надо изменения внести.
В самом конце первого блока находим строчку
И меняем ее на:
Теперь переходим в область ниже глобального else (см. выше), но прежде else меняем на elseif(check_bitrix_sessid()).
Там сразу идет выборка заказа с помощью $dbOrder = CSaleOrder::GetList. В фильтре метода меняем строчку
на
Вот собственно и все.
Вкратце работает так. Смотрим, есть ли пользователь с таким мылом в базе. Если нет, то создаем. Выдергивается последний пользователь с указанным e-mail'ом.
Зачем нам его авторизовывать после добавления? Потому что его перекинет на страницу оплаты, где уже идет проверка на авторизацию и это надо. Если хотите, сами уже как-нибудь обработаете этот момент.
Особо удобно подход гостевого оформления заказа пользовать вкупе с .
PS: Как уже писал выше, это выкладки с компонента, который я прилично переправил, возможно что-то упустил при написании данного поста. Указывайте, пожалуйста неточности в комментариях или вопросы.
Важные замечания и ответы на кое-какие вопросы читайте в комментариях.
UPD: небольшие изменения в коде, закрывающие брешь в безопасности. Спасибо за замечание Сергееву Ивану. Изменения помечены красным.
[spoiler]
Итак, для начала переносим компонент оформления заказа в свое пространство имен. Как это сделать - опущу. Я выбрал sale.order.ajax из последней версии модуля.
Изменения будут только в component.php.
1. В самом верху (28-29 строчка) убираем этот код:
if(!$USER->IsAuthorized())
$APPLICATION->AuthForm(GetMessage("SOA_NEED_AUTH"));
|
Этот код запрещает гостям вообще попадать на страницу заказа.
2. Где-то 920-я строчка кода:
if($arUserResult["CONFIRM_ORDER"] == "Y" && empty($arResult["ERROR"]))
{
$arUserResult["CONFIRM_ORDER"] = "Y";
..
|
После $arUserResult["CONFIRM_ORDER"] = "Y"; сразу пишем:
if ($USER->IsAuthorized())
{
$userID = $USER->GetID();
}
else
{
/*Create user ------------------------*/
$rsUsers = CUser::GetList(($by="id"), ($order="desc"), array("EMAIL" => $_POST["ORDER_PROP_$EMAIL_PROPS_ID"]));
if ($arUser = $rsUsers->Fetch())
{
$userID = $arUser["ID"];
}
else
{
$obUser = new CUser;
if (strpos($_POST["ORDER_PROP_$FNL_PROPS_ID"], ",") !== false)
$arNames = explode(",", $_POST["ORDER_PROP_$FNL_PROPS_ID"]);
else
$arNames = explode(" ", $_POST["ORDER_PROP_$FNL_PROPS_ID"]);
TrimArr($arNames);
$userLogin = "client".time();
$userPassw = GetRandomCode();
$arFields = Array(
"EMAIL" => $_POST["ORDER_PROP_$EMAIL_PROPS_ID"],
"LOGIN" => $userLogin,
"LID" => SITE_ID,
"ACTIVE" => "Y",
"GROUP_ID" => explode(",", COption::GetOptionString("main", "new_user_registration_def_group")),
"PASSWORD" => $userPassw,
"CONFIRM_PASSWORD" => $userPassw
);
if(strlen(trim($arNames[0])) > 0)
$arFields["LAST_NAME"] = trim($arNames[0]);
if(strlen(trim($arNames[1])) > 0)
$arFields["NAME"] = trim($arNames[1]);
if(strlen(trim($arNames[2])) > 0)
$arFields["SECOND_NAME"] = trim($arNames[2]);
$userID = $obUser->Add($arFields);
}
/*------------------------------------*/
//CUser::Authorize($userID); - Эту строчку удаляем!
}
|
С данного кода удалил одну строчку.
Ниже по тексту наполняется $arFields.
Там меняем один параметр:
"USER_ID" => $userID,
Внимание! Данный отрезок кода просто добавляет пользователя, но не отсылает ему письмо с регистрационными данными. Чтобы это происходило, надо воспользоваться CUser::Register заместо CUser::Add.
Но проще после создания пользователя (строка $userID = $obUser->Add($arFields)
дописать строку:CUser::SendUserInfo($userID, SITE_ID, "Приветствуем Вас как нового пользователя нашего сайта!"); |
Тут особо отмечу моменты:
$_POST["ORDER_PROP_$EMAIL_PROPS_ID"] - это e-mail, у вас обязательно должно быть такое свойство заказа. У меня ID этого свойства 3. Надеюсь все поняли о чем речь.
$_POST["ORDER_PROP_$FNL_PROPS_ID"] - это ФИО. Тоже свойство заказа. Ведь нам надо гостя как-то обозвать. Тут подход индивидуальный. У меня одно свойство на ФИО. Если у вас несколько (отдельно под фамилию, отдельно под имя), то исправьте код:
if (strpos($_POST["ORDER_PROP_$FNL_PROPS_ID"], ",") !== false)
$arNames = explode(",", $_POST["ORDER_PROP_$FNL_PROPS_ID"]);
else
$arNames = explode(" ", $_POST["ORDER_PROP_$FNL_PROPS_ID"]); |
В $arNames у нас должны оказаться фамилия, имя и, если хотите, отчество. Именно в таком порядке.
"GROUP_ID" => explode(",", COption::GetOptionString("main", "new_user_registration_def_group")), - хитрый финт, который пользователя помещает сразу в группы, которые указаны в настройках главного модуля. Сам когда-то допер

$userLogin = "client".time(); - это будущий логин клиента. будет что-то типа client123654987
Теперь нам необходимо обработать завершающий шаг.
Весь component.php по сути разбит на два больших блока.
if(IntVal($_REQUEST["ORDER_ID"]) <= 0)
//тут подготавливаем оформление заказа, собираем данные с пользователя
и
} else {
вот тут нам и надо изменения внести.
В самом конце первого блока находим строчку
$arResult["REDIRECT_URL"] = $APPLICATION->GetCurPageParam("ORDER_ID=".$arResult["ORDER_ID"], Array("ORDER_ID")); |
И меняем ее на:
$arResult["REDIRECT_URL"] = $APPLICATION->GetCurPageParam("ORDER_ID=".$arResult["ORDER_ID"]."&USER_ID=".$userID."&".bitrix_sessid_get(), Array("ORDER_ID", "USER_ID")); |
Теперь переходим в область ниже глобального else (см. выше), но прежде else меняем на elseif(check_bitrix_sessid()).
Там сразу идет выборка заказа с помощью $dbOrder = CSaleOrder::GetList. В фильтре метода меняем строчку
"USER_ID" => IntVal($USER->GetID()), |
на
"USER_ID" => IntVal($_REQUEST["USER_ID"]), |
Вот собственно и все.
Вкратце работает так. Смотрим, есть ли пользователь с таким мылом в базе. Если нет, то создаем. Выдергивается последний пользователь с указанным e-mail'ом.
Зачем нам его авторизовывать после добавления? Потому что его перекинет на страницу оплаты, где уже идет проверка на авторизацию и это надо. Если хотите, сами уже как-нибудь обработаете этот момент.
Особо удобно подход гостевого оформления заказа пользовать вкупе с .
PS: Как уже писал выше, это выкладки с компонента, который я прилично переправил, возможно что-то упустил при написании данного поста. Указывайте, пожалуйста неточности в комментариях или вопросы.
Важные замечания и ответы на кое-какие вопросы читайте в комментариях.
Правда хочу всех предупредить, что эти изменения еще