- Что такое TV в MODX
- Создаем дополнительное поле изображения
- Общая информация
- Параметры ввода
- Параметры вывода
- Доступно для шаблонов
- Источники файлов
- Где заполнить значение TV
- Как разместить TV ниже содержимого
- Выводим изображение на странице
- Fenom — для сравнения
- Проверка TV на заполнение
- Типы ввода TV
- Возможные значения для списков и переключателей
- Тип ввода и тип вывода — разные настройки
- TV в шаблоне и в чанке списка
- Дополнительный пример: выбираем связанные страницы
- Настраиваем варианты выбора
- Создаем чанк оформления
- Вызываем список
- Вариант вызова на Fenom
- Где хранятся TV
- Если поле не появилось или изображение не выводится
- Следующий урок
В уроке о шаблонах мы создали простую HTML-заготовку и назначили ее ресурсам. Теперь добавим собственное поле для изображения и выведем его на странице.
Такие поля называются TV — Template Variables, переменные шаблона или дополнительные поля. Иногда их также называют «телевизорами».
Практику выполняем стандартным синтаксисом MODX. Варианты Fenom приведены для сравнения, включать его ради этого урока не требуется.
Что такое TV в MODX
TV расширяет стандартный набор данных ресурса. Например, у страницы уже есть pagetitle, description и content, но нет отдельного поля для обложки. Его можно создать самостоятельно.
Для TV задаются имя, подпись, тип ввода и другие параметры. Затем поле связывают с шаблоном, чтобы оно появилось при редактировании соответствующих ресурсов.
Одно TV можно назначить нескольким шаблонам. Значения при этом заполняются отдельно у страниц, а не становятся одним общим значением для всего сайта.
Стандартные поля ресурса — не TV
Заголовок, описание, аннотация и содержимое предусмотрены системой. Их не нужно создавать как дополнительные поля.

Хотя стандартные поля и TV выводятся похожими тегами со звездочкой, это разные сущности. Назначение стандартных полей разобрано в уроке ресурсов и их полей.
Создаем дополнительное поле изображения
Для упражнения используем ресурс «Практикум» с шаблоном «Учебный». Если у вас другие имена, выберите свою учебную страницу и посмотрите назначенный ей шаблон.
- Откройте вкладку «Элементы».
- Найдите раздел дополнительных полей.
- Нажмите кнопку создания TV или выберите соответствующую команду в контекстном меню.

Общая информация
Заполните:
- Имя: img.
- Заголовок или подпись: «Изображение страницы».
- Описание: «Выберите изображение для этой страницы».
- Категорию — при необходимости.

Имя используется в коде, подпись видит редактор при заполнении ресурса. Для новых TV удобно использовать латинские буквы и нижнее подчеркивание: img, page_image, button_text.
Имя должно быть уникальным. Не называйте TV так же, как стандартное поле ресурса. На сохраненных скриншотах имена могут отличаться; для примеров этого урока используем img.
Параметры ввода
Перейдите на вкладку «Параметры ввода» и выберите тип «Изображение».
Набор доступных параметров зависит от типа поля. Если есть настройка «Может быть не заполнено», для первого примера оставьте «Да». Значение «Нет» делает заполнение обязательным и может препятствовать сохранению ресурса без данных.

Значение по умолчанию пока можно оставить пустым. Если нужна общая картинка-заглушка, укажите существующее изображение, доступное через выбранный источник файлов.

Значение по умолчанию используется, когда у ресурса нет собственного значения TV. Это не обязательно отдельная сохраненная копия пути у каждой страницы: изменение общего значения может повлиять на использующие его ресурсы.
Параметры вывода
Для этого упражнения оставьте тип вывода по умолчанию. Мы хотим получить путь к изображению и самостоятельно разместить его в теге img.
Если выбрать вывод «Изображение», TV может возвращать уже готовую HTML-разметку. Тогда вставлять его внутрь src другого img не нужно.
Доступно для шаблонов
Отметьте шаблон «Учебный», назначенный «Практикуму».

