[CDEKIntegrate] Возвращается!

Все привет! Знаю вы давно ждали и наконец это случилось. Компонент для отправки заказов в СДЭК вернулся в modstore.pro пользуйтесь
Артур Шевченко
19 января 2026, 14:05
modx.pro
191
+7

[miniShop2] Дополнительная логика отправки писем при оформлении заказа

Добрый день!
Клиент просит сделать следующую логику отправки писем админу сайта при оформлении заказа:
1. Если при оформлении заказа была указана оплата при получении — отправлять письма как обычно.
2. Если при оформлении заказа была указана онлайн-оплата (положим id=2), то при создании заказа и присвоении статуса «Новый» — не отправлять ничего, а после оплаты и смены статуса заказа на «Оплачен» — отправлять письмо, которое должно было отправляться при создании заказа.
Как лучше такую доработку реализовать?
Giant Dad
15 января 2026, 17:27
modx.pro
141
0

Как задать ручную сортировку в mFilter2

Всем привет!

Я косякнул когда проставлял цифры значениям доп. поля для товаров:
В наличии==1||Под заказ 2-5 дней==0||Под заказ 10-14 дней==3||Нет в наличии==2
(сначала было 1 и 2, потом добавил 0 и 3)

В mFilter2 настроена сортировка:
&sortbyTV=`availability`
            &sortdirTV=`asc`
Она работает, но надо бы, чтобы порядок был: в наличии, заказ 2-5, заказ 10-14 и уже в конце «Нет в наличии».

Не подскажет кто как сделать?
steve.kon
15 января 2026, 19:35
modx.pro
123
0

Full stack + MODX - ищем парт-тайм разработчка (удаленно)

Ищем Full stack-разработчика для поддержки и развития нескольких веб-проектов на MODX. Работа полностью удаленная, part-time формат с загрузкой 30-60 часов в месяц.

Что предстоит делать
— Поддерживать и развивать интернет-магазин на minishop2
— Работать над нашим собственным сайтом
— Внедрять улучшения и новые функции
— Рефакторить за коллегами
— Участвовать в новых проектах
Юра
26 января 2026, 16:46
modx.pro
2
122
0

Кнопки как в ModStore

День добрый.
Что-то я упускаю, никак не могу понять… как реализовать такие кнопки как в modstore.ru в каталоге — «Все», «Платные», «Бесплатные».
У меня на сайте работает mSearch2 и mFilter2.
Мне нужна такая же дополнительная фильтрация, по другому свойству товара — стране производителя. Но суть, думаю, та же.
Как реализовать такой функционал?
Михаил
27 января 2026, 00:07
modx.pro
121
0

Не работает пагинация pdoPage

Мария
Вчера в 10:04
modx.pro
62
0

mFilter2 в некоторых опциях не подменяется aliases

Здравствуйте.

не могу понять в чем проблема. Некоторые опции отлично подменяют aliases, а некоторые не в какую и выводят всегда msoption|…

смотреть пример тут — greifus.ru/catalog/bortovyie-avtomobili-s-kmu

по шасси и манипулятору aliases подменяется, а по другим опциям — нет.

причем в выоде все указано:

&filters=`
            msoption|filtrshassi2
            ,msoption|wheelFormula
            ,msoption|kmu
            ,msoption|agpVisota
            ,msoption|agpKorzina
            ,msoption|filtrSclad

        `
        &aliases=`
            resource|parent==category,
            msoption|agpVisota==visota,
            msoption|agpKorzina==korzina,
            msoption|wheelFormula==wheel,
            msoption|filtrshassi2==shassi,
            msoption|filtrSclad==nalichie,
            msoption|kmu==kmu
        `
в чем может быть проблема?
Максим
21 января 2026, 14:44
modx.pro
55
0

Сниппет getPageBlockContent для вывода блоков PageBlocks (Free версия) с других страниц в MODX

В бесплатной версии PageBlocks нет встроенного инструмента для вывода блоков с другой страницы. Этот сниппет решает задачу через xPDO-запрос к таблице pbBlockValue. Он позволяет выводить указанные блоки с любого ресурса, с опциями сортировки, лимита и обёртки.

Установка

Если работаете с файловыми элементами (PdoTools), создайте файловый сниппет getPageBlockContent.php в директории (../elements/snippets/). Либо создайте обычный сниппет getPageBlockContent в админке MODX со следующим кодом:
<?php
/**
 * getPageBlockContent v1.1
 * Вывод блоков PageBlocks с любой страницы (Free версия)
 * 
 * Параметры:
 * @param int    $resourceId   ID страницы-источника (обязательный)
 * @param string $blockIds     ID блоков через запятую (обязательный)
 * @param string $tpl          Чанк для рендера (опционально, по умолчанию из блока)
 * @param int    $limit        Лимит блоков (0 = все)
 * @param string $sortby       Сортировка (menuindex, id)
 * @param string $sortdir      Направление (ASC, DESC)
 * @param string $wrapper      Обёртка для всех блоков (@INLINE <div>{$output}</div>)
 * @param string $toPlaceholder Сохранить в placeholder вместо вывода
 * 
 * Примеры:
 * [[!getPageBlockContent? &resourceId=`10` &blockIds=`4,7,21`]]
 * {'!getPageBlockContent' | snippet : ['resourceId' => 10, 'blockIds' => '4,7']}
 */

