Ресурсы вне дерева
Страница, которая ведёт себя как ресурс 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.
- PageBlocks → Конструктор → Таблицы, создайте таблицу.
- В поле Модель выберите
PbResourceвместоPbTableData. Этим строка и получает колонки ресурса — адрес, шаблон, мету. - На вкладке Поля опишите то, что нужно сверх них: площадь города, зарплату вакансии, телефон компании.
- На вкладке Столбцы — что показывать в списке, чтобы редактор находил нужное.
Подробно про сам конструктор таблиц — в Таблицах.
Где редактировать
Там же, где и создали: строки открываются в гриде этой таблицы. Для редактора это обычный список с поиском и фильтрами, а не дерево ресурсов, — и десять тысяч строк в нём ведут себя как десять тысяч строк, а не как десять тысяч страниц.
Как выводить
Два разных случая, и путать их не надо.
Отдельная страница открывается сама. Адрес разрешается так же, как у обычного ресурса: человек заходит на /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 смотрит в три места по порядку:
- перевод — поэтому
/de/uber-unsи есть канонический немецкий адрес; site_content— обычный ресурс MODX;pb_resources.
Оба вида рендерятся одними и теми же шаблонами. Шаблон не знает, из какой таблицы пришла страница, и знать ему не нужно.
При совпадении побеждает настоящий ресурс
Если адрес есть в обеих таблицах, отвечает site_content. Поэтому свою таблицу безопасно наполнять импортом: сгенерированная строка не отберёт страницу, которую сделал редактор.
URI собирается сам
uri пересчитывается при сохранении из алиаса и префикса владельца, так что вы задаёте alias и забываете.
Два переключателя это меняют:
uri_override— оставитьuriровно таким, как записано, и больше не пересчитывать. Для адреса, доставшегося от старого сайта, который менять нельзя.alias_visibleу родителя — когда выключен, алиас родителя не входит в URI ребёнка. Так уровень группировки существует в данных, но не появляется в адресе.
Что когда брать
| Брать | |
|---|---|
| Страница, которую редактор пишет и переставляет | Ресурс MODX |
| Много страниц из данных, каждой нужен свой адрес и мета | pb_resources |
| Страница с логикой и без сохранённой строки вообще | Виртуальную страницу |
Все три уживаются вместе. Раздел каталога может быть ресурсом, его тысячи позиций — своими ресурсами, а фильтр — виртуальной страницей: на одном сайте и в одних шаблонах.