Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Как программно получить пользовательские поля?

00 голосов
8
Всем доброго времени суток!

Суть задачи:
При авторизации проверять значение пользовательского поля юзверя и по заданному алгоритму производить дополнительные действия, связанные с авторизацией.

Юзаю событие OnAfterUserAuthorize и функцию CUser::GetList.

Что пишу:
Код
//файл /bitrix/php_interface/init.php
AddEventHandler("main", "OnAfterUserAuthorize", Array("MyClass", "OnAfterUserAuthorizeHandler"));

class MyClass
{
    function OnAfterUserAuthorizeHandler($arUser)
    {
      // выводим все данные которые у нас есть на пользователя
      echo '<pre>';
      print_r($arUser);
      echo '</pre>';    

      //устанавливаем фильтр для вывода дополнительных полей пользователя
      $rsUser = CUser::GetList(($by="ID"), ($order="desc"), array("ID"=>$arUser[ID]),array("SELECT"=>array("UF_MY_USER_FIELD")));
      echo '<pre>';
      print_r($rsUser);
      echo '</pre>';
    }
}



Получаем:
Первый print_r выдает все поля пользователя, согласно документации, т.е. все по-честному.
Но вот второй print_r вопреки моим ожиданиям не выдает id поля "UF_MY_USER_FIELD"

Код
CDBResult Object
(
    [result] => Resource id #93
    [arResult] => 
    [bNavStart] => 
    [bShowAll] => 
    [NavNum] => 
    [NavPageCount] => 
    [NavPageNomer] => 
    [NavPageSize] => 
    [NavShowAll] => 
    [NavRecordCount] => 
    [bFirstPrintNav] => 1
    [PAGEN] => 
    [SIZEN] => 
    [bFromArray] => 
    [bFromLimited] => 
    [sSessInitAdd] => 
    [nPageWindow] => 11
    [nSelectedCount] => 
    [arGetNextCache] => 
    [bDescPageNumbering] => 
    [arUserMultyFields] => Array
        (
            [UF_USER_CAR_DEMO] => 1
        )

    [SqlTraceIndex] => 
    [is_filtered] => 
)


При этом в профиле пользователя значение доп свойства доступно...

Может кто сталкивался или так подскажет, в чем же все-таки проблема?
спросил 08 Июль, 13 от Zews (180 баллов)

8 Ответы

00 голосов
В том, что пишите ошибочный код. Внимательно читайте документацию. Правильный вариант:
Код
$rsUser = CUser::GetByID($arUser[ID]); 
if ($arUser2 = $rsUser->Fetch())
{
      echo '<pre>'; 
      print_r($arUser2); 
      echo '</pre>';
}
ответил 08 Июль, 13 от Pomnep (13,960 баллов)
00 голосов
Попробовала. Получаю пустую выборку :(
ответил 22 Авг, 13 от Zews (180 баллов)
00 голосов
Должно работать, ищите ошибку в своём коде.

Суть в том, что после вызова CUser::GetList() или CUser::GetByID() вы получаете объект класса CDBResult. Чтобы извлечь из него данные, его нужно фетчить -- либо через метод Fetch(), либо через GetNext(). А в вашем исходном коде:

Цитата
Екатерина Бондарева пишет:
$rsUser = CUser::GetList(($by="ID"), ($order="desc"), array("ID"=>$arUser[ID]),array("SELECT"=>array("UF_MY_USER_FIELD")));
print_r($rsUser);

вы распечатываете именно объект класса CDBResult, а не данные выборки.
ответил 21 Ноя, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Екатерина Бондарева пишет:
Попробовала. Получаю пустую выборку

У Вас в коде вот так:
Код
$arUser[ID]

или вот так:
Код
$arUser["ID"]

?

Если первый вариант - тоже ошибка в общем случае.
ответил 01 Март, 14 от Pomnep (13,960 баллов)
00 голосов
Ой ли?

Код
C:\Users\banshee\Documents>cat a.php
<?
$a = array('USER' => 'someValue');
echo $a[USER]."\n";
echo $a['USER']."\n";
?>
C:\Users\banshee\Documents>php -f a.php
someValue
someValue

C:\Users\banshee\Documents>php -v
PHP 5.2.8 (cli) (built: Dec  8 2008 19:31:23)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
ответил 21 Июнь, 14 от Ly (4,580 баллов)
00 голосов
Цитата
Екатерина Бондарева пишет:
Попробовала. Получаю пустую выборку


Пробуй так.

Код
//файл /bitrix/php_interface/init.php
AddEventHandler("main", "OnAfterUserAuthorize", Array("MyClass", "OnAfterUserAuthorizeHandler"));

class MyClass
{
   function OnAfterUserAuthorizeHandler($arUser)
   {       
      $rsUser = CUser::GetByID($arUser['user_fields']['ID']);
      
      if ($res = $rsUser->Fetch())
      {
         echo "<pre>";print_r($res);echo "</pre>";
      }
   }
}
ответил 21 Окт, 14 от Incubus (580 баллов)
00 голосов
Спасибо за разъяснения Dmitry Ban.
Прочитав доки я тоже так поняла....но т.к. на практике у меня получается несколько иначе начала пробовать различные вариации.
Прочитав Ваш ответ написала следующее:

Код
AddEventHandler("main", "OnAfterUserAuthorize", Array("IDConnect", "OnAfterUserAuthorizeHandler"));

class IDConnect
{
    function OnAfterUserAuthorizeHandler($arUser)
    {
      $rsUser = CUser::GetByID($arUser["ID"]);
      if ($rsUser):
         echo 'rsUser СУЩЕСТВУЕТ =))))';
      endif;
      
      $userdata = $rsUser->Fetch();
      if ($userdata):
         echo '<pre>';
         print_r($userdata);
         echo '</pre>';
      else: echo '$userdata нету :(((((( ';
      endif;
    }
} 
 


Получила на выходе:
Код
rsUser СУЩЕСТВУЕТ =))))$userdata нету :(((((( 
ответил 20 Фев, 15 от Zews (180 баллов)
00 голосов
Нету у массива $arUser поля ID, есть только поле $arUser['user_fields']['ID']
ответил 30 Май, 15 от Incubus (580 баллов)

Похожие вопросы

0 голосов
3 ответов
0 голосов
6 ответов
0 голосов
6 ответов