// 1. Загрузка pdoTools для рендеринга чанков
if ($modx->services instanceof MODX\Revolution\Services\Container) {
    $pdotools = $modx->services->get('pdotools');
} else {
    $pdotools = $modx->getService('pdotools', 'pdoTools', 
        MODX_CORE_PATH . 'components/pdotools/model/', $scriptProperties);
}

if (!$pdotools) {
    $pdotools = $modx;
}

// 2. Загрузка модели PageBlocks
$corePath = $modx->getOption('pageblocks_core_path', null, 
    $modx->getOption('core_path') . 'components/pageblocks/');
$modx->addPackage('pageblocks', $corePath . 'model/');

// 3. Получение параметров
$resourceId = (int)$modx->getOption('resourceId', $scriptProperties, 0);
$blockIds = $modx->getOption('blockIds', $scriptProperties, '');
$tpl = $modx->getOption('tpl', $scriptProperties, '');
$limit = (int)$modx->getOption('limit', $scriptProperties, 0);
$sortby = $modx->getOption('sortby', $scriptProperties, 'menuindex');
$sortdir = strtoupper($modx->getOption('sortdir', $scriptProperties, 'ASC'));
$wrapper = $modx->getOption('wrapper', $scriptProperties, '');
$toPlaceholder = $modx->getOption('toPlaceholder', $scriptProperties, '');

// Проверка обязательных параметров
if (empty($resourceId) || empty($blockIds)) {
    return '';
}

// 4. Парсинг ID блоков
$ids = array_map('trim', explode(',', $blockIds));
$ids = array_filter($ids, 'is_numeric');

if (empty($ids)) {
    return '';
}

// 5. Формирование xPDO запроса
$c = $modx->newQuery('pbBlockValue');
$c->where([
    'model_id' => $resourceId,
    'id:IN' => $ids,
    'published' => 1,
    'deleted' => 0
]);

$c->sortby($sortby, $sortdir);

if ($limit > 0) {
    $c->limit($limit);
}

// 6. Получение блоков
$items = $modx->getIterator('pbBlockValue', $c);

$list = [];
$idx = 0;

foreach ($items as $item) {
    // Декодируем JSON значения и объединяем с полями объекта
    $values = array_merge(
        json_decode($item->get('values'), true) ?: [], 
        $item->toArray()
    );
    
    $values['resource_id'] = $item->get('model_id');
    $values['id'] = $item->get('id');
    $values['idx'] = $idx;
    $values['pls'] = $values;
    
    // Выбор чанка для рендеринга
    $chunkName = $tpl ?: $item->get('chunk');
    
    // Рендеринг блока
    $list[] = $pdotools->getChunk($chunkName, $values);
    $idx++;
}

// 7. Формирование вывода
$output = implode("\n", $list);

// Обёртка
if (!empty($wrapper)) {
    $output = str_replace('{$output}', $output, $wrapper);
}

// Вывод или placeholder
if (!empty($toPlaceholder)) {
    $modx->setPlaceholder($toPlaceholder, $output);
    return '';
}

return $output;
Параметры сниппета


Примеры использования
Для тех кто использует файлы:
Прямой вызов @FILE:
{'@FILE snippets/getPageBlockContent.php' | snippet : [
    'resourceId' => 10,
    'blockIds' => '4,7,11'
]}
Через runSnippet:
{$_modx->runSnippet('@FILE snippets/getPageBlockContent.php', [
    'resourceId' => 10,
    'blockIds' => '4,7,11'
])}
Для тех кто использует обычный сниппет:
Базовый вывод (Fenom):
{'!getPageBlockContent' | snippet : [
    'resourceId' => 10,
    'blockIds' => '4,7,21'
]}
С лимитом и сортировкой:
{'!getPageBlockContent' | snippet : [
    'resourceId' => 20,
    'blockIds' => '10,11,12,13,14',
    'limit' => 3,
    'sortdir' => 'DESC'
]}
С кастомным чанком:
[[!getPageBlockContent? 
    &resourceId=`15` 
    &blockIds=`1,2,3,4,5`
    &tpl=`reviews_card`
]]
С обёрткой:
[[!getPageBlockContent?
    &resourceId=`25`
    &blockIds=`5,6,7`
    &wrapper=`@INLINE <div class="carousel-inner">{$output}</div>`
]]
В placeholder:
{'!getPageBlockContent' | snippet : [
    'resourceId' => 30,
    'blockIds' => '8,9',
    'toPlaceholder' => 'testimonials_html'
]}

<section class="testimonials">
    {$testimonials_html}
</section>
Этот сниппет совместим с MODX 3 и PageBlocks Free. Для более сложных задач рассмотрите PRO-версию PageBlocks.

Важно! Работает только с опубликованными блоками.

Нашли баги, welcome на github.

На базе этого сниппета так же можно создать «Универсальный блок» в админке PageBlocks, чтобы контент-менеджеры могли сами выбирать ресурсы и блоки без кода, как это сделать я описал здесь.
FastDevLab
2 часа назад
modx.pro
54
+1

Нужен специалист по гугл консоли , настройка seo

Нужен специалист по гугл консоли, настройка seo
Сайт на modx revo нужен seo мастер и, или программист разбирающийся в сео
@moversTir
alex
Вчера в 13:34
modx.pro
22
0