Поиск по пользователям сайта
Вкратце — необходимо реализовать поиск по определенным пользовательским полям (пока 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
вообщем нашёл решение, как это делаеться
но как ссылку на подробней сделать так и непонял :(
но как ссылку на подробней сделать так и непонял :(
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.