Поиск по пользователям сайта

Вкратце — необходимо реализовать поиск по определенным пользовательским полям (пока fullname, phone).
Какими средствами это можно реализовать?

Думал насчет того, чтобы создавать по данным пользователей ресурсы-карточки, и уже по ресурсам искать. Как идеологически правильнее будет это сделать?
K. Aleksey
08 октября 2013, 12:38
modx.pro
2 039
0

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

Василий Наумкин
08 октября 2013, 16:47
0
Сниппет pdoUsers + условия в where.
    K. Aleksey
    08 октября 2013, 16:53
    0
    Огромное спасибо!
      K. Aleksey
      09 октября 2013, 12:19
      0
      Уважаемый Василий, я не очень знаком с JSON, во where что я должен написать?

      Так работает:
      &where=`{"id": "6"}`
      Так не работает:
      &where=`{"logincount": "31"}`
      Есть какое-то ограничение на поля для выборки по условию?
        Василий Наумкин
        09 октября 2013, 12:57
        0
        Свойста юзеров в одтельной таблице, для поиска по ним нужно указать её имя:
        &where=`{"modUserProfile.logincount":"31"}`

        Включи лог &showLog=`1` и будешь видеть запросы и ошибки.
          K. Aleksey
          09 октября 2013, 13:43
          0
          Из лога

          0.0001669: Added where condition: modUser.active=1, modUserProfile.blocked=0, logincount=31
          Видно, что не подставилось имя таблицы перед logincount, понятно. Спасибо!
        K. Aleksey
        14 октября 2013, 14:57
        0
        А если нужно сделать нестрогий поиск? Сейчас я формирую JSON строку в php и ее отдаю в $scriptProperties['where'].

        А можно ли сделать поиск, скажем, по части имени (аналог SQL функции IN)? Если да — как примерно это реализуется?
          K. Aleksey
          15 октября 2013, 14:44
          0
          Вот что формируется в query при вызове pdoUsers&users=`petr.petrov`
          SELECT `modUser`.`id` AS `modUser_id`, `modUser`.`username` AS `modUser_username`, `modUser`.`password` AS `modUser_password`, `modUser`.`cachepwd` AS `modUser_cachepwd`, `modUser`.`class_key` AS `modUser_class_key`, `modUser`.`active` AS `modUser_active`, `modUser`.`remote_key` AS `modUser_remote_key`, `modUser`.`remote_data` AS `modUser_remote_data`, `modUser`.`hash_class` AS `modUser_hash_class`, `modUser`.`salt` AS `modUser_salt`, `modUser`.`primary_group` AS `modUser_primary_group`, `modUser`.`session_stale` AS `modUser_session_stale`, `modUser`.`sudo` AS `modUser_sudo` FROM `modx_users` AS `modUser` WHERE `modUser`.`username` IN ('petr.petrov)
          Как модифицировать скрипт так, чтобы where выглядела как
          WHERE `modUser`.`username` LIKE '%petr%'
          ?

          Строчка, формирующая запрос:
          $q = $modx->newQuery($p['class'], array($p['name'].':IN' => array_merge($fetch_in, $fetch_out)));
          Куда копать?
            K. Aleksey
            16 октября 2013, 11:02
            0
            Проблема решена — написал свой запрос и вывел все в чанк без использования класса pdoTools
              Василий Наумкин
              16 октября 2013, 13:27
              0
              Тоже вариант.

              Хотя, проще было прочитать документацию и написать вот так:
              &where=`{"username:LIKE":"%petr%"}`
                K. Aleksey
                16 октября 2013, 13:51
                0
                Для этого надо было бы разобраться с тем, как работает Ваш класс, но, увы, мой уровень позволил сделать это лишь поверхностно. Да и очевидно, что надо было в формате JSON задавать where-условия.
                  Василий Наумкин
                  16 октября 2013, 14:16
                  0
                  Нет, не надо.
                  Этот параметр принимают почти все мои сниппеты, а в JSON нет ничего сложного: скобочки да ковычки.

                  Итого, ответ на твой вопрос, при запуске из страницы сайта:
                  [[!pdoUsers?
                  	&where=`{"username:LIKE":"%petr%"}`
                  ]]

                  Через API MODX
                  echo $modx->runSnippet('pdoUsers', array(
                  	'where' => '{"username:LIKE":"%petr%"}'
                  ));

                  В общем, дело твоё.
                    K. Aleksey
                    16 октября 2013, 15:51
                    0
                    Второй вызов очень удобный. Спасибо!
            Alexander V
            04 октября 2014, 11:35
            1
            0
            Подскажите пожалуйста, как можно вывести юзера через GET? /?username=MyName
            Для вывода тикетов использую: Вывод тикетов пользователя, правда с ЧПУ не сложилось. Сейчас задача вывести карточку пользователя.
              Максим Кузнецов
              04 октября 2014, 12:35
              1
              +1
              Если своим сниппетом через pdoUsers, то примерно так:

              Сниппет user.Profile
              <?php
              	$count = $modx->getCount('modUser', array('username' => $_GET[profile]));
              	if($count <= 0){
              		echo'	<h2 class="contentTitle">
              					<a>Ошибка</a>
              				</h2>
              				<div class="content">
              					Пользователя не существует.
              				</div>';
              	}
              	else {
              		$params = array();
              		$params['users'] = $_GET[profile];
              		$params['showBlocked'] = '1';
              		$params['tpl'] = 'user.Profile';
              		$params['prepareSnippet'] = 'user.Profile.prepare';
              		
              		$result = $modx->runSnippet('pdoUsers', $params);
              		
              		if (!empty($result)) {
              			echo $result;
              		}
              		else {
              			echo'	<h2 class="contentTitle">
              						<a>Ошибка</a>
              					</h2>
              					<div class="content">
              						Что-то сломалось..
              					</div>';
              		}
              
              	}

              + user.Profile.prepare, где преобразовываешь нужные поля до культурного вида, в духе:
              <?php
              	if ($row['gender'] == '1') {
              		$row['gender'] = 'Парень';
              	}
              	elseif ($row['gender'] == '2') {
              		$row['gender'] = 'Девушка';
              	}
              	elseif ($row['gender'] == '0')
              		$gender ='';
              
              
              	if (!empty($row['fullname']))
              		$row['fullname'] = 'Имя: <b>' . $row['fullname'] . '</b>
              
              ';
              
              	if (!empty($row['gender']))
              		$row['gender'] = 'Пол: <b class="' . $gender . '">' . $row['gender'] . '</b>
              ';
              		
              
              	if (!empty($row['city']))
              		$row['city'] = 'Город: <b>' . $row['city'] . '</b>
              ';
              		
              		
              	if ($row['blocked'] != '0' && $row['blockeduntil'] == '0')
              		$row['blocked'] = '
              Заблокирован
              ';
              	else $row['blocked'] = '';
              		
              	if ($row['blockeduntil'] != '0')
              		$row['blockeduntil'] = '
              Заблокирован до:' . $row['blockeduntil'] . '
              ';
              	else $row['blockeduntil'] = '';
              		
              	return serialize($row);


              + чанк user.Profile, где формируешь шаблон профиля

              Ну и в .htaccess добавить правило в духе:
              RewriteRule ^users/([^/]+)$ /users?profile=$1 [L]

              — чтобы ссылка была вида не ?profile=.., а /users/Username
                Alexander V
                04 октября 2014, 13:12
                0
                Спасибо. Вроде понятно, но не получается, как надо. Вы не могли бы показать правильный вызов на странице?
              Максим Кузнецов
              04 октября 2014, 13:15
              0
              Создать страницу с псевдонимом users, в шаблоне или теле которого вызвать сниппет [[!user.Profile]]

              и вызывать страницу профиля в виде название_сайта/users/Имя_пользователя
                Alexander V
                04 октября 2014, 13:39
                0
                Спасибо, работает. Однако с ЧПУ снова не сложилось (
                Кирилл
                22 августа 2020, 20:02
                0
                спасибо огромнейшее

                подскажите пожалуйста как детально сделать, правильно в tpl прописать

                [[!pdoUsers?
                    &groups=`customers`
                    &roles=`Member`
                    &tpl=`@INLINE <p> 
                    [[+fullname]] 
                    [[+username]] 
                 
                    незнаю как сделать link детально
                    <hr>
                    </p>`
                    &sortby=`id`
                    &where=`{"modUserProfile":""}    
                ]]
                  Кирилл
                  22 августа 2020, 21:03
                  0
                  делаю так
                  на основной странице

                  <div class="row">
                  
                  [[!pdoUsers?
                      &groups=`usersgroup`
                      &roles=`Member`
                      &tpl=`@INLINE
                      <p>
                      [[+fullname]]
                      [[+username]    
                      <a href="[[~]]">подробней</a>
                      <hr>
                      </p>`
                      &sortby=`id`
                      &where=`{"modUserProfile":""}    
                  ]]
                  
                  </div>

                  страница подробней

                  <div class="row">
                  
                  [[!pdoUsers?
                      &groups=`usersgroup`
                      &roles=`Member`
                      &tpl=`@INLINE 
                      <p>
                      [[+fullname]]
                      [[+username]]           
                      
                      [[+someuserfield]]
                      [[+someuserfielddesc]]      
                      <hr>
                      </p>`
                  ]]
                  
                  </div>

                  подскажите пожалуйста, как сделать чтобы только данного юзера userfields отображались?
                    Кирилл
                    22 августа 2020, 21:30
                    0
                    вообщем неработает :(

                    ставлю limit 1 всё как бы нормально, но при переходе детально userfields для всех такие же отображаються (
                    как с userid link сделать чтобы только по его id userfieds отображались,
                    когда я с /manager/ с tech resources всё это делаю

                    подскажите нюбу pls
                    Кирилл
                    27 августа 2020, 10:32
                    0
                    вообщем нашёл решение, как это делаеться
                    но как ссылку на подробней сделать так и непонял :(
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      21