Как вывести список групп пользователя?

Пытаюсь вывести список групп, в которые входит пользователь. Сразу уточню, вывести не одну группу, а названия именно всех групп. Примерное решение нашел, но выглядит крайне ерундовым.

Предполагается использовать это при выводе информации о пользователе возле его поста на форуме. На текущий момент мне пришло в голову использовать только Personalize, который позволяет выводить разные чанки в зависимости от того в какой группе состоит пользователь. То есть на каждую группу выставляется проверка. При совпадении выводится чанк с названием группы. Теоретически, будет проверяться входит ли пользователь в конкретную группу (перебор всех по очереди по отдельным условиям!) и под иконку будет публиковаться название по совпадениям.

Мало того, что Personalize под это не заточен и придется изгаляться, одна мысль о количестве операций, которые будут производиться для такой тривиальной задачи как вывод всех групп пользователя, вгоняет меня в ужас. Уверен, есть какое-то простое решение. Изначально нацеливался на pdoUsers, но как оказалось он парсит пользователей, входящих в группу, а не группы, в которые входит пользователь. Если кто занимался подобной задачей, поделитесь решением, пожалуйста.
Алексей Федоров
25 декабря 2015, 20:23
modx.pro
6
3 768
0

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

Алексей Федоров
26 декабря 2015, 01:02
0
Есть еще вот такой вариант, который является упрощением описанного в посте до вывода стандартными средствами:
[[+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=`Бла-бла-бла`]]

и все таки это жутко, а если число групп разрастется? Плохо будет((
    Сергей Шлоков
    26 декабря 2015, 12:21
    3
    +2
    Ну самое простое это сделать сниппет, в котором запрашивать группы
    <?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;
    и вставлять его в нужное место.
      Алексей Федоров
      26 декабря 2015, 12:39
      0
      Огромное спасибо!!!
        Алексей Федоров
        26 декабря 2015, 15:51
        0
        Подумалось, что для форума неплохо было бы оформлять вывод группы в столбик и как-то индивидуально оформлять каждую конкретную группу. Оформление есс-но через CSS, где название группы будет выводиться селектором content, можно добавить иконку перед ним и т.д. Он просто создан для этого)). Встал вопрос: как сделать так, чтобы название группы превращалось в класс для отдельного элемента. Выводить решил через тег em.

        Комментарий в коде просто спас. 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)))))

        Сергею Шлокову еще раз спасибо!
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        4