[Решено] Fenom и вызов полей пользователя

В документации есть пример вызова текущего пользователя через {$_modx->user}
Но как вызвать произвольного пользователя, по id?
Есть ли для этого быстрые феномовские штучки, или прийдётся писать сниппет, и уже его запускать через феном?

UPD.
Решение: написать свой сниппет-модификатор (для более удобного перехода с MODX-модификатора).
Сниппет-модификатор user_info
<?php
$output = '';
$profile = $modx->getObject('modUserProfile', ['internalKey' => $input]);
if($profile) {
    if (strpos($options,'extended.') === false) {
        $output = $profile->$options;
    } else {
        $ext = explode(".", $options);
        $profile = $profile->get('extended');
        if(isset($profile[$ext[1]])) {
            $output = $profile[$ext[1]];
        }        
    }    
}
return $output;
Вызывать его так:
{$_modx->runSnippet('!user_info', ['input' => 2,'options' => 'extended.skype'])}
где в options вбивается поле пользователя или extended-поле через точку. Поле input соответственно это ID пользователя.

Например переход с [[*author:userinfo=`fullname`]] будет выглядеть так:
{$_modx->runSnippet('!user_info', ['input' => $_modx->resource.author, 'options' => 'fullname'])}
Василий Столейков
10 ноября 2015, 12:57
modx.pro
4
3 624
0
Поблагодарить автора Отправить деньги

Комментарии: 7

Василий Столейков
10 ноября 2015, 23:14
0
Решил следующим образом:
1. Включил MODX в Fenom (pdotools_fenom_modx)
2. Вызвал следующим образом:
{$modx->getObject('modUser', 2)->username} // где 2 - это ID нужного пользователя
Возможно есть и более удобный способ.
    Василий Столейков
    10 ноября 2015, 23:50
    0
    Сорри, такой вариант не подходит для всех полей. Пришлось переписать в следующий вызов, чтобы был одной строкой:
    {$modx->getObject('modUser', 2)->getOne('Profile')->email}
      Василий Наумкин
      11 ноября 2015, 07:06
      +1
      Тогда уж так:
      {set $profile = $modx->getObject('modUserProfile', ['internalKey' => 2])}
      {if $profile}
      	{$profile->email}
      {/if}
      Но при включении {$modx}, любой пользователь админки, имеющий доступ к чанкам, получает доступ ко всем методам MODX и может создавать\удалять что угодно в системе.

      Использовать это можно только, если ты один, или всецело доверяешь своим пользователям.
        Василий Столейков
        11 ноября 2015, 08:48
        0
        Спасибо за пример, он натолкнул меня в нужном направлении!
        Я написал переходный сниппет-модификатор, подходит и для extended-полей.
    Павел Гвоздь
    11 ноября 2015, 06:52
    +3
    Лучше уж свой сниппет. Раньше тоже включал эту настройку, а когда Василий протер мне глаза, насколько это небезопасно, я задумался и решил, что оно того не стоит. Лучше написать свой более менее универсальный сниппет вывода полей определённого юзера. Если затрудняешься в этом — пиши, я выложу свой сниппет для этого дела. Не сказать, что он универсальный, но мои потребности решает.
      Василий Столейков
      11 ноября 2015, 08:44
      1
      +4
      Набросал свой сниппет-модификатор user_info (чтобы легче было перейти с MODX-модификаторов) по примеру выше.
      Вполне себе рабочее решение как мне кажется:
      <?php
      $output = '';
      $profile = $modx->getObject('modUserProfile', ['internalKey' => $input]);
      if($profile) {
          if (strpos($options,'extended.') === false) {
              $output = $profile->$options;
          } else {
              $ext = explode(".", $options);
              $profile = $profile->get('extended');
              if(isset($profile[$ext[1]])) {
                  $output = $profile[$ext[1]];
              }        
          }    
      }
      return $output;
      Вызываю его так:
      {$_modx->runSnippet('!user_info', ['input' => 2,'options' => 'extended.skype'])}
      где в options вбивается поле пользователя или extended-поле через точку.

      Спасибо тебе, Гвоздь, и Василию за примеры и пинки в нужном направлении!
      Артур
      15 мая 2020, 16:15
      0
      Вдруг я не единственный, кому понадобилось получать данные любого пользователя на фронте, используя fenom, поэтому предлагаю вашему вниманию более универсальную версию сниппета user_info
      $output = [];
      $options = explode(',',$options);
      $profile = $modx->getObject('modUserProfile', ['internalKey' => $input]);
      if($profile) {
          foreach($options as $option){
              if (strpos($option,'extended.') === false) {
              $output[$option] = $profile->$option;
              } else {
                  $extended = $profile->get('extended');
                  $ext = explode(".", $option);
                  $ext = $ext[1];
                  if(strpos($ext,'|') === false){
                      $output[$ext] = $extended[$ext];
                  }else{
                      $cont = explode("|", $ext);
                      $key = $cont[0];
                      $val = $cont[1];
                      $output[$key][$val] = $extended[$key][$val];
                      
                  }
              }    
          }
      }
      if(count($output) == 1){
          return $output[$options[0]];
      }else{
          return $output;
          //return json_encode($output); //раскомментируй чтобы возвращать json, а предыдущую закомментируй
      }
      Примеры вызова
      <!-- получаем email -->
      {44 | getUserInfo : 'email'} 
      <!-- получаем несколько полей -->
      {44 | getUserInfo : 'phone,extended.sizes|weight,extended.age' | print_r}
      Во втором случае вернется
      Array ( [phone] => +7(989)456-85-12 [sizes] => Array ( [weight] => 67 ) [age] => 35 )
      sizes — это контейнер в дополнительных полях профиля пользователя, в котором лежит атрибут weight.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7