Бакрин Андрей
22 сент. 2014 г., 12:31

Вывод списка пользователей сайта

В блоге Песочница

Здравствуйте. Заинтересовался возможностью вывода списка пользователей (и некоторой информации из их профилей) на какой-либо странице сайта. Нашел, что можно это сделать с помощью Peoples, а условие, по котрому выводить можно прописать через &where. Но вот у меня почему-то не выводиться ничего с этим условием. Делаю так:
[[!Peoples? &where=`{"Profile.extended":"age":"31"}`]]
И так:
[[!Peoples? &where=`{"id":31}`]]
Все равно ничего не выводит. Также думаю, что можно вывод сделать с помощью pdoUsers, но вот там сформировать запрос не смог. Мне нужно например вывести все пользователей, у которых в поле Город например Москва.
А сниппет Peoples установлен?
Изучайте xPDO.
$q = $modx->newQuery('modUser'); $q->innerJoin('modUserProfile', 'Profile'); $q->where(array( 'Profile.city' => "Москва", )); $q->select(array( "Profile.*", "modUser.*", )); $s = $q->prepare(); $s->execute(); while($row = $s->fetch(PDO::FETCH_ASSOC)){ print "". $row['username']; }
Все равно ничего не выводит. Ума не приложу, где ошибка.
Ага, разобрался. Один момент хочу уточнить - а как мне вывести здесь дополнительное поле?
$q->where(array( 'Profile.city' => "Москва", ));
Вместо этого
'Profile.city'
что писать?
Какое именно поле? Которое в extended? Это отдельная песня. Там JSON-строка. Во-первых, по ним нельзя на уровне SQL-запроса выполнить поиск (Можно только сначала получить все данные, разобрать extended-поле и отсеять лишние объекты). Во-вторых, из-за на стороне php приходится порой использовать дополнительную логику. Например, вот так:
$q = $modx->newQuery('modUser'); $q->innerJoin('modUserProfile', 'Profile'); $q->select(array( "Profile.*", "modUser.*", )); $users = array(); foreach($modx->getCollection('modUser', $q) as $user){ if( $extended = json_decode($user->get('extended'), 1) AND !empty($extended['age']) AND $extended['age'] == 31 ){ $users[] = $user; } }
Поставил и изучил пакет Peoples. Мне сразу показался подозрительным ваш первый запрос [[!Peoples? &where=`{"Profile.extended":"age":"31"}`]] и сейчас я точно знаю что он у вас неправильный в корне. Peoples при выполнении так же формирует обычный xPDO-запрос (типа того, что я привел выше), и в качестве условия where принимает массив или JSON-строку. {"Profile.extended":"age":"31"} - это не правильная JSON-строка, при попытке разбора ее метод json_decode вернет пустое значение, то есть условие where не будет учтено в принципе, будут выведены все пользователи (точнее их юзернеймы, а не объекты пользователей). А условие &where=`{"id":31}` будет работать, но вернет только пользователя с id=31, если таковой будет иметься. еще раз: изучайте xPDO, как бы сложно это не казалось. Пока вы не будете понимать xPDO, вы ничего не будете по настоящему понимать в MODX-е. И pdoTools вас не спасет, если вы не будете понимать xPDO, так как pdoTools так же основывается на xPDO, просто это синтаксический сахар.
Спасибо, изучаю, но туго как то все получается)) Поэтому и приходиться время от времени к Вам обращаться.
Начните с простейших SQL-запросов к MySQL. Понимание SQL - огромный шаг на пути к пониманию xPDO.
Да вот с SQL более менее, а вот к xPDO сложновато перехожу
Если с SQL боле менее, с xPDO не должно быть никаких проблем. Изучите внимательно все уроки у Ильи Уткина, многое должно стать понятным.
Спасибо!!! Непременно буду изучать.
Не за что! P.S. лучше отвечать на конкретный коммент, а не писать просто новый коммент.
А можно ли вывести значение из поля extended.age? Пытаюсь так:
print "". $row['extended.age'];
и так:
print "". $row['extended']['age'];
Во втором случае выводит скобку {
Ааа, разобрался. Внимательнее прочитал Ваш комментарий, что нужно сначала получить значение поля extended в json формате, затем декодировать его, а затем вывести уже можно. Получилось так:
$json = $row['extended']; $age = json_decode($json); print $age->{'age'}; // 31
Правильно ли я сделал, или можно как-то сократить / оптимизировать запрос?
Правильно, только в json_decode второй параметр true надо добавить, чтобы получить в результате не объект, а массив, с ним проще работать. И вы совсем перепутали все переменные, не красиво.
$extended_json = $row['extended']; $extended = json_decode($extended_json, true); print $extended['age']; // 31
Еще скажу, что объект modUserProfile при попытке получить поле extended ведет себя несколько иначе и возвращает не json-строку, а сразу массив. За это отвечает описание поля в его мап-файле. Если вы выполните
$extended = $modx->getObject('modUser', $id)->Profile->get('extended');
, то получите сразу массив.

Добавить комментарий