Привет!
У одного из клиентов возникла задача: в случае, если пользователь перешёл на сайт по аффилиатской ссылке, то всем заказам пользователя ВСЕГДА будет присваиваться идентификатор аффилиата, по ссылке которого он попал на сайта. [spoiler]
Штатно это "всегда" работать не будет, т.к. идентификатор аффилиата сохраняется в куках, а куки могут "умереть" или пользователь будет использовать в дальнейшем другой браузер/компьютер. Соответственно идентификатор нужно сохранить и подсовывать при оформлении заказа, в обход стандартного механизма. Решается эта задача 2-мя обработчиками:
Предварительно нужно создать строковое пользовательское поле для объекта USER и кодом UF_SALE_AFFILIATE. Таким образом при авторизации пользователя, если в куках есть идентификатор аффилиата и значение пользовательского поля UF_SALE_AFFILIATE не задано, то его значениеv становится идентификатор аффилиата из куков.
При оформлении заказа компонентом bitrix:sale.order.ajax поле AFFILIATE_ID подменяется значением из пользовательского свойства.
Конец!
У одного из клиентов возникла задача: в случае, если пользователь перешёл на сайт по аффилиатской ссылке, то всем заказам пользователя ВСЕГДА будет присваиваться идентификатор аффилиата, по ссылке которого он попал на сайта. [spoiler]
Штатно это "всегда" работать не будет, т.к. идентификатор аффилиата сохраняется в куках, а куки могут "умереть" или пользователь будет использовать в дальнейшем другой браузер/компьютер. Соответственно идентификатор нужно сохранить и подсовывать при оформлении заказа, в обход стандартного механизма. Решается эта задача 2-мя обработчиками:
AddEventHandler("main", "OnAfterUserLogin", "SetImmortalAffiliate");
AddEventHandler("sale", "OnSaleComponentOrderOneStepComplete", "SetImmortalAffiliateOrder");
function SetImmortalAffiliate(&$fields)
{
global $USER;
$USER_ID=$USER->GetID();
if (($USER->IsAuthorized())&&($_COOKIE[COption::GetOptionString("main", "cookie_name", "0").'_SALE_AFFILIATE']))
{
$rsUsers = $USER->GetList(($by="id"), ($order="desc"), Array('ID'=>$USER_ID),array('SELECT'=>Array('UF_*')));
if($arUSER=$rsUsers->Fetch())
if(!$arUSER['UF_SALE_AFFILIATE'])
{
$arFields['UF_SALE_AFFILIATE']=$_COOKIE[COption::GetOptionString("main", "cookie_name", "0").'_SALE_AFFILIATE'];
$USER->Update($USER_ID),$arFields);
}
}
}
function SetImmortalAffiliateOrder($ID,$arFields)
{
global $USER;
$rsUsers = $USER->GetList(($by="id"), ($order="desc"), Array('ID'=>$USER->GetID()),array('SELECT'=>Array('UF_*')));
if(($arUSER=$rsUsers->Fetch())&&(IntVal($arUSER['UF_SALE_AFFILIATE'])))
CSaleOrder::Update($arFields['ID'],Array('AFFILIATE_ID'=>$arUSER['UF_SALE_AFFILIATE']));
} |
Предварительно нужно создать строковое пользовательское поле для объекта USER и кодом UF_SALE_AFFILIATE. Таким образом при авторизации пользователя, если в куках есть идентификатор аффилиата и значение пользовательского поля UF_SALE_AFFILIATE не задано, то его значениеv становится идентификатор аффилиата из куков.
При оформлении заказа компонентом bitrix:sale.order.ajax поле AFFILIATE_ID подменяется значением из пользовательского свойства.
Конец!