Работа с группами пользователя на D7 Битрикс

Углубленное изучение Битрикс
  • Работа с группами пользователя на D7 Битрикс

    Антон Долганин 21 Января 2016 20:48 5410
    Вы все еще пользуетесь неправославной 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, принципы привязки к группе у пользователя остаются прежние - возможно, ему потребуется переавторизоваться.

    Кстати, обратите внимание на хитрый апдейт по двойному ключу. Если вы заглянете в карту таблицы, увидите, что там два праймари.
Vadim
22 Января 2016 13:09
Лучше так:
'filter' => array('=USER_ID' => $uid, '=GROUP_ID' => $targetGroup)
 

.
Антон Долганин
22 Января 2016 13:24
А по умолчанию все равно ровное сравнение идет (для целых). Для строк, да, это обязательно.
Денис
22 Января 2016 14:58
И в чем сила брат?
По сути сейчас CUser::GetUserGroupList  и ему подобные оббертка для того что ты описал.
Антон Долганин
22 Января 2016 15:21
А как по старинке продлить время пребывания в группе на 1 месяц?
Денис
23 Января 2016 22:22
Да, не подумал.
Иван
24 Января 2016 5:53
Все эти неймспейсы напридуманные в битрикс - полнейший бред!
Неймспейс - это строка. И смысл ее должен быть ясен в целом. А вся та херня, которую разработчики битрикса в нее пишут, говорит об их психическом недуге.
Антон Долганин
24 Января 2016 6:41
namespace - это из PHP http://php.net/manual/ru/language.namespaces.php

А чтобы не писать тонны лишних строк, в моем коде выше впишите
use \Bitrix\Main\UserGroupTable;
Тогда во всем коде можно убрать это приставку и писать просто
UserGroupTable::getList
и так далее.
Виктор Краснов
17 Марта 2016 23:28
А еще лучше:
use \Bitrix\Main\UserGroupTable as BxUserGroupTable; 


Дабы потом не путаться - где битриксовские неймспейсы, а где свои или еще чьи..
Артем
26 Февраля 2016 12:09
Подскажите, пожалуйста, как пользоваться классом CUserFieldEnum  в D7?

По старому Можно так
$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'
       ),

Есть идеи как это сделать?
Антон Долганин
27 Февраля 2016 5:54
Судя по Main\UserFieldTable, там Enum пока и не пахнет. То есть вряд ли можно решить вашу задачу. Я в таких случаях выношу в свою D7-таблицу класс и дополняю как мне его надо.  
Диана
7 Апреля 2016 0:06
принципы привязки к группе у пользователя остаются прежние - возможно, ему потребуется переавторизоваться.
Добрый день, Антон!
подскажите, как избавиться от необходимости переавторизации после изменения принадлежности к группам.
У меня на сайте эта "переавторизация" не "возможно", а стопудово требуется.
Очень глупая ситуация - клиент оплачивает онлайн, ждет счастья с доступом и получает облом.
Антон Долганин
7 Апреля 2016 5:17
А почему нельзя переавторизовать? К примеру после оплаты редиректить на страницу, где и переавторизовывать автоматически.

Проблема в том, что при оплате привязка групп выполняется не хитом юзера, а поэтому доступа к его сессии мы не имеем и технически не сможем повлиять на его группы.
Валентин
31 Марта 2017 19:47
Здравствуйте, Антон.
Может подкините идею, как максимально качественно и незаметно "переавторизовать" пользователя?

Суть задачи: добавлять пользоватей в группу, при определённом IP и удалять из группы, если IP изменился.

Всё сделано, кроме "переавторизации" (т.е. очевидная проблема, даже после смены IP в сессии сохраняется группа и пользователь продолжает пользоваться правами данной группы)

Есть вариант просто логаутить пользователя - но это неудобно будет для него.
Думал делать редирект по типу добавления get параметра ?reauth_id=#ID#&secret=md5($salt."#ID#"), но мне это кажется не очень безопасным. Да и лишняя сущность.
Может быть есть какой-то механизм битровый который позволит изменить этот файл сессии?
Антон Долганин
1 Апреля 2017 2:34
Я бы все же переавторизовывал, но невидимо для пользователя
https://dev.1c-bitrix.ru/api_help/main/reference/cuser/authorize.php
Там даже пример есть.
Валентин
5 Апреля 2017 15:42
Действительно, сработало. Мне почему-то казалось, что после авторизации нужно обязательно завершить хит, что бы оно работало.
Как-то не проверил и упустил.
Спасибо)
Антон Долганин
15 Июля 2016 8:21
Вступление и выход из группы пользователей на D7
\Bitrix\Main\UserGroupTable::add(array('GROUP_ID' => $group, 'USER_ID' => $arResult['USER_ID']));//вступление
\Bitrix\Main\UserGroupTable::delete(array('GROUP_ID' => $group, 'USER_ID' => $arResult['USER_ID']));//выход 

.
Александр
24 Июля 2016 15:07
Добрый день!
А можно как-то на d7 получить список пользователей? в старом CUser::GetList ?
Антон Долганин
25 Июля 2016 3:09
Добрый день.

Еще как можно. Вот пример получения ближайших именинников
http://bxapi.ru/club/user/1/blog/63569/  
Александр
25 Июля 2016 4:46
Спасибо, а то я толком и не знаю с чего начинать изучать d7
Александр
1 Мая 2017 20:48
А не подскажите как в новом ядре авторизовать и разавторизовать пользователя? И вообще работать с полями текущего пользователя, для $GLOBALS['APPLICATION'] есть аналог, а для $GLOBALS['USER'] ?  
Антон Долганин
2 Мая 2017 8:20
К сожалению, пока только по старинке - $GLOBALS['USER']