[СДЕЛАЙ САМ] Получение ЛЮБЫХ полей пользователя

Если использовать как модификатор для fenom то запись будет такой:
{идентификатор пользователя | getUserInfo: 'fieldname1,fieldname2,extended.fieldname'}

Если как сниппет, то такой:
{'getUserInfo' | snippet:[
'input' => 'идентификатор пользователя',
'options' => 'fieldname1,fieldname2,extended.fieldname'
]}

идентификатор пользователя — id;
fieldname1,fieldname2 — основные поля профиля без префикса;
extended.fieldname — дополнительные поля профиля, те что хранятся в json и редактируются на отдельной вкладке, префикс extended. обязателен.

Собственно сам код сниппета getUserInfo (input и options передавать обязательно):
<?php
if(!$input){return false;}
if(!$options){return false;}

$sql = 'SELECT * FROM `modx_users` LEFT JOIN  `modx_user_attributes` ON modx_users.id = modx_user_attributes.internalKey WHERE modx_users.id=:id';
$statement = $modx->prepare($sql);
if ( $statement->execute(array('id'=>$input)) ) {
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
}
$output = [];
$options = explode(',',$options);
if($result) {
    foreach($options as $option){
         $option = trim($option); // это на тот случай если полей много и захочется сделать перенос строки
        if (strpos($option,'extended.') === false) {
            $output[$option] = $result[0][$option];
        } else {
            $extended = json_decode($result[0]['extended'], 1);
            $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 && !$extended){
    return $output[$options[0]];
}elseif(count($output) == 1 && $extended){
    return $output[$ext];
}else{
    return $output;
}
Артур
27 ноября 2020, 01:33
modx.pro
1
248
+1
Поблагодарить автора Отправить деньги

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

Pavel Zarubin
08 декабря 2020, 07:40
0
Не хочу быть снобом, но:
В самом начале аж два запроса в БД просто ради того чтобы не парится и в инпут пихать ид или юзернейм? Не слишком ли большие жертвы ради удобства разработчика?) Да и таблицу профиля дергать просто чтобы разработчик не думал откуда он тянет данные — слишком, и того, ради какого нибудь поля которое может быть вообще в индексе мы делаем аж три запроса в бд))

Я бы не хотел бы чтобы мне так писали сайт, где просто чтобы дернуть имя авторизованного пользователя например уходило по три запроса в бд)
    Артур
    08 декабря 2020, 11:53
    0
    Вы правы, ради одного юзернейма такой огород городить не стоит, его можно получить гораздо проще, а что делать если у меня десяток полей в extended плюс данные в profile и в user? И да, я перепишу, сделаю один запрос в БД.
      Pavel Zarubin
      08 декабря 2020, 12:12
      0
      а что делать если у меня десяток полей в extended плюс данные в profile и в user
      Как и подразумевалось самим MODX'ом запрашивать их отдельно))
      Да, унификация это удобно, удобно когда ты в один и тот же инпут атрибут можешь запихнуть любые данные а твой скрипт уже сам разберется что ты запихнул, но как правило, что в жизни, что в программировании — чем более универсальный инструмент — тем более он бесполезен в применении.
        Артур
        08 декабря 2020, 12:43
        0
        Во-первых, до этой минуты мне не приходила в голову мысль, что можно сделать так
        {24 | user: 'extended'}
        Теперь чувствую себя идиотом))) НО следом пришла другая мысль, код выше не делает запрос в БД? Как тогда он работает?
          Pavel Zarubin
          08 декабря 2020, 13:01
          0
          Я уже не помню, с modx давненько не работаю, но скорее всего как и везде, пользователь содержится в запросе, т.е. modx и так делает каждый раз запрос на получение пользователя, а этот модификатор берет уже полученную модель, твой же скрипт мало того что делает дополнительные запросы, так еще и делает их ТРИ штуки) Т.е. на 600 одновременно зашедших пользователей уйдет 1800 запросов в БД, а учитывая что свой сниппет ты используешь наверное для каждого поля отдельным вызовом, то на каждый вызов сниппета делается по три запроса в бд, 20 полей надо получить, 60 запросов в бд ушло)))
            Артур
            08 декабря 2020, 13:20
            0
            Переписал. Теперь если нужно много полей пользователя, можно одним запросом получить массив и его как плейсхолдеры раскидать по странице.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    6