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

Вывод блоков PageBlocks Free с других страниц в MODX 3 Курс

Одна из частых задач при работе с PageBlocks — вывести блоки с другой страницы. Например, создать универсальный блок отзывов на главной, который менеджер редактирует на отдельной служебной странице /manager/reviews/, или собрать карусель партнёров из блоков другого ресурса.

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

Зачем выводить блоки с других страниц?

Реальные кейсы:

  1. Централизованное управление — менеджер редактирует «Отзывы» на странице /manager/reviews/, а вывод идёт на главную и /services/
  2. Повторное использование — форма «Получить консультацию» создана один раз, но вставляется на 5 лендингов
  3. Синхронизация — изменения в одном месте автоматически отражаются везде (альтернатива синхронизированным блокам из PRO версии)
  4. Мультиязычность — блоки EN страницы отображаются на /en/ контексте

Статистика: 40% проектов на PageBlocks используют переиспользуемые блоки.

Как работает PageBlocks Free (техническая часть)

Структура хранения данных

PageBlocks сохраняет контент в таблице modx_pb_block_value (префикс зависит от установки):

Поле Описание Пример
id ID блока 42
model_id ID страницы (ресурса) 10
chunk Чанк для рендера pb.hero_section
values JSON с данными полей {"title":"Привет","text":"..."}
published Опубликован? 1
deleted Удалён? 0
menuindex Порядок отображения 0

Проблема стандартного вывода

Обычно блоки выводятся только с текущей страницы:

{* Работает только для своей страницы *}
{$_modx->runSnippet('!pdoResources', [
    'class' => 'pbBlockValue',
    'where' => ['model_id' => $_modx->resource.id]
])}

Проблема: нельзя вывести блоки с другого ресурса, потому что model_id жёстко привязан к текущей странице.

Решение: сниппет getPageBlockContent

Используйте готовый сниппет getPageBlockContent для вывода блоков с любого ресурса. Подробности установки, параметры и примеры — в описании сниппета. Альтернативная ссылка на github.

Создание блока PageBlocks для вывода контента

Второй способ — создать универсальный блок типа «Контент с другой страницы» прямо в админке PageBlocks.

Шаг 1: Создание блока

Элементы → PageBlocks → Создать блок

Название: Контент с другой страницы
Чанк: pb.remote_content

Поля блока:

Название Тип Ключ Описание
ID страницы-источника Number source_resource_id Обязательное
ID блоков (через запятую) Text block_ids Обязательное
Чанк для рендера (опционально) Text custom_tpl

Шаг 2: Чанк блока

Файл: assets/elements/chunks/pageblocks/pb.remote_content.tpl

{* Блок PageBlocks: вывод контента с другой страницы *}

{if $source_resource_id && $block_ids}
    {set $blocks_html = '!getPageBlockContent' | snippet : [
        'resourceId' => $source_resource_id,
        'blockIds' => $block_ids,
        'tpl' => $custom_tpl ?: ''
    ]}
    
    {if $blocks_html}
        <div class="remote-content-wrapper" data-source="{$source_resource_id}">
            {$blocks_html}
        </div>
    {else}
        <!-- Блоки не найдены: resourceId={$source_resource_id}, blockIds={$block_ids} -->
    {/if}
{else}
    <!-- Ошибка: не указаны source_resource_id или block_ids -->
{/if}

Шаг 3: Использование

В админке PageBlocks:

  1. Добавить блок «Контент с другой страницы»
  2. Заполнить:
    • ID страницы: 10
    • ID блоков: 4,7,21
  3. Сохранить

Результат: на странице автоматически выведутся блоки 4, 7, 21 со страницы 10.

Как узнать ID страницы и блоков?

ID страниц у нас показаны в дереве ресурсов в фигурных скобках, в адресной строке браузера и хлебных крошках. А чтобы узнать ID блоков, просто зайдите на нужную вам страницу во вкладку PageBloks.

ID страницы и блоков

Сравнение с PRO версией

Функция Free (наш сниппет) PRO версия
Вывод блоков с других страниц ✅ Вручную ✅ Встроенный сниппет
Синхронизация блоков
UI выбора блоков ❌ Только ID ✅ Графический
Коллекции
Цена Бесплатно $49

Вывод: для простых задач Free + наш сниппет достаточно.

Заключение

Сниппет getPageBlockContent решает главную проблему бесплатной версии PageBlocks — позволяет переиспользовать блоки между страницами. Теперь вы можете:

  • Создать централизованное хранилище контента;
  • Редактировать в одном месте — обновляется везде;
  • Строить сложные конструкции (карусели, табы);
  • Экономить время менеджеров.

Следующий урок: Интеграция форм с MODX: FetchIt + FormIt (на Fenom).

Оцените статью
MODX 3
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.