Если «Первый материал» использует другой шаблон, например «Учебный — с примечанием», поле не появится у него, пока вы не назначите TV и этому шаблону.
Для учебного поля вкладку «Права доступа» оставляем без изменений.
Источники файлов
Проверьте источник для контекста сайта, обычно web. В установке уже может быть стандартный источник файловой системы — создавать новый только ради упражнения не требуется.
Выберите источник, через который доступно нужное изображение, или оставьте подходящий стандартный. Путь связан с настройками этого источника: не добавляйте к нему вручную assets, img или начальный слеш без проверки.
Отдельный источник с удобным базовым каталогом настроим по инструкции об источниках файлов. Сейчас сохраните TV.
Где заполнить значение TV
- Перейдите на вкладку «Ресурсы» и откройте «Практикум».
- Проверьте, что выбран шаблон «Учебный».
- Откройте вкладку «Дополнительные поля».
- Найдите «Изображение страницы».
- Через кнопку выбора файла укажите учебное изображение и сохраните ресурс.

Если изображения еще нет, загрузите разрешенный графический файл через файловый менеджер.

Не меняйте ограничения загрузки на любые расширения ради этого упражнения.
Сохранение самого TV создает поле и его настройки. Сохранение ресурса записывает выбранное для этой страницы значение.
Как разместить TV ниже содержимого
Можно включить системную настройку «Разместить TV ниже контента» — tvs_below_content. Тогда поля будут находиться ниже content на вкладке документа.

