Skip to content

Ресурсы вне дерева

Страница, которая ведёт себя как ресурс MODX — свой адрес, шаблон, флаги меню, публикация, блоки, — но живёт в pb_resources, а не в site_content, и поэтому в дереве ресурсов не появляется никогда.

Почему не сделать обычный ресурс

Дерево MODX — инструмент менеджера. Оно годится для страниц, по которым человек ходит: разделы, статьи, лендинги. И перестаёт годиться, когда страницы — это данные.

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

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

Что умеет

Колонки повторяют знакомые:

Содержимоеpagetitle, longtitle, description, introtext, content, menutitle
Адресalias, uri, uri_override, alias_visible
Поведениеtemplate, menuindex, hidemenu, isfolder, searchable, context_key
Жизненный циклpublished_at, deleted_at, временные метки

Плюс пара конструктора — model_type и model_id для владельца, constructor_id, field_id и data. А значит, свой ресурс — это AbstractDataModel: поля конструктора на нём работают ровно так же, как на блоке.

У него есть и blocks(), поэтому такая страница собирается в конструкторе, как любая другая.

Как завести

Свой ресурс — это строка таблицы, у которой выбрана модель PbResource.

  1. PageBlocks → Конструктор → Таблицы, создайте таблицу.
  2. В поле Модель выберите PbResource вместо PbTableData. Этим строка и получает колонки ресурса — адрес, шаблон, мету.
  3. На вкладке Поля опишите то, что нужно сверх них: площадь города, зарплату вакансии, телефон компании.
  4. На вкладке Столбцы — что показывать в списке, чтобы редактор находил нужное.

Подробно про сам конструктор таблиц — в Таблицах.

Где редактировать

Там же, где и создали: строки открываются в гриде этой таблицы. Для редактора это обычный список с поиском и фильтрами, а не дерево ресурсов, — и десять тысяч строк в нём ведут себя как десять тысяч строк, а не как десять тысяч страниц.

Как выводить

Два разных случая, и путать их не надо.

Отдельная страница открывается сама. Адрес разрешается так же, как у обычного ресурса: человек заходит на /goroda/kazan, ResourceResolver находит строку и рендерит её шаблоном из колонки template. Ничего вызывать не нужно — в шаблоне доступны те же поля, что у ресурса, плюс поля конструктора.

Список собирается сниппетом. Здесь нужен pbList с указанием модели:

[[!pbList? &model=`PbResource` &parent=`[[*id]]` &tpl=`chunk:cityItem` &limit=`20`]]

Не путайте с pbResources

pbResources выводит ресурсы MODX из site_content. Свои ресурсы он не увидит: это другая таблица. Для них — pbList с model='PbResource'.

Пример: справочник городов

Каталог из тысячи городов. Каждому нужен свой адрес /goroda/kazan, заголовок, описание для поисковика и пара своих полей — регион и население.

Ресурсами MODX это тысяча строк в дереве, которое после этого невозможно открыть. Своими ресурсами — одна таблица в конструкторе: список с поиском для редактора, обычные адреса для посетителя, и дерево остаётся тем, чем было, — два десятка страниц, которые правят руками.

Раздел каталога при этом остаётся настоящим ресурсом: он один, его правят, ему место в дереве.

Как разрешается адрес

ResourceResolver смотрит в три места по порядку:

  1. перевод — поэтому /de/uber-uns и есть канонический немецкий адрес;
  2. site_content — обычный ресурс MODX;
  3. pb_resources.

Оба вида рендерятся одними и теми же шаблонами. Шаблон не знает, из какой таблицы пришла страница, и знать ему не нужно.

При совпадении побеждает настоящий ресурс

Если адрес есть в обеих таблицах, отвечает site_content. Поэтому свою таблицу безопасно наполнять импортом: сгенерированная строка не отберёт страницу, которую сделал редактор.

URI собирается сам

uri пересчитывается при сохранении из алиаса и префикса владельца, так что вы задаёте alias и забываете.

Два переключателя это меняют:

  • uri_override — оставить uri ровно таким, как записано, и больше не пересчитывать. Для адреса, доставшегося от старого сайта, который менять нельзя.
  • alias_visible у родителя — когда выключен, алиас родителя не входит в URI ребёнка. Так уровень группировки существует в данных, но не появляется в адресе.

Что когда брать

Брать
Страница, которую редактор пишет и переставляетРесурс MODX
Много страниц из данных, каждой нужен свой адрес и метаpb_resources
Страница с логикой и без сохранённой строки вообщеВиртуальную страницу

Все три уживаются вместе. Раздел каталога может быть ресурсом, его тысячи позиций — своими ресурсами, а фильтр — виртуальной страницей: на одном сайте и в одних шаблонах.

© PageBlocks 2019-present