pdoPage + Easycomm: вывод комментариев на 1 странице с разбивкой кнопкой показать еще
Здравствуйте, друзья!
Столкнулась с задачей вывести комментарии Easycomm на одной странице. Необходимо собрать все комментарии которые находятся под ресурсом с id 5. Комментарии оставлены к дочерним ресурсам ресурса 5. То есть, комментарии оставлены не к ресурсу с id 5, а к дочерним ресурсам родителя с id 5. Мне необх+одимо эти комментарии вывести в новом ресурсе так чтобы на странице отображались по 10 комментариев и была кнопка Показать еще. Поэтому подумала можете pdoPage сможет это сделать.
Вот какой запрос написать с pdoPage, пока не знаю. Не нашла примеры.
Кстати, в комментариях, мне необходимо также вывести pagetitle и дополнительные поля ресурсов (не комментариев). Например, tv.logo, tv.lic.
Может вы сталкивались с подобной задачей? Пожалуйста, поделитесь опытом! Спасибо!
Столкнулась с задачей вывести комментарии Easycomm на одной странице. Необходимо собрать все комментарии которые находятся под ресурсом с id 5. Комментарии оставлены к дочерним ресурсам ресурса 5. То есть, комментарии оставлены не к ресурсу с id 5, а к дочерним ресурсам родителя с id 5. Мне необх+одимо эти комментарии вывести в новом ресурсе так чтобы на странице отображались по 10 комментариев и была кнопка Показать еще. Поэтому подумала можете pdoPage сможет это сделать.
Вот какой запрос написать с pdoPage, пока не знаю. Не нашла примеры.
Кстати, в комментариях, мне необходимо также вывести pagetitle и дополнительные поля ресурсов (не комментариев). Например, tv.logo, tv.lic.
Может вы сталкивались с подобной задачей? Пожалуйста, поделитесь опытом! Спасибо!
Комментарии: 12
привет!
Да, здесь pdoPage должен работать.
Насчет этого «Необходимо собрать все комментарии которые находятся под ресурсом с id 5.»
Два варианта решения:
1. дочерних ресурсов мало — просто формируйте сторонним сниппетом строку для параметра threads для ecMessages в виде 'resource-6,resource-7,resource-8,resource-9,resource-10'…
2. Дочерних много — укажите threads='*', а ограничение выборки делайте через параметр where.
3. Дочерних много и они вложены на много уровней вниз — тут посложнее, все зависит от конкретной ситуации.
Я бы наверное изначально формировал thread в виде category-5-resource-10, чтобы потом через LIKE выбирать: 'category-5-%'.
>> также вывести pagetitle
Читайте про параметр resourceFields у сниппета ecMessages в документации.
А вот TV вы так не выберете. Тут только JOIN если делать.
Да, здесь pdoPage должен работать.
{'!pdoPage' | snippet : [
'element' => 'ecMessages',
...
все прочие параметры ecMessages
....
]}
Про работу кнопки «Загрузить еще» стоит читать его документацию…Насчет этого «Необходимо собрать все комментарии которые находятся под ресурсом с id 5.»
Два варианта решения:
1. дочерних ресурсов мало — просто формируйте сторонним сниппетом строку для параметра threads для ecMessages в виде 'resource-6,resource-7,resource-8,resource-9,resource-10'…
2. Дочерних много — укажите threads='*', а ограничение выборки делайте через параметр where.
3. Дочерних много и они вложены на много уровней вниз — тут посложнее, все зависит от конкретной ситуации.
Я бы наверное изначально формировал thread в виде category-5-resource-10, чтобы потом через LIKE выбирать: 'category-5-%'.
>> также вывести pagetitle
Читайте про параметр resourceFields у сниппета ecMessages в документации.
А вот TV вы так не выберете. Тут только JOIN если делать.
Добрый день, Алексей!
Спасибо вам за подробный ответ!
Попробовала 2 вариант с параметром where. Ресурсы с комментариями которые необходимо вывести имеют шаблон 69. Поэтому я указала 69 в where.
Еще вопрос. Как использовать JOIN для выборки TV? Можно пример без fenom? Спасибо большое!
Спасибо вам за подробный ответ!
Попробовала 2 вариант с параметром where. Ресурсы с комментариями которые необходимо вывести имеют шаблон 69. Поэтому я указала 69 в where.
<div id="pdopage">
<div class="rows">
[[!pdoPage?
&element=`ecMessages`
&limit=`10`
&includeTVs=`logo,lic`
&processTVs=`1`
&tpl=`tpl.ecMessages.Row.Review`
&threads=`*`
&where=`{ "template:IN" : [ 69 ] }`
&ajaxMode=`button`
]]
</div>
[[!+page.nav]]
</div>
Но что-то ничего не показывает. Если убираю параметр where, то выводятся все комментарии со всего сайта. А необходимо выводить комментарии ресурсов у которых шаблон равен 69. Может я неправильно указала параметр where?Еще вопрос. Как использовать JOIN для выборки TV? Можно пример без fenom? Спасибо большое!
template — это поле ресурса, нужно это указать.
Я сейчас не вспомню точно как, но что-то типа resource.template или modResource.template.
насчет join — поищите примеры здесь на форуме…
ну типа modx.pro/help/13888
Я сейчас не вспомню точно как, но что-то типа resource.template или modResource.template.
насчет join — поищите примеры здесь на форуме…
ну типа modx.pro/help/13888
Попробуйте сделать сниппет getMessagesIds:
И используйте его в качестве &messages в вызове:
Что касается полей ресурса, то в чанке сообщения можно использовать FastField:
$ids = $modx->getChildIds(5,10,array('context' => 'web'));
$mess = array();
$table_mess = $modx->getOption('table_prefix').'ec_messages';
foreach ($ids as $id) {
$sql = "SELECT * FROM {$table_mess} WHERE `thread` = {$id}";
$q = $modx->prepare($sql);
$q->execute();
$messages = $q->fetchAll(PDO::FETCH_ASSOC);
foreach ($messages as $message) {
$mess[] = $message['id'];
}
}
return implode(',', $mess);
И используйте его в качестве &messages в вызове:
[[!pdoPage?
&element=`ecMessages`
&threads=`*`
&messages=`[[!getMessagesIds]]`
......
]]
Что касается полей ресурса, то в чанке сообщения можно использовать FastField:
[[#[[+thread]].pagetitle]]
[[#[[+thread]].logo]]
Здравствуйте, Павел!
Спасибо большое за готовое решение!
Вы можете уточнить 10 в
За что отвечает цифра 10?
5 — если правильно поняла, это родитель (дедушка) в котором есть ресурсы, которые имеют комментарии.
Спасибо большое за готовое решение!
Вы можете уточнить 10 в
$ids = $modx->getChildIds(5,10,array('context' => 'web'));
За что отвечает цифра 10?
5 — если правильно поняла, это родитель (дедушка) в котором есть ресурсы, которые имеют комментарии.
Да, 5 — родитель, 10 — глубина выборки.
Подробности тут
Подробности тут
Кстати, сейчас
Например, если комментарий был написал к ресурсу Демо 1, то при выводе комментарий ресурса Демо 1, [[#[[+thread]].pagetitle]] и [[#[[+thread]].logo]] выводят значения с Демо Х.
[[#[[+thread]].pagetitle]]
[[#[[+thread]].logo]]
В комментариях эти плейсхолдеры выводят значения с других ресурсов, а не значения ресурсов которым написаны комментарии.Например, если комментарий был написал к ресурсу Демо 1, то при выводе комментарий ресурса Демо 1, [[#[[+thread]].pagetitle]] и [[#[[+thread]].logo]] выводят значения с Демо Х.
В &tpl указан чанк или @INLINE...?
Что выводит просто [[+thread]].
Что выводит просто [[+thread]].
В &tpl указан чанк.
В ресурсе Демо 1, плейсхолдер [[+thread]] выводит ID ресурса Демо Х.
Наверно поэтому в комментариях ресурса Демо 1 выводятся значения с Демо Х.
В ресурсе Демо 1, плейсхолдер [[+thread]] выводит ID ресурса Демо Х.
Наверно поэтому в комментариях ресурса Демо 1 выводятся значения с Демо Х.
Еще обнаружила, что запрос выводит только 13 комментариев, хотя для теста я указала 100 в параметре limit. И выводятся комментарии не только с родителя дедушки с ID 5, а со всего сайта.
Да, пардон, там же темы в отдельной таблице и они с сообщениями линкуются по ID.
Вот так должно сработать:
В чанках вот так попробуйте:
Вот так должно сработать:
<?php
$mess = array();
$thrs = array();
$table_mess = $modx->getOption('table_prefix').'ec_messages';
$table_threads = $modx->getOption('table_prefix').'ec_threads';
$sql = "SELECT * FROM {$table_threads}";
$q = $modx->prepare($sql);
$q->execute();
$threads = $q->fetchAll(PDO::FETCH_ASSOC);
foreach($threads as $thread){
$thrs[$thread['resource']] = $thread['id'];
}
$ids = $modx->getChildIds(5,10,array('context' => 'web'));
foreach ($ids as $id){
$tid = $thrs[$id];
$sql = "SELECT * FROM {$table_mess} WHERE `thread` = {$tid}";
$q = $modx->prepare($sql);
$q->execute();
$messages = $q->fetchAll(PDO::FETCH_ASSOC);
foreach ($messages as $message) {
$mess[] = $message['id'];
}
}
return implode(',', $mess);
В чанках вот так попробуйте:
[[#[[+thread_resource]].pagetitle]]
[[#[[+thread_resource]].logo]]
Павел, огромное вам спасибо! Это решение действительно решило мою задачу!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.