Менять расположение необязательно. На отображение также могут влиять настройки форм и установленные дополнения.
Выводим изображение на странице
В нашем примере MODX установлен в корне домена, а TV возвращает относительный путь без начального слеша, например assets/img/photo.jpg. В учебном шаблоне нет base, поэтому перед вызовом TV добавляем /: изображение будет запрашиваться от корня домена, а не относительно адреса вложенной страницы.
Откройте шаблон «Учебный» и после заголовка h1 добавьте:
<img src="/[[*img]]" alt="[[*pagetitle:htmlent]]" style="max-width: 100%; height: auto;">
Сохраните шаблон и откройте «Практикум» на сайте. Должно появиться выбранное изображение.
Если вместо картинки виден только путь, проверьте наличие HTML-тега img. Сам вызов TV возвращает значение, а не обязательно готовую картинку.
Fenom — для сравнения
<img src="/{$_modx->resource.img}" alt="{$_modx->resource.pagetitle | escape}" style="max-width: 100%; height: auto;">
Это альтернативная запись при настроенной обработке Fenom. Для текущего упражнения используйте стандартный вариант, не вставляйте оба изображения одновременно.
Проверка TV на заполнение
Если изображение необязательное, лучше не выводить тег с пустым src.
Стандартный вариант:
[[*img:notempty=`
<figure>
<img src="/[[*img]]" alt="[[*pagetitle:htmlent]]" style="max-width: 100%; height: auto;">
</figure>
`]]
Вариант Fenom:
{if $_modx->resource.img}
<figure>
<img src="/{$_modx->resource.img}" alt="{$_modx->resource.pagetitle | escape}" style="max-width: 100%; height: auto;">
</figure>
{/if}
Проверяется значение поля. Для проверки заполнения недостаточно только убедиться, что переменная существует.
Типы ввода TV
Тип ввода определяет, как редактор заполняет данные. Для большинства первых задач достаточно текста, изображения, списка или флажка.
Краткий справочник типов
| Тип | Для чего подходит |
|---|---|
| Текст | Короткая строка: подпись, название, дополнительный заголовок. |
| Текстовая область | Несколько строк без визуального редактора. |
| Текстовый редактор | Форматируемый текст при установленном и настроенном редакторе. |
| Изображение | Выбор изображения через источник файлов. |
| Файл | Выбор документа или другого разрешенного файла. |
| Число | Числовое значение с доступными для типа ограничениями. |
| Дата | Дата и, в зависимости от параметров, время. |
| Электронная почта | Адрес электронной почты. |
| URL | Адрес ссылки. Сам тип не заменяет проверку назначения и допустимости URL. |
| Переключатели, radio | Один вариант из предложенных. |
| Флажки, checkbox | Один или несколько отмеченных вариантов. |
| Список с одиночным выбором | Одно значение из списка. |
| Список с множественным выбором | Несколько значений. |
| Список ресурсов | Выбор ресурса с сохранением его ID. |
| Тег | Выбор из заданных меток. |
| Авто-метка | Работа с метками с возможностью добавления новых. |
Набор типов и параметров зависит от версии MODX и дополнений. Для первого знакомства не нужно создавать по TV каждого типа.
Возможные значения для списков и переключателей
Простые варианты разделяются двумя вертикальными чертами:
Белый||Черный||Серый
Чтобы подпись отличалась от сохраняемого значения:
Белый==#ffffff||Черный==#000000
Редактор увидит «Белый» или «Черный», а значением станет соответствующий код цвета. Это только данные: применение цвета в CSS нужно реализовать отдельно.
Для нескольких вариантов по умолчанию у множественного выбора используется разделитель ||.
Тип ввода и тип вывода — разные настройки
Тип ввода «Изображение» дает инструмент выбора файла. Тип вывода определяет, как обработать значение при отображении: оставить путь, сформировать изображение, отформатировать дату или объединить несколько значений.
Поэтому в нашем примере вывод оставлен по умолчанию: тег img написан непосредственно в шаблоне.
В других задачах параметры вывода полезны. Например, выбранные флажки можно вывести строкой через запятую. Не нужно ни всегда менять этот раздел, ни считать его ненужным во всех случаях.
TV в шаблоне и в чанке списка
Тег со звездочкой получает TV текущего ресурса: [[*img]]
Если сниппет выводит список других страниц, он должен получить их TV и передать значения в чанк. Имя плейсхолдера зависит от компонента и его параметров.
Например, у pdoResources с includeTVs=`img` и стандартным префиксом используется: [[+tv.img]]
При обработке такого чанка Fenom значение с точкой доступно через: {$_pls['tv.img']}
Поэтому правило «в чанке просто меняем звездочку на плюс» неполное. Нужно учитывать, какие данные передал конкретный сниппет. Подробный пример ниже требует установленного pdoTools.
Дополнительный пример: выбираем связанные страницы
TV с множественным выбором ресурсов и вывод через pdoResources
Этот пример можно пройти после знакомства с чанками, сниппетами и pdoTools. Он не нужен для проверки первого TV изображения.
Настраиваем варианты выбора
- Создайте TV с именем related_pages.
- Подпись: «Связанные страницы».
- Тип ввода: «Множественный выбор» или «Флажки».
- В возможных значениях укажите запрос ниже одной строкой.
@SELECT pagetitle, id FROM [[+PREFIX]]site_content WHERE parent = 30 AND published = 1 AND deleted = 0 ORDER BY menuindex ASC, id ASC
30 замените ID своего родительского раздела. Запрос получает его непосредственные дочерние опубликованные ресурсы, а не «родительские страницы».
Первый столбец — подпись варианта, второй — сохраняемое значение, в данном случае ID. PREFIX подставляет префикс таблиц установки.
На снимках сохранен прежний пример с другим именем TV. В новом коде используем related_pages. Если уже настроено собственное поле, подставьте его имя последовательно во все вызовы.
В параметрах вывода выберите «Разделитель» и укажите запятую:
Назначьте TV нужному шаблону, сохраните и откройте ресурс. Отметьте несколько страниц и сохраните их выбор.
Проверка обработанного значения:
[[*related_pages]]
При выбранном выводе через запятую получится список ID. Не путайте его с названиями страниц или готовыми ссылками. В исходном множественном значении используется разделитель ||, а renderer формирует нужное представление.
Создаем чанк оформления
Создайте чанк tvRelatedItem:
<article>
<h3><a href="[[~[[+id]]]]">[[+pagetitle:htmlent]]</a></h3>
[[+tv.img:notempty=`<img src="[[+tv.img]]" alt="[[+pagetitle:htmlent]]" style="max-width: 100%; height: auto;">`]]
</article>
Здесь будет название выбранной страницы и ее img, если поле заполнено. Изображения нужно задавать у самих выбранных ресурсов, а не только у страницы, на которой расположен список.
Вызываем список
Пустой resources при parents=0 не должен превращаться в общий список сайта. Поэтому сначала выбираем, выполнять ли pdoResources:
[[[[*related_pages:notempty=`pdoResources`:default=`-`]]?
&parents=`0`
&resources=`[[*related_pages]]`
&limit=`0`
&includeTVs=`img`
&prepareTVs=`img`
&tpl=`tvRelatedItem`
]]
Дополнительные открывающие скобки здесь не опечатка. При заполненном поле внутренний тег дает имя pdoResources. При пустом — формируется комментарий, а список не вызывается.
parents=0 снимает ограничение по родителю, resources задает выбранные ID, limit=0 убирает ограничение количества, includeTVs добавляет img, а prepareTVs подготавливает его значение для вывода.
Вариант вызова на Fenom
{set $selectedPages = $_modx->resource.related_pages | replace : '||' : ','}
{if $selectedPages}
{$_modx->runSnippet('pdoResources', [
'parents' => 0,
'resources' => $selectedPages,
'limit' => 0,
'includeTVs' => 'img',
'prepareTVs' => 'img',
'tpl' => 'tvRelatedItem'
])}
{/if}
Здесь выбранные значения приводятся к строке ID через запятую. Чанк tvRelatedItem из примера остается со стандартными плейсхолдерами; вызов сниппета записан на Fenom.
Запрос @SELECT предназначен для доверенной настройки в менеджере. Не подставляйте в него непроверенные значения GET или POST. Для сложной выборки и форматирования лучше подготовить отдельное решение, а не увеличивать SQL внутри TV.
Другие параметры разобраны в уроке pdoResources.
Где хранятся TV
В базе данных определения дополнительных полей, их связи с шаблонами и значения ресурсов хранятся отдельно:
- modx_site_tmplvars — определения TV.
- modx_site_tmplvar_templates — связь с шаблонами.
- modx_site_tmplvar_contentvalues — значения ресурсов.
modx_ — пример префикса. Для обычного редактирования эти таблицы открывать не требуется.
Не создавайте отдельное TV для каждого экземпляра повторяемой карточки. Если нужен список однотипных записей, стоит рассмотреть подходящую структуру данных, например MIGX. Но само количество TV не является готовым измерением скорости сайта.
Если поле не появилось или изображение не выводится
| Проблема | Что проверить |
|---|---|
| TV нет в редакторе ресурса | Сохранение TV, назначенный ресурсу шаблон и доступность поля именно для него. Также проверьте права и расположение ниже content. |
| Поле видно, но на сайте пусто | Сохраненное значение ресурса и наличие вызова TV в шаблоне. |
| Выводится путь вместо картинки | Наличие тега img либо намеренно выбранного renderer изображения. |
| Картинка не загружается | Фактический src, существование файла, источник и его базовый URL. Не добавляйте слеши наугад. |
| В src попала HTML-разметка | Тип вывода TV. Если тег img уже есть в шаблоне, нужен путь, а не еще один готовый img. |
| В карточках чужие изображения | Использование данных записи, переданных сниппетом, вместо TV текущей страницы со звездочкой. |
Если поле исчезло после смены шаблона, сначала проверьте назначение TV новому шаблону. Не создавайте одноименное поле заново.
Похожее TV можно дублировать через команду копирования. После этого проверьте новое имя, параметры, шаблоны и источник файлов.
Следующий урок
Дальше разберем чанки MODX: вынесем повторяемую разметку в отдельный элемент и научимся передавать ему данные.
Если сейчас нужно настроить удобный каталог выбора изображений, откройте источники файлов. Это подробное продолжение темы путей, а не обязательное условие создания первого TV.














