Как вывести список групп пользователя?
Пытаюсь вывести список групп, в которые входит пользователь. Сразу уточню, вывести не одну группу, а названия именно всех групп. Примерное решение нашел, но выглядит крайне ерундовым.
Предполагается использовать это при выводе информации о пользователе возле его поста на форуме. На текущий момент мне пришло в голову использовать только Personalize, который позволяет выводить разные чанки в зависимости от того в какой группе состоит пользователь. То есть на каждую группу выставляется проверка. При совпадении выводится чанк с названием группы. Теоретически, будет проверяться входит ли пользователь в конкретную группу (перебор всех по очереди по отдельным условиям!) и под иконку будет публиковаться название по совпадениям.
Мало того, что Personalize под это не заточен и придется изгаляться, одна мысль о количестве операций, которые будут производиться для такой тривиальной задачи как вывод всех групп пользователя, вгоняет меня в ужас. Уверен, есть какое-то простое решение. Изначально нацеливался на pdoUsers, но как оказалось он парсит пользователей, входящих в группу, а не группы, в которые входит пользователь. Если кто занимался подобной задачей, поделитесь решением, пожалуйста.
Предполагается использовать это при выводе информации о пользователе возле его поста на форуме. На текущий момент мне пришло в голову использовать только Personalize, который позволяет выводить разные чанки в зависимости от того в какой группе состоит пользователь. То есть на каждую группу выставляется проверка. При совпадении выводится чанк с названием группы. Теоретически, будет проверяться входит ли пользователь в конкретную группу (перебор всех по очереди по отдельным условиям!) и под иконку будет публиковаться название по совпадениям.
Мало того, что Personalize под это не заточен и придется изгаляться, одна мысль о количестве операций, которые будут производиться для такой тривиальной задачи как вывод всех групп пользователя, вгоняет меня в ужас. Уверен, есть какое-то простое решение. Изначально нацеливался на pdoUsers, но как оказалось он парсит пользователей, входящих в группу, а не группы, в которые входит пользователь. Если кто занимался подобной задачей, поделитесь решением, пожалуйста.
Комментарии: 4
Есть еще вот такой вариант, который является упрощением описанного в посте до вывода стандартными средствами:
[[+modx.user.isMember:is=`Users`:then=`Рядовой пользователь`]]
[[+modx.user.isMember:is=`Administrator`:then=`Администратор`]]
[[+modx.user.isMember:is=`Author`:then=`Автор`]]
[[+modx.user.isMember:is=`bla-bla-bla`:then=`Бла-бла-бла`]]
и все таки это жутко, а если число групп разрастется? Плохо будет((
[[+modx.user.isMember:is=`Users`:then=`Рядовой пользователь`]]
[[+modx.user.isMember:is=`Administrator`:then=`Администратор`]]
[[+modx.user.isMember:is=`Author`:then=`Автор`]]
[[+modx.user.isMember:is=`bla-bla-bla`:then=`Бла-бла-бла`]]
и все таки это жутко, а если число групп разрастется? Плохо будет((
Ну самое простое это сделать сниппет, в котором запрашивать группы
<?php
if ($modx->user->get('id')) {
$q = $modx->newQuery('modUser',array('`modUser`.`id`'=>$modx->user->get('id')));
$q->innerJoin('modUserGroupMember','UserGroupMembers');
$q->innerJoin('modUserGroup','UserGroup','`UserGroupMembers`.`user_group` = `UserGroup`.`id`');
$q->select('UserGroup.name');
$groupsArray = array();
if ($q->prepare() && $q->stmt->execute()) {
while($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
$groupsArray[] = $row['name'];
}
}
// Список групп через запятую
$userGroups = implode(',',$groupsArray);
} else {
$userGroups = 'Аноним';
}
return $userGroups;
и вставлять его в нужное место.
Огромное спасибо!!!
Подумалось, что для форума неплохо было бы оформлять вывод группы в столбик и как-то индивидуально оформлять каждую конкретную группу. Оформление есс-но через CSS, где название группы будет выводиться селектором content, можно добавить иконку перед ним и т.д. Он просто создан для этого)). Встал вопрос: как сделать так, чтобы название группы превращалось в класс для отдельного элемента. Выводить решил через тег em.
Комментарий в коде просто спас. Php не знаю, но в нагуглил как работает implode и соответственно изменил разделитель. Вместо запятой поставил
Собственно, весь вызов сниппета запихнул в чанк с аналогичный названием (tagElementPlugin — обалденная штука!). Сам чанк вызывается в TV (будет вызываться, когда разберусь с Login/HybridAuth). Остается добавить вызов TV в чанке комментария на тикет)) и будет более привычный для форума вид ;)
Оформление «флажков» каждой группы можно вынести в отдельный файл CSS, но править будет неудобно. Зато если воспользоваться ClientConfig, вписать все стили в него, то результат получим в плейсхолдере. Последний добавить в обработку MinifyX и будет один ужатый файлик. Блин… я все больше люблю modx)))))
Сергею Шлокову еще раз спасибо!
Комментарий в коде просто спас. Php не знаю, но в нагуглил как работает implode и соответственно изменил разделитель. Вместо запятой поставил
"></em>
<em class="
А на странице в лк-юзера будет вызываться<em class="[[UGroups.Forum?]]"></em>
Результат в итоге такой <em class="Administrator"></em>
<em class="MessageUsers"></em>
То есть все работает, все здорово. Вроде бы не рекомендуется html конструкции вставлять в php, так что если имеется более правильный вариант этого дела, то…Собственно, весь вызов сниппета запихнул в чанк с аналогичный названием (tagElementPlugin — обалденная штука!). Сам чанк вызывается в TV (будет вызываться, когда разберусь с Login/HybridAuth). Остается добавить вызов TV в чанке комментария на тикет)) и будет более привычный для форума вид ;)
Оформление «флажков» каждой группы можно вынести в отдельный файл CSS, но править будет неудобно. Зато если воспользоваться ClientConfig, вписать все стили в него, то результат получим в плейсхолдере. Последний добавить в обработку MinifyX и будет один ужатый файлик. Блин… я все больше люблю modx)))))
Сергею Шлокову еще раз спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.