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

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

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

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

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

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

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

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

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

P.S.

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

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

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

Я постарался прокомментировать свой плагин (сделан по тем же примерам) gist.github.com/Alroniks/e94bb0b997bbb55d02f94e72bc62a64c
    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 (так вот хотелось бы все же сделать так, чтобы был выбор при переключении)
      Иван Климчук
      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).
        Andrey
        15 сентября 2016, 12:48
        0
        Спасибо огроменное! Давно уже хотел реализовать эту фигню, без всяких костылей!
          Andrey
          27 мая 2017, 02:22
          0
          Приветствую! Уже прошло как много месяцев пользуюсь вашим плагином! Только он работает, а куча других примеров просто отказывается! Реально помогло! Но вот стукнула мне задача кое что еще сделать…
          В этой теме: modx.pro/help/12183/ — я описал проблему, там человек пытается мне помочь, но через свой пример, а самая боль в том, что его пример у меня не работает хоть ты убейся! Может вы поможете интегрировать его пример в ваш! Заранее спасибо!
        Andrey
        15 сентября 2016, 12:23
        0
        Разобрался с первым вопросом! Но все же хотелось бы решить последний, а именно второй! Вам уже огромное спасибо и плюсик разумеется! Все как часы работает! На большее я уже не рассчитываю! Последний вопрос постараюсь решить самостоятельно!
        varanika
        15 сентября 2016, 14:38
        0
        Доброго дня, можно поинтересоваться, как именно Вы формируете саму ссылку на страницу с данными пользователя?
          Andrey
          18 сентября 2016, 20:03
          1
          +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>
            varanika
            19 сентября 2016, 19:13
            1
            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>
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9