Сниппет 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
4 минуты назад
modx.pro
7
0

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

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

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

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

Кнопки как в ModStore

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

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

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

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

mFilter для MODX 3 - новое поколение.



Те, кто работал с mFilter2, знают его ограничения: фильтры намертво привязаны к вызову сниппета, для разных категорий — костыли с обёртками, SEO только через сторонний SeoFilter, а настройка — копипаст параметров в шаблоне.

mFilter для MODX3 — это не порт старого кода, а переосмысление с нуля. Наборы фильтров через админку, встроенные ЧПУ и SEO-шаблоны, визуальный интерфейс вместо портянок в сниппете.
Николай Савин
24 января 2026, 23:27
modx.pro
1
300
+17

Сбор новостей с разных сайтах на один общий

Коллеги, подскажите плз, какие есть решения для такой задачи:
Существуют несколько сайтов на MODX, пусть это будут А, В, С
Нужно что бы новости (ресурсы определенного родителя с сайтов В и С) как-то автоматически попадали на сайт А, и все добавленные фото копировались тоже.
Везде используется migxResourceMediaPath
Серый
23 января 2026, 14:17
modx.pro
913
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

simpleFilters - простая фильтрация для MODX3

Всем привет!

Пока мы ждём нового mFilter для MODX3 (который обещает быть ого-го), предлагаю вниманию уважаемого сообщества более простое решение здесь и сейчас ).

Основные свойства


  • Поддержка полей ресурсов, а также полей и опций товаров MiniShop3.
  • Четыре типа фильтров: чекбокс, радиокнопка, выпадающий список, слайдер для числовых значений (на основе noUiSlider).
  • Пагинация.
  • Настраиваемая сортировка и выбор количества на страницу.
  • Системные события для тонкой настройки (тексты фильтров, заголовки блоков, значения, сортировка полей и т. д.).
  • Для работы не требуется jQuery.
Демо на 1 000 товаров здесь.

Павел Романов
21 января 2026, 10:17
modx.pro
1
347
+7

Инструкция: Настройка SOCKS5 прокси в MODX3 для работы с репозиторием

Проблема: замедления Cloudflare (rest.modx.com) на серверах в РФ, не возможность нормально скачивать и обновлять компоненты.

Решение: Модификация системных классов для принудительного использования SOCKS5 прокси.

ДЛЯ MODX 3.1.2 !!!

Ivan K.
19 января 2026, 21:05
modx.pro
1
1 331
+2