Вывод всех пользователей и просмотр их профиля
Здравствуйте, помогите понять как сделать вывод всех пользователей группы user, и просмотр профиля каждого из них. Используется на сайте office, tickets, pdoTools.
Создал личный кабинет через office
На странице users вывел каждого юзера группы user через [[!pdoUsers]]
Как сделать подобное тому что на этом сайте?
Создал личный кабинет через office
На странице users вывел каждого юзера группы user через [[!pdoUsers]]
Как сделать подобное тому что на этом сайте?
Комментарии: 7
Для реализации страницы «профиля» у вас есть 2 варианта:
1. При помощи собственной маршрутизации реализовать виртуальную страницу пользователя вида
/users/имя_пользователя, после чего в плагине на событие OnPageNotFound перехватывать имя пользователя и при совпадении с реальным пользователем — выводить информацию.
Таким способом реализованы страницы пользователей на этом сайте.
2. Плагином на событие OnUserActivate создавать полноценную страницу для пользователя, а на OnUserSave — синхронизировать данные.
В обоих случаях в чанке pdoUsers нужно будет сымитировать итоговую ссылку:
1. При помощи собственной маршрутизации реализовать виртуальную страницу пользователя вида
/users/имя_пользователя, после чего в плагине на событие OnPageNotFound перехватывать имя пользователя и при совпадении с реальным пользователем — выводить информацию.
Таким способом реализованы страницы пользователей на этом сайте.
2. Плагином на событие OnUserActivate создавать полноценную страницу для пользователя, а на OnUserSave — синхронизировать данные.
В обоих случаях в чанке pdoUsers нужно будет сымитировать итоговую ссылку:
href="[[~2]]/[[+username}]]"
— где 2 = страница-контейнер для пользователей (users).
По п 1. отлично отрабатывает компонент VirtualPage, он гораздо приятнее в эксплуатации плагина.
Интересный компонент, спасибо. А как правильно выводить список пользователей на странице users, а с них ссылку на профиль?
Del, не прочитал п.1 :)
Максим, а можете подсказать подробнее, как реализовать второй пункт? для SEO надо, чтобы страница таки «существовала физически» (
Вообще, для сео это совсем не критично, т.к:
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:
1. В плагине создаем плейсхолдер user_id
2. В мета-тегах проверяем его наличие:
Что же до примера со вторым вариантом, то примерно вот так:
1. Создание страницы пользователя (тикетом)
2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:
1. В плагине создаем плейсхолдер user_id
2. В мета-тегах проверяем его наличие:
{block 'meta'}
{var $user_id = $_modx->getPlaceholder('user_id')}
{if $user_id | length > 0}
{var $user_name = $_modx->getPlaceholder('user_name')}
{var $pagetitle = $user_name ~ ' / Профиль пользователя'}
<title>{$pagetitle ~' :: '~ $_modx->config.site_name}</title>
...
{else}
{parent}
//обычный набор мета-тегов
{/if}
{/block}
— надеюсь логика понятна..)Что же до примера со вторым вариантом, то примерно вот так:
1. Создание страницы пользователя (тикетом)
<?php
if ($modx->event->name == 'OnUserActivate') {
if ($user) {
if ($profile = $user->getOne('Profile')) {
$user_id = $user->get('id');
$fullname = $profile->get('fullname');
/* Можно распределять пользователей в зависимости от их группы */
if ($user->isMember('Users')) {
//указываем родителя и шаблон
$parent = 21;
$template = 28;
}
if (isset($parent)) {
//Дополнительно может потребоваться проверка на то, создана ли уже страница для пользователя
//(на случай, если у вас возможна повторная активация-деактивация пользотвалея
$page = $modx->getObject('modResource', array(
'parent' => $parent,
'createdby' => $user_id
));
if (!$page) {
/* Формируем uri по айди пользователя */
$parent_alias = $modx->getObject('modDocument', $parent)->get('alias');
$parent_alias .= '/' . $user_id;
$ticket = $modx->newObject('modDocument');
$ticket->set('parent', $parent);
$ticket->set('template', $template);
$ticket->set('class_key', 'Ticket');
$ticket->set('show_in_tree', 0);
$ticket->set('published', 1);
$ticket->set('author', $user_id);
$ticket->set('createdby', $user_id);
$ticket->set('pagetitle', $fullname);
$ticket->set('uri_override', 1);
$ticket->set('uri', $parent_alias);
$ticket->set('alias', $user_id);
$ticket->save();
}
}
}
}
}
2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
<?php
if ($modx->event->name == 'OnUserFormSave' && $mode != 'new') {
if ($user) {
if ($profile = $user->getOne('Profile')) {
$user_id = $user->get('id');
if ($user->isMember('Users')) {
$parent = 21;
}
if (isset($parent)) {
//Ищем страницу пользователя
$page = $modx->getObject('modResource', array(
'parent' => $parent,
'createdby' => $user_id
));
if ($page) {
$extended = $profile->get('extended');
//Обновляем дефолтное поле страницы
$page->set('pagetitle', $profile->get('fullname'));
//Обновляем тв-поле
if (isset($extended['phone'])) {
$page->setTVValue('user_phone', $extended['phone']);
}
//Дополнить требуемыми полями по вкусу %)
$page->save();
}
}
}
}
}
Спасибо! Не ожидал настолько развернутый ответ ) сейчас буду пробовать
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.