Вывод всех пользователей и просмотр их профиля

Здравствуйте, помогите понять как сделать вывод всех пользователей группы user, и просмотр профиля каждого из них. Используется на сайте office, tickets, pdoTools.
Создал личный кабинет через office
На странице users вывел каждого юзера группы user через [[!pdoUsers]]
Как сделать подобное тому что на этом сайте?

Андрей
29 марта 2017, 11:19
modx.pro
4
3 365
0

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

Максим Кузнецов
29 марта 2017, 18:51
+2
Для реализации страницы «профиля» у вас есть 2 варианта:

1. При помощи собственной маршрутизации реализовать виртуальную страницу пользователя вида
/users/имя_пользователя, после чего в плагине на событие OnPageNotFound перехватывать имя пользователя и при совпадении с реальным пользователем — выводить информацию.
Таким способом реализованы страницы пользователей на этом сайте.

2. Плагином на событие OnUserActivate создавать полноценную страницу для пользователя, а на OnUserSave — синхронизировать данные.

В обоих случаях в чанке pdoUsers нужно будет сымитировать итоговую ссылку:
href="[[~2]]/[[+username}]]"
— где 2 = страница-контейнер для пользователей (users).
    Наумов Алексей
    29 марта 2017, 20:34
    0
    По п 1. отлично отрабатывает компонент VirtualPage, он гораздо приятнее в эксплуатации плагина.
      Андрей
      29 марта 2017, 22:25
      0
      Интересный компонент, спасибо. А как правильно выводить список пользователей на странице users, а с них ссылку на профиль?
      but1head
      29 марта 2017, 20:54
      0
      Del, не прочитал п.1 :)
        Александр
        09 апреля 2017, 12:11
        0
        Максим, а можете подсказать подробнее, как реализовать второй пункт? для SEO надо, чтобы страница таки «существовала физически» (
          Максим Кузнецов
          09 апреля 2017, 13:08
          3
          +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();
          					}
          				}
          			}
          		}
          	}
            Александр
            09 апреля 2017, 13:21
            0
            Спасибо! Не ожидал настолько развернутый ответ ) сейчас буду пробовать
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7