[СДЕЛАЙ САМ] Получение ЛЮБЫХ полей пользователя
Если использовать как модификатор для fenom то запись будет такой:
{идентификатор пользователя | getUserInfo: 'fieldname1,fieldname2,extended.fieldname'}
Если как сниппет, то такой:
{'getUserInfo' | snippet:[
'input' => 'идентификатор пользователя',
'options' => 'fieldname1,fieldname2,extended.fieldname'
]}
идентификатор пользователя — id;
fieldname1,fieldname2 — основные поля профиля без префикса;
extended.fieldname — дополнительные поля профиля, те что хранятся в json и редактируются на отдельной вкладке, префикс extended. обязателен.
Собственно сам код сниппета getUserInfo (input передавать обязательно, если не передан $options вернётся массив всех полей пользователя и его профиля):
{идентификатор пользователя | 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;
}
Поблагодарить автора
Отправить деньги
Комментарии: 6
Не хочу быть снобом, но:
В самом начале аж два запроса в БД просто ради того чтобы не парится и в инпут пихать ид или юзернейм? Не слишком ли большие жертвы ради удобства разработчика?) Да и таблицу профиля дергать просто чтобы разработчик не думал откуда он тянет данные — слишком, и того, ради какого нибудь поля которое может быть вообще в индексе мы делаем аж три запроса в бд))
Я бы не хотел бы чтобы мне так писали сайт, где просто чтобы дернуть имя авторизованного пользователя например уходило по три запроса в бд)
В самом начале аж два запроса в БД просто ради того чтобы не парится и в инпут пихать ид или юзернейм? Не слишком ли большие жертвы ради удобства разработчика?) Да и таблицу профиля дергать просто чтобы разработчик не думал откуда он тянет данные — слишком, и того, ради какого нибудь поля которое может быть вообще в индексе мы делаем аж три запроса в бд))
Я бы не хотел бы чтобы мне так писали сайт, где просто чтобы дернуть имя авторизованного пользователя например уходило по три запроса в бд)
Вы правы, ради одного юзернейма такой огород городить не стоит, его можно получить гораздо проще, а что делать если у меня десяток полей в extended плюс данные в profile и в user? И да, я перепишу, сделаю один запрос в БД.
а что делать если у меня десяток полей в extended плюс данные в profile и в userКак и подразумевалось самим MODX'ом запрашивать их отдельно))
Да, унификация это удобно, удобно когда ты в один и тот же инпут атрибут можешь запихнуть любые данные а твой скрипт уже сам разберется что ты запихнул, но как правило, что в жизни, что в программировании — чем более универсальный инструмент — тем более он бесполезен в применении.
Во-первых, до этой минуты мне не приходила в голову мысль, что можно сделать так
{24 | user: 'extended'}
Теперь чувствую себя идиотом))) НО следом пришла другая мысль, код выше не делает запрос в БД? Как тогда он работает?
Я уже не помню, с modx давненько не работаю, но скорее всего как и везде, пользователь содержится в запросе, т.е. modx и так делает каждый раз запрос на получение пользователя, а этот модификатор берет уже полученную модель, твой же скрипт мало того что делает дополнительные запросы, так еще и делает их ТРИ штуки) Т.е. на 600 одновременно зашедших пользователей уйдет 1800 запросов в БД, а учитывая что свой сниппет ты используешь наверное для каждого поля отдельным вызовом, то на каждый вызов сниппета делается по три запроса в бд, 20 полей надо получить, 60 запросов в бд ушло)))
Переписал. Теперь если нужно много полей пользователя, можно одним запросом получить массив и его как плейсхолдеры раскидать по странице.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.