Виртуальная страница пользователя Решено

Дополнение: pdoTools

Вот была тема:
Страница пользователя как на modx.pro

Здесь было описано как сделать страничку пользователя с кучей мануалов! Вроде все понятно и вообще не чего трудного!

Делал все как написано в инструкции, которая расписана можно сказать так, что и «чайник» вроде меня разберется!

Казалось бы, что может быть проще:
1. Создать страничку с алиасом user
2. Затем написать плагин и повесить его не одно единственное событие!
3. Радоваться результату!

НО! Эта схема не работает у меня на рабочем проекте! Проверил все, что можно по этому мануалу! Но много и не написано!

Решил протестировать на отдельной «Болванке», такая же ситуация! Подозрительные плагины и сниппеты использовать не хотелось бы, а этот написан по мануалу Василия Наумкина, в продуктах которого пока еще не разу не усомнился! И я так понимаю, что этот вариант используется и здесь на modx.pro!

Поэтому вывод очевиден! Очень хочется разобраться именно с этим примером!
Возможно, что то я упустил или в мануале не достаточно сведений!

Прошу помощи в этом не легком для меня вопросе! Заранее спасибо за любую помощь!

P.S.

Могу дать доступ к тестовой «болванке», чтобы понять как работает данное чудо программирования!
14 сентября 2016, 16:21    Andrey   
8    646 0

