Доброго вечера!
Тема навеяна пессимистическими настроениями в комментариях предыдущего сообщения и является его продолжением.
[spoiler]
Т.е. надо на некие заслуги добавить того или иного пользователя в определённую группу (-ы).
Итак, вот как у меня получилось реализовать данную задачу. Хочу сразу отметить, что это шаблон для любых Ваших будущих подобных решений.
Теперь поясню какой код что делает, а также где Вы можете добавить свою логику.
Все проверки будем делать после авторизации пользователя, это лучше чем выполнять проверки на каждом хите.
Убеждающемся, что пользователь ещё не получил "плюшку".
Данный код представляет собой механизм кеширования и не позволяет скрипту выполняться более одного раза в сутки (Вы можете поставить любое время).
Получаем поля профиля пользователя и ... самое интересное определяем за что же именно давать ему "плюшку":
Или за 1000 сообщений на форуме, или за 200 голосов в его пользу или же если данный пользователь работает на сайте более года. Можно сделать так, что все сразу или некоторые из этих условий являются решающими. Можно перевести в группу не только за "форумные заслуги", но и за другие, всё делается довольно просто.
Далее мы переводим пользователя в группу, а также сдвигаем метку кеша:
Данное решение считаю наиболее гибким и менее ресурсоёмким
Документациия по функции
P.S. Отдельное спасибо Льву и Александру за подкинутую идею.
Тема навеяна пессимистическими настроениями в комментариях предыдущего сообщения и является его продолжением.
[spoiler]
| Сделать несложно, упирается все в ресурсы и способ организации. Те инструменты, которые нам доступны сейчас, не позволят сделать это незаметно пользователю. Ждем новых событий в Форуме, может они облегчат задачу. |
Итак, вот как у меня получилось реализовать данную задачу. Хочу сразу отметить, что это шаблон для любых Ваших будущих подобных решений.
<?
AddEventHandler("main", "OnAfterUserLogin", "OnAfterUserLoginHandler");
function OnAfterUserLoginHandler(&$fields)
{
global $USER;
if (!is_object($USER)) $USER = new CUser;
if (!CSite::InGroup(array(3))):
$diff = 24 * 60 * 60 ; // 24 hours
if(!class_exists('CUserOptions'))
include_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/classes/".$GLOBALS['DBType']."/favorites.php");
$save_time = CUserOptions::GetOption("custom", "memo_time");
if (!$save_time || ($save_time + $diff) <= time())
{
if (!CModule::IncludeModule("forum"))
return false;
$ar_user = CForumUser::GetByUSER_ID($USER->GetID());
if ( $ar_user["NUM_POSTS"] > 1000
|| $ar_user["NUM_POINTS"] > 200
|| MakeTimeStamp ($ar_user["DATE_REG"]) < AddToTimeStamp(array("YYYY" => "-1", time())))
CUser::SetUserGroup($USER->GetID(), array_merge($USER->GetUserGroupArray($USER->GetID()), array(3)));
CUserOptions::SetOption("custom", "memo_time", time());
}
endif;
}
?> |
Теперь поясню какой код что делает, а также где Вы можете добавить свою логику.
AddEventHandler("main", "OnAfterUserLogin", "OnAfterUserLoginHandler");
function OnAfterUserLoginHandler(&$fields) |
Все проверки будем делать после авторизации пользователя, это лучше чем выполнять проверки на каждом хите.
if (!CSite::InGroup(array(3))): |
Убеждающемся, что пользователь ещё не получил "плюшку".
$diff = 24 * 60 * 60 ; // 24 hours
if(!class_exists('CUserOptions'))
include_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/classes/".$GLOBALS['DBType']."/favorites.php");
$save_time = CUserOptions::GetOption("custom", "memo_time");
if (!$save_time || ($save_time + $diff) <= time()) |
Данный код представляет собой механизм кеширования и не позволяет скрипту выполняться более одного раза в сутки (Вы можете поставить любое время).
$ar_user = CForumUser::GetByUSER_ID($USER->GetID()); |
Получаем поля профиля пользователя и ... самое интересное определяем за что же именно давать ему "плюшку":
if ( $ar_user["NUM_POSTS"] > 1000
|| $ar_user["NUM_POINTS"] > 200
|| MakeTimeStamp ($ar_user["DATE_REG"]) < AddToTimeStamp(array("YYYY" => "-1", time()))) |
Или за 1000 сообщений на форуме, или за 200 голосов в его пользу или же если данный пользователь работает на сайте более года. Можно сделать так, что все сразу или некоторые из этих условий являются решающими. Можно перевести в группу не только за "форумные заслуги", но и за другие, всё делается довольно просто.
Далее мы переводим пользователя в группу, а также сдвигаем метку кеша:
CUser::SetUserGroup($USER->GetID(), array_merge($USER->GetUserGroupArray($USER->GetID()), array(3)));
CUserOptions::SetOption("custom", "memo_time", time()); |
Данное решение считаю наиболее гибким и менее ресурсоёмким
Документациия по функции
P.S. Отдельное спасибо Льву и Александру за подкинутую идею.
