Поиск по пользователям сайта
        Вкратце — необходимо реализовать поиск по определенным пользовательским полям (пока fullname, phone).
Какими средствами это можно реализовать?
Думал насчет того, чтобы создавать по данным пользователей ресурсы-карточки, и уже по ресурсам искать. Как идеологически правильнее будет это сделать?
    
    
                                                                                
            Какими средствами это можно реализовать?
Думал насчет того, чтобы создавать по данным пользователей ресурсы-карточки, и уже по ресурсам искать. Как идеологически правильнее будет это сделать?
Комментарии: 21
                Сниппет pdoUsers + условия в where.            
                    
                Огромное спасибо!            
                    
                Уважаемый Василий, я не очень знаком с JSON, во where что я должен написать?
Так работает:
                    Так работает:
&where=`{"id": "6"}`Так не работает:&where=`{"logincount": "31"}`Есть какое-то ограничение на поля для выборки по условию?            
                Свойста юзеров в одтельной таблице, для поиска по ним нужно указать её имя:
Включи лог &showLog=`1` и будешь видеть запросы и ошибки.
                    &where=`{"modUserProfile.logincount":"31"}`Включи лог &showLog=`1` и будешь видеть запросы и ошибки.
                Из лога
                    0.0001669: Added where condition: modUser.active=1, modUserProfile.blocked=0, logincount=31Видно, что не подставилось имя таблицы перед logincount, понятно. Спасибо!            
                А если нужно сделать нестрогий поиск? Сейчас я формирую JSON строку в php и ее отдаю в $scriptProperties['where'].
А можно ли сделать поиск, скажем, по части имени (аналог SQL функции IN)? Если да — как примерно это реализуется?
                    А можно ли сделать поиск, скажем, по части имени (аналог SQL функции IN)? Если да — как примерно это реализуется?
                Вот что формируется в 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)));Куда копать?            
                Проблема решена — написал свой запрос и вывел все в чанк без использования класса pdoTools            
                    
                Тоже вариант.
Хотя, проще было прочитать документацию и написать вот так:
                    Хотя, проще было прочитать документацию и написать вот так:
&where=`{"username:LIKE":"%petr%"}`            
                Для этого надо было бы разобраться с тем, как работает Ваш класс, но, увы, мой уровень позволил сделать это лишь поверхностно. Да и очевидно, что надо было в формате JSON задавать where-условия.            
                    
                Нет, не надо.
Этот параметр принимают почти все мои сниппеты, а в JSON нет ничего сложного: скобочки да ковычки.
Итого, ответ на твой вопрос, при запуске из страницы сайта:
Через API MODX
В общем, дело твоё.
                    Этот параметр принимают почти все мои сниппеты, а в JSON нет ничего сложного: скобочки да ковычки.
Итого, ответ на твой вопрос, при запуске из страницы сайта:
[[!pdoUsers?
	&where=`{"username:LIKE":"%petr%"}`
]]Через API MODX
echo $modx->runSnippet('pdoUsers', array(
	'where' => '{"username:LIKE":"%petr%"}'
));В общем, дело твоё.
                Второй вызов очень удобный. Спасибо!            
                    
                Подскажите пожалуйста, как можно вывести юзера через GET? /?username=MyName
Для вывода тикетов использую: Вывод тикетов пользователя, правда с ЧПУ не сложилось. Сейчас задача вывести карточку пользователя.
                    Для вывода тикетов использую: Вывод тикетов пользователя, правда с ЧПУ не сложилось. Сейчас задача вывести карточку пользователя.
                Если своим сниппетом через pdoUsers, то примерно так:
Сниппет user.Profile
+ user.Profile.prepare, где преобразовываешь нужные поля до культурного вида, в духе:
+ чанк user.Profile, где формируешь шаблон профиля
Ну и в .htaccess добавить правило в духе:
— чтобы ссылка была вида не ?profile=.., а /users/Username
                    Сниппет 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
                Спасибо. Вроде понятно, но не получается, как надо. Вы не могли бы показать правильный вызов на странице?            
                    
                Создать страницу с псевдонимом users, в шаблоне или теле которого вызвать сниппет [[!user.Profile]]
и вызывать страницу профиля в виде название_сайта/users/Имя_пользователя
                    и вызывать страницу профиля в виде название_сайта/users/Имя_пользователя
                Спасибо, работает. Однако с ЧПУ снова не сложилось (            
                    
                спасибо огромнейшее
подскажите пожалуйста как детально сделать, правильно в tpl прописать
                    подскажите пожалуйста как детально сделать, правильно в tpl прописать
[[!pdoUsers?
    &groups=`customers`
    &roles=`Member`
    &tpl=`@INLINE <p> 
    [[+fullname]] 
    [[+username]] 
 
    незнаю как сделать link детально
    <hr>
    </p>`
    &sortby=`id`
    &where=`{"modUserProfile":""}    
]]            
                делаю так
на основной странице
страница подробней
подскажите пожалуйста, как сделать чтобы только данного юзера userfields отображались?
                    на основной странице
<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 отображались?
                вообщем неработает :(
ставлю limit 1 всё как бы нормально, но при переходе детально userfields для всех такие же отображаються (
как с userid link сделать чтобы только по его id userfieds отображались,
когда я с /manager/ с tech resources всё это делаю
подскажите нюбу pls
                    ставлю limit 1 всё как бы нормально, но при переходе детально userfields для всех такие же отображаються (
как с userid link сделать чтобы только по его id userfieds отображались,
когда я с /manager/ с tech resources всё это делаю
подскажите нюбу pls
                вообщем нашёл решение, как это делаеться
но как ссылку на подробней сделать так и непонял :(
                    но как ссылку на подробней сделать так и непонял :(
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.