Batyabest 22 сентября 2014 1 20
Здравствуйте.
Заинтересовался возможностью вывода списка пользователей (и некоторой информации из их профилей) на какой-либо странице сайта. Нашел, что можно это сделать с помощью Peoples, а условие, по котрому выводить можно прописать через &where. Но вот у меня почему-то не выводиться ничего с этим условием.
Делаю так:
[[!Peoples? &where=`{"Profile.extended":"age":"31"}`]]

И так:
[[!Peoples? &where=`{"id":31}`]]

Все равно ничего не выводит.
Также думаю, что можно вывод сделать с помощью pdoUsers, но вот там сформировать запрос не смог. Мне нужно например вывести все пользователей, у которых в поле Город например Москва.
20 комментариев
Fi1osof1
Fi1osof 22 сентября 2014г в 16:36 #
А сниппет 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'];
}
B
Batyabest 22 сентября 2014г в 16:39 #
Да, установлен
B
Batyabest 22 сентября 2014г в 17:01 #
Все равно ничего не выводит. Ума не приложу, где ошибка.
B
Batyabest 22 сентября 2014г в 18:22 #
Ага, разобрался. Один момент хочу уточнить - а как мне вывести здесь дополнительное поле?

$q->where(array(

'Profile.city' => "Москва",

));

Вместо этого
'Profile.city'
что писать?
Fi1osof1
Fi1osof 22 сентября 2014г в 19:58 #
Какое именно поле? Которое в extended? Это отдельная песня. Там JSON-строка. Во-первых, по ним нельзя на уровне SQL-запроса выполнить поиск (Можно только сначала получить все данные, разобрать extended-поле и отсеять лишние объекты). Во-вторых, из-за на стороне php приходится порой использовать дополнительную логику. Например, вот так:
<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;
}
}
B
Batyabest 23 сентября 2014г в 15:11 #
А можно ли вывести значение из поля extended.age?
Пытаюсь так:
print "". $row['extended.age'];
и так:
print "". $row['extended']['age'];

Во втором случае выводит скобку {
B
Batyabest 23 сентября 2014г в 15:47 #
Ааа, разобрался. Внимательнее прочитал Ваш комментарий, что нужно сначала получить значение поля extended в json формате, затем декодировать его, а затем вывести уже можно.
Получилось так:
$json = $row['extended'];
$age = json_decode($json);
print $age->{'age'}; // 31


Правильно ли я сделал, или можно как-то сократить / оптимизировать запрос?
Fi1osof1
Fi1osof 23 сентября 2014г в 15:58 #
Правильно, только в 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');
, то получите сразу массив.
B
Batyabest 23 сентября 2014г в 16:00 #
Ого, спасибо!
Fi1osof1
Fi1osof 23 сентября 2014г в 16:03 #
Пожалуйста!
B
Batyabest 22 сентября 2014г в 20:02 #
Ясно, спасибо!!!
Fi1osof1
Fi1osof 22 сентября 2014г в 20:03 #
Не за что!
Fi1osof1
Fi1osof 22 сентября 2014г в 20:11 #
Поставил и изучил пакет 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, просто это синтаксический сахар.
B
Batyabest 22 сентября 2014г в 20:14 #
Спасибо, изучаю, но туго как то все получается)) Поэтому и приходиться время от времени к Вам обращаться.
Fi1osof1
Fi1osof 22 сентября 2014г в 20:16 #
Начните с простейших SQL-запросов к MySQL. Понимание SQL - огромный шаг на пути к пониманию xPDO.
B
Batyabest 22 сентября 2014г в 20:26 #
Да вот с SQL более менее, а вот к xPDO сложновато перехожу
Fi1osof1
Fi1osof 22 сентября 2014г в 20:31 #
Если с SQL боле менее, с xPDO не должно быть никаких проблем. Изучите внимательно все уроки у Ильи Уткина, многое должно стать понятным.
B
Batyabest 22 сентября 2014г в 20:36 #
Спасибо!!! Непременно буду изучать.
Fi1osof1
Fi1osof 22 сентября 2014г в 20:38 #
Не за что!
P.S. лучше отвечать на конкретный коммент, а не писать просто новый коммент.
B
Batyabest 22 сентября 2014г в 20:52 #
Ок!
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.