[Решено] Fenom и вызов полей пользователя
В документации есть пример вызова текущего пользователя через {$_modx->user}
Но как вызвать произвольного пользователя, по id?
Есть ли для этого быстрые феномовские штучки, или прийдётся писать сниппет, и уже его запускать через феном?
UPD.
Решение: написать свой сниппет-модификатор (для более удобного перехода с MODX-модификатора).
Сниппет-модификатор user_info
Например переход с [[*author:userinfo=`fullname`]] будет выглядеть так:
Но как вызвать произвольного пользователя, по 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'])}
Поблагодарить автора
Отправить деньги
Комментарии: 7
Решил следующим образом:
1. Включил MODX в Fenom (pdotools_fenom_modx)
2. Вызвал следующим образом:
1. Включил MODX в Fenom (pdotools_fenom_modx)
2. Вызвал следующим образом:
{$modx->getObject('modUser', 2)->username} // где 2 - это ID нужного пользователя
Возможно есть и более удобный способ.
Сорри, такой вариант не подходит для всех полей. Пришлось переписать в следующий вызов, чтобы был одной строкой:
{$modx->getObject('modUser', 2)->getOne('Profile')->email}
Тогда уж так:
Использовать это можно только, если ты один, или всецело доверяешь своим пользователям.
{set $profile = $modx->getObject('modUserProfile', ['internalKey' => 2])}
{if $profile}
{$profile->email}
{/if}
Но при включении {$modx}, любой пользователь админки, имеющий доступ к чанкам, получает доступ ко всем методам MODX и может создавать\удалять что угодно в системе.Использовать это можно только, если ты один, или всецело доверяешь своим пользователям.
Спасибо за пример, он натолкнул меня в нужном направлении!
Я написал переходный сниппет-модификатор, подходит и для extended-полей.
Я написал переходный сниппет-модификатор, подходит и для extended-полей.
Лучше уж свой сниппет. Раньше тоже включал эту настройку, а когда Василий протер мне глаза, насколько это небезопасно, я задумался и решил, что оно того не стоит. Лучше написать свой более менее универсальный сниппет вывода полей определённого юзера. Если затрудняешься в этом — пиши, я выложу свой сниппет для этого дела. Не сказать, что он универсальный, но мои потребности решает.
Набросал свой сниппет-модификатор 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-поле через точку.Спасибо тебе, Гвоздь, и Василию за примеры и пинки в нужном направлении!
Вдруг я не единственный, кому понадобилось получать данные любого пользователя на фронте, используя 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.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.