Комментарии (9)

  1. Иван Климчук 15 сентября 2016, 10:46 # +1
    В вашем случае нужно все же разобраться, как и что работает, чтобы доверять сторонним решениям. На деле задача довольно простая.

    Я постарался прокомментировать свой плагин (сделан по тем же примерам) gist.github.com/Alroniks/e94bb0b997bbb55d02f94e72bc62a64c
    1. Andrey 15 сентября 2016, 11:54 # 0
      Такс! Спасибо! Вроде теперь работают ссылки как надо, пробовал перейти на существующих пользователей, все здорово!

      Но остались вопросы! Например:

      1. Как должен выглядеть шаблон? Чтобы выводились данные именно того пользователя, которого мы запрашиваем! Потому как при запросе нужного пользователя выходят данные текущего авторизированного!
      Пример шаблона взял из примера выше:
      <h3>[[!+fullname]]</h3>
      <big>Информация</big>
      <table class="table">
      	<tbody>
      		<tr>
      			<td>Веб-сайт</td>
      			<td><a href="[[!+website]]" target="_blank">[[!+website]]</a></td>
      		</tr>
      		<tr>
      			<td>Город</td>
      			<td>[[!+city]]</td>
      		</tr>
      	</tbody>
      </table>
      Т.е. все плейсхолды вызваны не кешируемыми!
      Но при переходе на страницу запрашиваемого пользователя выводятся не то, что ннадо! В Вашем плагине нашел следующие:
      $modx->setPlaceholders($user, 'user.');
      $modx->setPlaceholders($profile, 'user.');
       $modx->setPlaceholders($extended, 'user.');
      Пока не совсем разобрался, как с этим жить! Если можно поясните, потому как понимаю, что именно их нужно использовать для отображения информации о запрошенном пользователе!

      2. И второй вопрос, здесь на modx.pro сделано таким образом, что страница modx.pro/users — используется для отображения все пользователей, а дальнейшие запросы уже ясное дело используются как modx.pro/users/username вопрос то не трудный, следственно как сделать, что то похожее?

      3. Так же на modx.pro организовано в ЛК таким образом, что в профиле можно выбрать как именно отображать ссылку на имя пользователя и стоит выбор между username и ID (так вот хотелось бы все же сделать так, чтобы был выбор при переключении)
      1. Иван Климчук 15 сентября 2016, 12:34 # +1
        Я же не просто так написал, что нужно все данные о пользователе положить в плейсхолдеры. Понятное дело, что на обычной странице информация о текущем пользователе будет выводится. Поэтому и записана все в плейсхолдеры с префикстом user. Выводить нужно так [[+user.fullname]], [[+user.email]] и тд. Кешированые или нет — это уже сами решайте.
        По 2-му вопросу, все логику делаете в самом шаблоне этой страницы. Если используете Fenom, то с ним несколько проще. Но на деле можно проверить так. Если в плейсхолдере user.id есть значение, значит у нас страница пользователя и нужно показать карточку юзера, если нет, то вывести список всех пользователей через pdoUsers. Т.е. обычный if.
        Насчет 3 не совсем понял, но определить пользователя по ID или useraname — это дописать условие в проверки в плагин. Если пришли цифры (можно проверить регулярным выражением или просто проверить на целое число функцией php), то искать пользователя по ID, иначе по username. Следовательно, если не нашлось, 404, нашлось — все тоже самое. Данные в плейсхолдеры, в шаблоне условия.
        Ну а как записать юзеру параметр, как его ссылку показывать, ну так тут можно или доп поля испльзовать или системные настройки уровня пользователя (я у себя из использую, так как отдельная таблица, проще иногда работать, modx_users_settings).
        1. Andrey 15 сентября 2016, 12:48 # 0
          Спасибо огроменное! Давно уже хотел реализовать эту фигню, без всяких костылей!
          1. Andrey 27 мая 2017, 02:22 # 0
            Приветствую! Уже прошло как много месяцев пользуюсь вашим плагином! Только он работает, а куча других примеров просто отказывается! Реально помогло! Но вот стукнула мне задача кое что еще сделать…
            В этой теме: modx.pro/help/12183/ — я описал проблему, там человек пытается мне помочь, но через свой пример, а самая боль в том, что его пример у меня не работает хоть ты убейся! Может вы поможете интегрировать его пример в ваш! Заранее спасибо!
        2. Andrey 15 сентября 2016, 12:23 # 0
          Разобрался с первым вопросом! Но все же хотелось бы решить последний, а именно второй! Вам уже огромное спасибо и плюсик разумеется! Все как часы работает! На большее я уже не рассчитываю! Последний вопрос постараюсь решить самостоятельно!
        3. Вараника 15 сентября 2016, 14:38 # 0
          Доброго дня, можно поинтересоваться, как именно Вы формируете саму ссылку на страницу с данными пользователя?
          1. Andrey 18 сентября 2016, 20:03 # +1
            Тут все достаточно просто!

            Страница формируется при помощи плагина!
            Т.е. создаете например страницу с Алиасом users и у вас в итоге получится, что то вроде этого:
            http://mysite.ru/users
            Затем пишем плагин, который был предложен джентльменом выше и обязательно ставим галочку на системное событие OnPageNotFound.

            Теперь надо поставить заполнитель для страницы с алиасом users, выглядеть он к примеру будет так:
            <h3>[[!+user.fullname]]</h3>
            <big>Информация</big>
            <table class="table">
            	<tbody>
            		<tr>
            			<td>Веб-сайт</td>
            			<td><a href="[[!+user.website]]" target="_blank">[[!+user.website]]</a></td>
            		</tr>
            		<tr>
            			<td>Город</td>
            			<td>[[!+user.city]]</td>
            		</tr>
            	</tbody>
            </table>
            Обратите внимание, что все плейсхолдеры прописываются с "!" это делается для того, что бы записи, которые будут выводиться на странице были именно того пользователя, которого вы искали, а не текущего! Так же имейте ввиду, что префикс user. можно поменять в коде палагина, но можно оставить и этот, но его обязательно необходимо указывать при выводе плейсхолдеров, иначе не чего появится при запросе! Ух ты, все готово! Теперь переходим к не посредственному тесту! А для этого, найдем пользователя с username например testuser и тут нам нужно пройти по адресу:
            http://mysite.ru/users/testuser
            и мы увидим нашего запрошенного юзера!

            Учтите, что я испытывал плагин и метод со следующими параметрами:
            1. Дружественные юри включены
            2. Вложеные юри включены
            3. Каталог с алиасом users — был в корне сайта!

            Вот вроде и все, что необходимо сделать, для отображения пользователя! Если хотите, чтобы по адресу показывался список пользователей, то:
            [[!+user.id:is=``:then=`[[$чанк или код списка пользователей, я вызывал при помощи pdoUsers]]:else=`[[$чанк или код заполнителей для отображения пользователя, например то, что я описал выше`]]
            т.е. что здесь происходит — если вы обращаетесь к странице, на которой нет запроса user.id:
            http://mysite.ru/users/
            то выводится список пользователей, если запросили пользователя:
            http://mysite.ru/users/testuser
            то тогда выводить страницу с данными пользователя!

            Чанк отображения пользователя в списке через pdoUsers, у меня выглядит так:
            <tr>
            	<td>[[!+id]]</td>
            	<td>
            		<img src="[[!+photo:default=`assets/avatars/default.jpg`]]" style="width:20%" class="img-circle">
            	</td>
            	<td><a href="[[~724]]/[[!+id]]">[[!+fullname:default=`Новый пользователь (Поменяйте отображаемое имя в настройках)`]]</a></td>
            	<td>[[!+createdon]]</td>
            	<td>[[!+tickets]]</td>
            	<td>[[!+comments]]</td>
            	<td>[[!+rating]]</td>
            	[[!+extended.user_status:is=``:then=`<td data-value="Пользователь">
            	   <span class="status-metro status-active" title="Команда проектов">Пользователь</span>
            	</td>`:else=`
            	<td data-value="[[!+extended.user_status]]">
            	   <span class="status-metro status-suspended" title="[[!+extended.user_status]]">[[!+extended.user_status]]</span>
            	</td>`]]
            </tr>
            
            1. Вараника 19 сентября 2016, 19:13 # 0
              Спасибо, что так подробно описали :) Однако, к тому времени, как я дождалась ответа, я уже поступила по другому (нашла пару советов в нескольких местах и соединила их) :)
              Я использую get запросы типа:
              <a href="[[~32]]?name=[[+username]]" title="Просмотреть">
              Где 32 — ресурс Страница пользователя, принимающий параметры с одним единственны вызовом:
              [[!userProfile]]
              А уже данный сниппет таков:
              <?php
              	$count = $modx->getCount('modUser', array('username' => $_GET['name']));
              	if($count <= 0 || $count >= 2){
              		echo'<div class="alert alert-warning" role="alert">	<h2>
              				Ошибка
              			</h2>
              			<p>Вы видите данное сообщение потому, что:</p>
              			<br />
              			<ul>
              			<li>пользователя не существует на сайте;</li>
              			<li>профиль пользователя был удален;</li>
              			<li>пользователь принадлежит к тайному обществу, которое скрывает данные о себе.</li>
              			</ul>
              			<br />
              			<p>Если Вы читаете данное сообщение, значит полный профиль скрыт и Вы можете посмотреть его краткую версию на 
              			странице <a href="[[~31]]" title="Все пользователи">Все пользователи</a></p></div>	';
              	}
              	else {
              	    $user = $modx->getObject('modUser',array('username'=>$_GET['name']));
                      $user_id = $user-> get('id');
              	   	$params = array();
              		$params['users'] = $user_id;
                              $params['limit'] = '1';
              		$params['showBlocked'] = '1';
              		$params['tpl'] = 'User';
              		$result = $modx->runSnippet('pdoUsers', $params);
              	
              		if (!empty($result)) {
              			return $result;
              		}
              		else {
              			return '<h2>
              					<a>Ошибка</a>
              				</h2>
              				<div>
              					Что-то пошло не так...
              				</div>';
              		}
              
              
              	}
              
              Т.е. через строку url я получаю имя пользователя, отдаю его сниппету, а он направляет выборку в pdoUsers. Придумано не мной, я лишь адаптировала под себя.

              Ну и чанк User, куда все полетело:

              <div class="col-lg-3 col-sm-3 hidden-xs col-md-3">
                  <img class="img-thumbmail margin-bottom15" src="[[+photo:default=`/assets/photouser/default.jpg`:thumb=`&w=150&h=150`]]" title="[[+username:htmlent]]">
              </div>
              <div class="col-lg-4 col-sm-4 col-xs-6 col-md-4">
                  <p class="margin-bottom25"><strong>Полное имя</strong></p>
              <p><strong>Логин</strong> </p>
              </div>
              <div class="col-lg-5 col-sm-5 col-xs-6 col-md-5">
                  <h3 class="margin-bottom25">[[+fullname:empty=`не указано`]]</h3>
                  <p>[[+username:empty=`не указано`]]</p>
                  <p><a class="btn btn-default ticket-read-more" href="[[~35? &msgID=`[[+id]]`  &recipient=`[[+sender]]`]]">
                      Написать</a>
                 </p>
              </div>
              <table class="table table-striped table-hover">
                    <tbody>
                   [[!getAuthorRating? &userId=`[[+id]]`]]
                     <tr><td>Город</td>
                     <td>[[+city:empty=`не указан`]]</td>
                     </tr>
                     <tr><td>Страна</td>
                     <td>[[+country:default=`Беларусь`]]</td>
                     </tr>
                     <tr></td></tr>
                    <tr><td>Телефон</td><td><span class="glyphicon glyphicon-phone-alt" aria-hidden="true"></span> 
                    [[+phone:empty=`не указан`]]<br /><span class="glyphicon glyphicon-earphone" aria-hidden="true"></span> 
                    [[+mobilephone:empty=`не указан`]]</td></tr>
                  </tbody>
              </table>
              
          Вы должны авторизоваться, чтобы оставлять комментарии.