Zulya

Zulya

С нами с 15 ноября 2016; Место в рейтинге пользователей: #355
Алексей Смирнов
04 февраля 2023, 14:01
1
+1
ну у вас по этому условию:
[[!#GET.str:ne=`0`:then=``:else=`-`]]  // тут не равно 0
Будет срабатывать, если ресурс не равен 0. те всегда.
Если вы хотите чтобы срабатывало, то следует использовать другое сравнение:
[[!#GET.str:gte=`0`:then=``:else=`-`]]  // больше или равно
Таким образом:
[[[[!#GET.str:gte=`0`:then=``:else=`-`]]$showformreview]]
[[[[!#GET.str:gte=`0`:then=`-`:else=``]]pdoResources? &parents=`56` &depth=`0` &tpl=`liststr` &tplWrapper=`wrappchunk`]]
Надеюсь, что этот вариант сработает.
Павел Романов
18 октября 2022, 16:08
1
+1
Да, пардон, там же темы в отдельной таблице и они с сообщениями линкуются по 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]]
Zulya
18 октября 2022, 13:59
1
0
Здравствуйте, Павел!
Спасибо большое за готовое решение!
Вы можете уточнить 10 в
$ids = $modx->getChildIds(5,10,array('context' => 'web'));

За что отвечает цифра 10?
5 — если правильно поняла, это родитель (дедушка) в котором есть ресурсы, которые имеют комментарии.
Павел Романов
18 октября 2022, 12:45
1
+1
Попробуйте сделать сниппет getMessagesIds:
$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]]
Наумов Алексей
18 октября 2022, 10:24
1
+1
template — это поле ресурса, нужно это указать.

Я сейчас не вспомню точно как, но что-то типа resource.template или modResource.template.
насчет join — поищите примеры здесь на форуме…
ну типа modx.pro/help/13888
Наумов Алексей
18 октября 2022, 09:09
1
+1
привет!
Да, здесь 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 если делать.
Zulya
29 августа 2022, 19:47
1
0
У меня recaptcha v2 отображается, но независимо от того, прошла или вообще ничего не заполнено (имеется ввиду галочка в рекапче), комментарий публикуется. Я специально скопировала код и вставила у себя в шаблоне.
[ [!TicketComments? &allowGuest=`1` &autoPublishGuest=`0` &enableCaptcha=`0` &customValidators=`recaptchav2` &validate=`g-recaptcha-response:required` &g-recaptcha-response.vTextRequired=`Вы не прошли проверку на спам` ] ]
Но валидация рекапчи не происходит. Может где-то есть ошибка?
Zulya
28 августа 2022, 12:25
1
0
Оказывается в чанке tpl.Tickets.comment.one.auth есть закомметированные коды:
<!--tickets_stared <i class="glyphicon glyphicon-star stared star"></i>-->
<!--tickets_unstared <i class="glyphicon glyphicon-star unstared star"></i>-->
В этих кодах сделала изменение и иконка «добавить в избранное» у меня появилось.

Надеюсь, данный ответ кому-нибудь еще пригодится.
Zulya
31 июля 2019, 15:58
1
0
Вопрос решился.
Проблема была в этом:

То есть, в Анонимные сессии, значение было пустое.

Вдруг другим пользователям это решение пригодится.
Спасибо всем, кто хотел помочь!
Zulya
28 марта 2019, 11:16
1
0
Здравствуйте, Алексей!
Спасибо, что ответили. Я использую pdoResources:
[[pdoResources:default=`Ничего не найдено`?
    &parents=`38`
    &includeTVs=`logo`
    &processTVs=`1`
    &limit=`10`
    &leftJoin=`{
        "ecThread": {
    		"class": "ecThread",
    		"on": " CONCAT('resource-', modResource.id) = ecThread.name"
    	            }
               }`
    &select=`{
    	"modResource": "*",
    	"ecThread": "ecThreadRating.count AS reviews_count",
    }`
     &sortby=`{"reviews_count":"DESC"}`
    &tpl=`@INLINE [[+pagetitle]]
[[+tv.logo]]`
    
    ]]
На сайте выходит сообщение «Ничего не найдено».
Может я тут где-то ошибку допустила?