ниппет pdoUsers предназначен для выборки и вывода пользователей сайта с гибкой фильтрацией по группам и ролям. Он формирует список пользователей с учетом их статуса, принадлежности к группам и назначенных ролей. Основное применение — создание каталогов пользователей, списков авторов, команды сайта, рейтингов участников и других подобных разделов.
Сниппет работает через библиотеку pdoTools, что обеспечивает высокую скорость выполнения и единообразие параметров с другими сниппетами пакета. PdoUsers поддерживает все возможности pdoFetch включая JOIN операции, сложные условия выборки и различные способы возврата данных.
- Параметры выборки пользователей
- Переопределенные параметры pdoTools
- Шаблоны оформления
- Основные шаблоны
- Доступные плейсхолдеры
- Базовый синтаксис использования
- Фильтрация по группам
- Фильтрация по ролям
- Выборка конкретных пользователей
- Управление статусом пользователей
- Активные и неактивные пользователи
- Заблокированные пользователи
- Сортировка пользователей
- Работа с профилями пользователей
- Вывод команды сайта
- Список авторов блога
- Вывод групп пользователя
- Возврат данных в разных форматах
- Интеграция с расширенными профилями
- Практический пример — рейтинг пользователей
- Вывод с пагинацией
- Отладка и логирование
- Вызов через Fenom
- Получение информации одного пользователя
Параметры выборки пользователей
Использует все общие параметры pdoTools за исключением специфичных для класса modResource, а так же свои собственные.
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
&class |
modUser |
Класс объекта для выборки (modUser, modUserProfile) |
&loadModels |
— | Компоненты для загрузки моделей |
&sortby |
id |
Поле для сортировки пользователей |
&sortdir |
ASC |
Направление сортировки |
&limit |
10 |
Ограничение количества результатов |
&offset |
0 |
Смещение от начала выборки |
&where |
— | Дополнительные условия в JSON |
&showInactive |
0 |
Показывать неактивных пользователей |
&showBlocked |
0 |
Показывать заблокированных пользователей |
&groups |
— | Фильтр по группам пользователей через запятую |
&roles |
— | Фильтр по ролям пользователей |
&users |
— | Конкретные ID пользователей для вывода |
&idx |
— | Начальное значение счетчика итераций |
&first |
1 |
Номер первой итерации |
&last |
вычисляется | Номер последней итерации |
&tpl |
— | Чанк для оформления пользователя |
&tplWrapper |
— | Обертка для всех результатов |
&wrapIfEmpty |
0 |
Выводить обертку при пустых результатах |
&toPlaceholder |
— | Сохранить в плейсхолдер |
&toSeparatePlaceholders |
— | Разбить по отдельным плейсхолдерам |
&showLog |
0 |
Показать лог работы сниппета |
Переопределенные параметры pdoTools
| Название | По умолчанию | Описание |
|---|---|---|
| &class | modUser |
Класс пользователя |
| &sortby | modUser.id |
Любое поле пользователя для сортировки. Можно указывать JSON строку с массивом нескольких полей. Для случайно сортировки укажите «RAND()» |
| &sortdir | ASC |
Направление сортировки: по убыванию «DESC» или возрастанию «ASC». |
Все шаблоны по умолчанию пусты. Для вывода результата в виде HTML, нужно указать, как минимум, значение шаблона &tpl.
Шаблоны оформления
PdoUsers использует стандартную систему шаблонов pdoTools.
Основные шаблоны
Параметр &tpl задает шаблон для каждого пользователя:
[[!pdoUsers?
&groups=`Team`
&tpl=`@INLINE
<div class="team-member">
<img src="[[+Profile.photo:default=`/assets/images/default-avatar.jpg`]]" alt="[[+username]]">
<h4>[[+Profile.fullname]]</h4>
<p>[[+Profile.position]]</p>
<a href="mailto:[[+Profile.email]]">Написать</a>
</div>`
]]
Параметр &tplWrapper оборачивает все результаты:
[[!pdoUsers?
&groups=`Authors`
&tplWrapper=`@INLINE <div class="authors-list">[[+output]]</div>`
&tpl=`authorCard`
]]
Доступные плейсхолдеры
В шаблонах pdoUsers доступны следующие плейсхолдеры:
Поля пользователя (modUser):
[[+id]]— идентификатор пользователя[[+username]]— имя пользователя[[+active]]— статус активности (1/0)[[+blocked]]— статус блокировки (1/0)[[+createdon]]— дата создания аккаунта
Поля профиля (modUserProfile):
[[+Profile.fullname]]— полное имя[[+Profile.email]]— электронная почта[[+Profile.phone]]— телефон[[+Profile.photo]]— фотография[[+Profile.address]]— адрес[[+Profile.city]]— город[[+Profile.state]]— регион/область[[+Profile.country]]— страна[[+Profile.website]]— веб-сайт- Любые расширенные поля профиля
Базовый синтаксис использования
Простейший вызов для вывода всех пользователей сайта:
[[!pdoUsers]]
Обратите внимание что сниппет должен вызываться некешируемым через восклицательный знак для актуальности данных.
Вывод пользователей конкретной группы:
[[!pdoUsers? &groups=`Authors` ]]
Вывод с использованием шаблона оформления:
[[!pdoUsers? &groups=`Authors` &tpl=`userRow` ]]
Ограничение количества выводимых пользователей:
[[!pdoUsers? &limit=`10` &sortby=`username` ]]
Фильтрация по группам
Параметр &groups позволяет выбирать пользователей определенных групп.
Вывод пользователей одной группы:
[[!pdoUsers? &groups=`Authors` &tpl=`authorCard`]]
Вывод пользователей нескольких групп:
[[!pdoUsers? &groups=`Authors,Editors,Administrators` &limit=`20`]]
Исключение пользователей определенной группы:
[[!pdoUsers? &groups=`-Banned` &showBlocked=`0` ]]
Вывод пользователей которые есть в одной группе но отсутствуют в другой:
[[!pdoUsers? &groups=`Members,-VIP`]]
Можно использовать как имена групп так и их идентификаторы:
[[!pdoUsers? &groups=`1,5,Authors`]]
Фильтрация по ролям
Параметр &roles фильтрует пользователей по назначенным ролям.
Вывод пользователей с ролью автора:
[[!pdoUsers? &roles=`Author` &tpl=`userItem`]]
Вывод администраторов и модераторов:
[[!pdoUsers? &roles=`Administrator,Moderator` &sortby=`username`]]
Исключение пользователей с определенной ролью:
[[!pdoUsers? &roles=`-Super User` &groups=`Content Editors`]]
Комбинация фильтров по группам и ролям:
[[!pdoUsers? &groups=`Editorial Team` &roles=`Author,Editor` &limit=`15`]]
Выборка конкретных пользователей
Параметр &users позволяет указать конкретный список пользователей для вывода.
Вывод пользователей по username:
[[!pdoUsers? &users=`admin,editor,author1` &tpl=`userProfile`]]
Вывод пользователей по ID:
[[!pdoUsers? &users=`1,5,10,15`]]
Смешанное использование ID и username:
[[!pdoUsers? &users=`1,admin,5,editor`]]
Исключение конкретных пользователей из выборки:
[[!pdoUsers? &groups=`Authors` &users=`-admin,-testuser`]]
Управление статусом пользователей
Активные и неактивные пользователи
Параметр &showInactive определяет показывать ли неактивных пользователей:
[[!pdoUsers? &groups=`Members` &showInactive=`1` ]]
По умолчанию выводятся только активные пользователи с active=1.
Заблокированные пользователи
Параметр &showBlocked управляет выводом заблокированных пользователей:
[[!pdoUsers? &showBlocked=`0` &groups=`-Banned` ]]
Вывод только заблокированных пользователей через условие where:
[[!pdoUsers? &showBlocked=`1` &where=`{"modUser.blocked":1}` ]]
Сортировка пользователей
Параметр &sortby определяет поле для сортировки.
Сортировка по имени пользователя:
[[!pdoUsers? &sortby=`username` &sortdir=`ASC` ]]
Сортировка по дате регистрации:
[[!pdoUsers? &sortby=`createdon` &sortdir=`DESC` &limit=`10` ]]
Сортировка по полям профиля:
[[!pdoUsers? &sortby=`Profile.fullname` &sortdir=`ASC` ]]
Случайная сортировка пользователей:
[[!pdoUsers? &groups=`Team` &sortby=`RAND()` &limit=`6` ]]
Множественная сортировка через JSON:
[[!pdoUsers? &sortby=`{"Profile.fullname":"ASC","createdon":"DESC"}` ]]
Работа с профилями пользователей
PdoUsers автоматически подключает профиль пользователя (modUserProfile) через LEFT JOIN.
Доступ к полям профиля в шаблонах через префикс Profile.:
[[!pdoUsers?
&groups=`Authors`
&tpl=`@INLINE
<div class="author-card">
<h3>[[+Profile.fullname:default=`[[+username]]`]]</h3>
<p>[[+Profile.email]]</p>
<p>[[+Profile.phone]]</p>
</div>`
]]
Фильтрация по полям профиля через where:
[[!pdoUsers?
&where=`{
"Profile.country":"Russia",
"Profile.city:!=":""
}`
]]
Вывод команды сайта
Пример вывода команды с фотографиями и должностями:
[[!pdoUsers?
&groups=`Team`
&sortby=`Profile.position_order`
&tpl=`@INLINE
<div class="col-md-4 mb-4">
<div class="team-card text-center">
<img src="[[+Profile.photo:pthumb=`w=300&h=300&zc=1`]]"
class="rounded-circle mb-3"
alt="[[+Profile.fullname]]">
<h4>[[+Profile.fullname]]</h4>
<p class="text-muted">[[+Profile.position]]</p>
<p>[[+Profile.bio:limit=`150`]]</p>
<div class="social-links">
[[+Profile.facebook:notempty=`<a href="[[+Profile.facebook]]"><i class="bi bi-facebook"></i></a>`]]
[[+Profile.twitter:notempty=`<a href="[[+Profile.twitter]]"><i class="bi bi-twitter"></i></a>`]]
[[+Profile.linkedin:notempty=`<a href="[[+Profile.linkedin]]"><i class="bi bi-linkedin"></i></a>`]]
</div>
</div>
</div>`
]]
Список авторов блога
Вывод авторов с количеством статей:
[[!pdoUsers?
&groups=`Authors`
&sortby=`Profile.fullname`
&tpl=`@INLINE
<div class="author-item">
<div class="author-avatar">
<img src="[[+Profile.photo:default=`/assets/images/avatar-default.png`]]"
alt="[[+Profile.fullname]]">
</div>
<div class="author-info">
<h5><a href="[[~[[++author_page_id]]]]?author=[[+id]]">[[+Profile.fullname]]</a></h5>
<p>[[+Profile.bio:limit=`100`]]</p>
<a href="[[~[[++author_page_id]]]]?author=[[+id]]">Все статьи автора</a>
</div>
</div>`
]]
Вывод групп пользователя
Для вывода списка групп каждого пользователя используйте prepareSnippet:
Создайте сниппет getUserGroups:
<?php
$user = $modx->getObject('modUser', $scriptProperties['id']);
if (!$user) return '';
$groups = $user->getMany('UserGroupMembers');
$groupNames = array();
foreach ($groups as $membership) {
$group = $membership->getOne('UserGroup');
if ($group) {
$groupNames[] = $group->get('name');
}
}
return implode(', ', $groupNames);
Использование в pdoUsers:
[[!pdoUsers?
&prepareSnippet=`getUserGroups`
&tpl=`@INLINE
<div class="user-card">
<h4>[[+username]]</h4>
<p>Группы: [[+groups]]</p>
</div>`
]]
Возврат данных в разных форматах
PdoUsers поддерживает различные форматы возврата данных.
Возврат только ID пользователей:
[[!pdoUsers? &groups=`Members` &return=`ids` &toPlaceholder=`userIds`]]
Возврат данных в формате JSON:
[[!pdoUsers? &groups=`Authors` &return=`json`]]
Возврат SQL запроса для отладки:
[[!pdoUsers? &groups=`Team` &return=`sql` &showLog=`1`]]
Интеграция с расширенными профилями
Если используется компонент для расширения профилей (например UserProfiles), можно подключить дополнительные таблицы:
[[!pdoUsers?
&leftJoin=`{
"ExtProfile": {
"class": "ExtendedProfile",
"on": "ExtProfile.user_id = modUser.id"
}
}`
&select=`{
"modUser":"*",
"Profile":"*",
"ExtProfile":"skills,experience,rating"
}`
&tpl=`extendedUserCard`
]]
Практический пример — рейтинг пользователей
Вывод топ-10 пользователей по рейтингу:
[[!pdoUsers?
&leftJoin=`{
"Rating": {
"class": "UserRating",
"on": "Rating.user_id = modUser.id"
}
}`
&select=`{
"modUser":"id,username",
"Profile":"fullname,photo",
"Rating":"points"
}`
&sortby=`Rating.points`
&sortdir=`DESC`
&limit=`10`
&tpl=`@INLINE
<div class="rating-item">
<div class="rank">[[+idx]]</div>
<img src="[[+photo:default=`/assets/images/avatar.png`]]" alt="[[+fullname]]">
<div class="user-info">
<h5>[[+fullname]]</h5>
<p>[[+points]] баллов</p>
</div>
</div>`
]]
Вывод с пагинацией
Использование pdoUsers совместно с pdoPage:
[[!pdoPage?
&element=`pdoUsers`
&groups=`Members`
&limit=`20`
&tpl=`userCard`
]]
<div class="pagination">
[[!+page.nav]]
</div>
Отладка и логирование
Просмотр подробного лога работы сниппета:
[[!pdoUsers? &groups=`Authors` &showLog=`1` &return=`chunks`]]
Лог покажет созданный SQL запрос, JOIN операции, время выполнения каждого этапа.
Вызов через Fenom
Использование шаблонизатора Fenom:
{'!pdoUsers' | snippet : [
'groups' => 'Team',
'sortby' => 'Profile.fullname',
'tpl' => '@INLINE
<div class="member">
<img src="{$Profile.photo}" alt="{$Profile.fullname}">
<h4>{$Profile.fullname}</h4>
<p>{$Profile.position}</p>
</div>'
]}
Получение информации одного пользователя
Хотя pdoUsers создан для списков, можно получить данные одного пользователя:
[[!pdoUsers?
&users=`[[*createdby]]`
&limit=`1`
&tpl=`@INLINE
<div class="post-author">
Автор: [[+Profile.fullname:default=`[[+username]]`]]
</div>`
]]
Или использовать стандартный модификатор MODX:
<p>Имя пользователя: [[+modx.user.id:userinfo=`username`]]</p> <p>Email: [[+modx.user.id:userinfo=`email`]]</p>






