Пользователи магазина имеют 3 категории скидок в зависимости от оборота. Скидки привязаны к пользователям и не зависят от суммы или категории товара.
В битриксе нет скидок, привязываемых к пользователю. Можно включить пользователя в определенную группу, у которой есть право на скидку, но автоматизировать этот процесс не получится. Хорошо бы было иметь инфоблок со скидками и выгружать на сайт содержимое инфоблока в виде XML.
Я в конце концов реализовал следующим образом:
Так как скидки фиксированные, 3-х типов, то:
1. Создал 3 группы пользователей (пустых, пользователей туда не включаем).
2. Создал 3 скидки, в свойствах которых прописал право на скидку для соответствующей группы
3. Создал инфоблок скидок с свойствами привязки к пользователю и символьным кодом скидки
4. в init.php прописал обработчик события OnAfterUserLogin и OnAfterUserLoginByHash
В итоге в момент логина юзер временно добавляется в группу, соответствующую скидке. А в инфоблоке можно менять уровень скидки либо руками, либо выгружая автоматически.
В битриксе нет скидок, привязываемых к пользователю. Можно включить пользователя в определенную группу, у которой есть право на скидку, но автоматизировать этот процесс не получится. Хорошо бы было иметь инфоблок со скидками и выгружать на сайт содержимое инфоблока в виде XML.
Я в конце концов реализовал следующим образом:
Так как скидки фиксированные, 3-х типов, то:
1. Создал 3 группы пользователей (пустых, пользователей туда не включаем).
2. Создал 3 скидки, в свойствах которых прописал право на скидку для соответствующей группы
3. Создал инфоблок скидок с свойствами привязки к пользователю и символьным кодом скидки
4. в init.php прописал обработчик события OnAfterUserLogin и OnAfterUserLoginByHash
AddEventHandler("main", "OnAfterUserLogin", "MyOnAfterUserLogin"); AddEventHandler("main", "OnAfterUserLoginByHash", "MyOnAfterUserLogin"); // создаем обработчик события "OnAfterUserLogin" function MyOnAfterUserLogin(&$fields) { global $USER; // если логин OK if ($USER->IsAuthorized()) { $UserID = $USER->GetID(); if($UserID > 0) { $GetUser = CUser::GetByID($UserID); $arUser = $GetUser->Fetch(); $MemberOfList = CUser::GetUserGroup($UserID); // смотрим в каких группах состоит $MemberMask = array(2,3); // Коды групп "Все, в том числе и неавторизованные" и "зарегистрированные пользователи" $ArDiff = array_diff($MemberOfList,$MemberMask); // Проверяем, что это обычный юзер и больше ни в каких группах не состоит if (empty($ArDiff)) { CModule::IncludeModule("iblock"); $SelectGroups = CIBlockElement::GetList( array(), array( "IBLOCK_CODE" => "USER_DISCOUNT", "PROPERTY_DISCOUNT_USER" => $UserID ), false, false, array("PROPERTY_DISCOUNT_USER","PROPERTY_DISCOUNT_GROUP") // поля ИД юзера и символьный код группы скидки ); if ($SelectGroup = $SelectGroups->Fetch()) { $arGroups = CGroup::GetList( ($by="c_sort"), ($order="desc"), array( "STRING_ID" => $SelectGroup["PROPERTY_DISCOUNT_GROUP_VALUE"] // находим группу по символьному ИД ) ); if ($arGroup = $arGroups->Fetch()) { $CurGroups = $USER->GetUserGroupArray(); $CurGroups[] = $arGroup["ID"]; $USER->SetUserGroupArray($CurGroups); // добавляем юзера в группу скидки на время его сессии } } } } } } |
В итоге в момент логина юзер временно добавляется в группу, соответствующую скидке. А в инфоблоке можно менять уровень скидки либо руками, либо выгружая автоматически.