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

Если использовать как модификатор для 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;}
$table_prefix = $modx->getOption('table_prefix');
$sql = 'SELECT * FROM `'.$table_prefix.'users` User LEFT JOIN  `'.$table_prefix.'user_attributes` Profile ON User.id = Profile.internalKey WHERE User.id=:id';
$statement = $modx->prepare($sql);
if ( $statement->execute(array('id'=>$input)) ) {
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
}
$output = [];
if($result) {
    $extended = json_decode($result[0]['extended'], 1);
    if($options){
        $options = explode(',',$options);
        foreach($options as $option){
            $option = trim($option); // это на тот случай если полей много и захочется сделать перенос строки
            if (strpos($option,'extended.') === false) {
                $output[$option] = $result[0][$option];
            } else {
                $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];

                }
            }
        }
    }else{
        $output = $result[0];
        $output['extended'] = $extended;
    }
}
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
2
654
+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