pdoUsers — вывод пользователей сайта в MODX

pdoUsers Дополнения

ниппет pdoUsers предназначен для выборки и вывода пользователей сайта с гибкой фильтрацией по группам и ролям. Он формирует список пользователей с учетом их статуса, принадлежности к группам и назначенных ролей. Основное применение — создание каталогов пользователей, списков авторов, команды сайта, рейтингов участников и других подобных разделов.

Сниппет работает через библиотеку pdoTools, что обеспечивает высокую скорость выполнения и единообразие параметров с другими сниппетами пакета. PdoUsers поддерживает все возможности pdoFetch включая JOIN операции, сложные условия выборки и различные способы возврата данных.

Параметры выборки пользователей

Использует все общие параметры 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>

Оцените статью
MODX 3
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.