Вы все еще пользуетесь неправославной CUser::GetUserGroupList и ему подобными? Тогда этот пост для вас.
//апдейт группы по времени, или добавление новой привязки
$res = \Bitrix\Main\UserGroupTable::getList(array('filter' => array('USER_ID' => $uid, 'GROUP_ID' => $targetGroup)));
if ($row = $res->fetch()) {
if ($row['DATE_ACTIVE_TO'] == '') {
$row['DATE_ACTIVE_TO'] = new \Bitrix\Main\Type\DateTime;
}
\Bitrix\Main\UserGroupTable::update(array('GROUP_ID' => $targetGroup, 'USER_ID' => $uid),
array('DATE_ACTIVE_TO' => $row['DATE_ACTIVE_TO']->add('+'.$month.' month')));
} else {
$date = new \Bitrix\Main\Type\DateTime;
\Bitrix\Main\UserGroupTable::add(array(
'USER_ID' => $uid,
'GROUP_ID' => $targetGroup,
'DATE_ACTIVE_TO' => $date->add('+'.$month.' month')
));
}
|
Что происходит в коде - мы по узнаем, есть ли у юзера $uid уже группа $targetGroup. И если есть, то продляем ее значение на $month месяцев. Если такой группы нет вообще, добавляем.
Не забывайте, что хоть код и на D7, принципы привязки к группе у пользователя остаются прежние - возможно, ему потребуется переавторизоваться.
Кстати, обратите внимание на хитрый апдейт по двойному ключу. Если вы заглянете в карту таблицы, увидите, что там два праймари.
.
По сути сейчас CUser::GetUserGroupList и ему подобные оббертка для того что ты описал.
Неймспейс - это строка. И смысл ее должен быть ясен в целом. А вся та херня, которую разработчики битрикса в нее пишут, говорит об их психическом недуге.
А чтобы не писать тонны лишних строк, в моем коде выше впишите
use \Bitrix\Main\UserGroupTable;
Тогда во всем коде можно убрать это приставку и писать просто
UserGroupTable::getList
и так далее.
Дабы потом не путаться - где битриксовские неймспейсы, а где свои или еще чьи..
По старому Можно так
$obEnum = new CUserFieldEnum;
$rsEnum = $obEnum->GetList(array(), array("USER_FIELD_ID"=>56, 'ID' => 9));
Но мне нужно в getList связать поле типа список через runtime, как то так
'runtime' => array(
'visainfo' => array(
'data_type' => $visainfoDataClass,
'reference' => array(
'=this.UF_VIZAINFO' => 'ref.ID'
),
'join_type' => 'inner'
),
Есть идеи как это сделать?
подскажите, как избавиться от необходимости переавторизации после изменения принадлежности к группам.
У меня на сайте эта "переавторизация" не "возможно", а стопудово требуется.
Очень глупая ситуация - клиент оплачивает онлайн, ждет счастья с доступом и получает облом.
Проблема в том, что при оплате привязка групп выполняется не хитом юзера, а поэтому доступа к его сессии мы не имеем и технически не сможем повлиять на его группы.
Может подкините идею, как максимально качественно и незаметно "переавторизовать" пользователя?
Суть задачи: добавлять пользоватей в группу, при определённом IP и удалять из группы, если IP изменился.
Всё сделано, кроме "переавторизации" (т.е. очевидная проблема, даже после смены IP в сессии сохраняется группа и пользователь продолжает пользоваться правами данной группы)
Есть вариант просто логаутить пользователя - но это неудобно будет для него.
Думал делать редирект по типу добавления get параметра ?reauth_id=#ID#&secret=md5($salt."#ID#"), но мне это кажется не очень безопасным. Да и лишняя сущность.
Может быть есть какой-то механизм битровый который позволит изменить этот файл сессии?
Там даже пример есть.
Как-то не проверил и упустил.
Спасибо)
.
А можно как-то на d7 получить список пользователей? в старом CUser::GetList ?
Еще как можно. Вот пример получения ближайших именинников