Наумов Алексей

Наумов Алексей

Был в сети 28 июля 2026, 14:21
Заказы принимаю
Самое простое:

[[!ecMessages?
&threads=`*`
&tpl=`tpl.ecMessages.Row.all`
&limit=``
&messages=`[[!getMessageIdFromRequest]]`
]]
и создаем сниппет getMessageIdFromRequest:
<?
$messageId = intval($modx->getOption('id', $scriptProperties, 0));

return $messageId;
но тут нет никакой «защиты» от неверно переданного id (несуществующего, например, или удаленного).
У отзыва нет отдельной страницы. реализовать, естественно, это можно, вариантов реализации много.
Простой способ — передавать id отзыва через GET параметр при запросе к специальной странице «Читать отзыв». Ну и там далее получать этот отзыв из базы и выводить.
Добрый день!
Здесь можно попробовать так, к примеру.
1. Вы привязываете отзыв к услуге (через thread).
2. У отзыва есть поле subject, его можно использовать, чтобы хранить имя врача.
3. Добавить новое текстовое поле clinic для клиники.

На странице врача и клиники ставить у ecMessages thread=* (т.е. любая цепочка), а отзывы фильтровать через where по полям subject и clinic/
Добрый день. Основной принцип — комментарий добавляется с фронта, поэтому в админке и нет кнопки загрузки файла. Но в целом наверное полезно, сделать можно… поставлю в список хотелок
Я не знаю точной причины к сожалению ошибки. У самого бывало подобное, но не систематично как-то.
Есть версия, что дело может быть в том, что ваш сервер не может корректно соединится с сервером modstore из-за того, что ему «не нравится» ssl сертификат. Но это только версия.
привет!
Да, здесь 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 если делать.
Добрый день. Да для MODX 2 прикрепление файлов есть.
А вот демонстрации у меня нет. В целом это выглядит как просто input type=file с атрибутом multiple.
В админке — просто вкладка в окне редактирования сообщения со списком файлов и возможностью ими управлять (удалить файл).
Да, я наверное код привел из версии для MODX 3…

В версии для MODX 2 все несоклько по другому…
Там вместе с $this->mediaSource->createContainer почему-то используется еще и $this->mediaSource->fileHandler->make и подозреваю что с облачным хранилищем это не сработает. Я сейчас уже не помню почему так…
Привет!

Да нет, можно любые файлы. В настройках есть список допустимых расширений файлов (ну и у источника файлов тоже есть такая же настройка). Есть проверка на макс. размер файла.

Насчет облаков не могу сказать, я не проверял.

Смотри основные выдержки кода по закгрузке файлов:
// получение и инициализация mediaSource
$this->mediaSource = modMediaSource::getDefaultSource($this->modx, $this->modx->getOption('ec_files_source'));
$this->mediaSource->set('ctx', $context);
$this->mediaSource->initialize();
...
// проверка policy
if (!$this->mediaSource->checkPolicy('create')) {...}
...
// формирование пути и создание каталога
$this->mediaSource->createContainer($internalPath, '');
..
// загрузка файла
$uploadResult = $this->mediaSource->uploadObjectsToContainer(
    $internalPath,
    array(
        array_merge($file, array('name' => $filename))
    )
);
на первый взгляд все выглядит корректно)))
Swift уж тем более не проверял
Помимо поля price нужно добавить еще одно поле, отражающее, например, возможность купить товар can_buy.
И обновлять его по логике can_buy = (price > 0)

Теперь в mFilter можно прописать сортировку сначала по can_buy, а затем уже по цене. Тогда товары с нулевой ценой будут всегда в конце.