Статья, в которой рассмотрим назначение TV параметров и основные принципы работы с ними в MODX Revolution.

Что такое переменные шаблона (TV)?

По умолчанию любой ресурс в MODX Revolution имеет определённый набор полей: pagetitle (заголовок), content (содержимое), description (описание) и т.д.

Поля, которые имеет любой ресурс (документ) в MODX Revolution по умолчанию
Поля, которые имеет любой ресурс (документ) в MODX Revolution по умолчанию

Но кроме встроенных полей с каждым ресурсом можно ещё связать (добавить к нему) любое количество других полей. Осуществляются эти действия в MODX Revolution посредством TV переменных. Связывание TV параметров с ресурсами выполняется не напрямую, а через шаблоны. Т.е. для того чтобы дополнительное поле появилось у ресурса, соответствующий TV параметр должен быть связан с его шаблоном. Из-за этого данные переменные и называются TV, т.е. переменными шаблона (Template Variable).

Создание TV (дополнительных полей)

Рассмотрим, как в MODX Revolution с помощью TV-переменных можно расширить назначение стандартных ресурсов (документов). Например, разберём какие TV поля необходимо добавить к ресурсам, чтобы их можно было использовать, для представления книг на сайте.

В MODX создание TV параметров осуществляется очень просто, посредством выполнения следующих шагов:

  1. Войти в админку (менеджер) MODX Revolution.
  2. Перейти в левой панели во вкладку "Элементы" и нажать на кнопку "Новое дополнительное поле".
    Создание tv поля
    Поля, которые имеют любой ресурс (документ) MODX по умолчанию
  3. В открывшейся странице ввести имя дополнительному полю, например, authors. Данное поле будем использовать для хранения авторов книги.
    Создание TV-поля в MODX Revo (задание имени)
    Создание TV-поля в MODX Revo (задание имени)
  4. Перейти на вкладку "Параметры ввода" и указать необходимый формат данных, который будет определять тип значения, которое может быть помещено в этот TV параметр. Для TV переменной authors установим тип значения ввода, равный "текст".
  5. В секции "Параметры вывода" следует задать формат, в котором необходимо выводить данные из этого поля. Например, TV параметр authors будем выводить в формате текста. Для этого ему установим соответствующее значение в качестве значения параметра "Тип вывода".
  6. В разделе "Доступно для шаблонов" необходимо выбрать те шаблоны, через которые TV поле появится у соответствующих ресурсов.
    Процесс привязывания TV поля к ресурсам (через соответствующие шаблоны)
    Процесс привязывания TV поля к ресурсам (через соответствующие шаблоны)

Для примера создадим ещё несколько TV параметров: release-year (год выпуска), quantity-of-pages (количество страниц), cover-photo-book (фото обложки книги). Привяжем TV поля к тому же шаблону (например, шаблон книги).

Заполнение TV полей при создании или редактировании ресурсов

После создания TV полей они становятся доступными во время создания или редактирования соответствующих ресурсов. Располагаются TV-поля на страницах ресурсах по умолчанию во вкладке "Дополнительные поля".

Дополнительные поля, которые появились у ресурсов с установленным шаблоном "Книга"
Дополнительные поля, которые появились у ресурсов с установленным шаблоном книга

Более удобного расположить TV поля на страницах определённых ресурсов можно с помощью инструмента MODX Revo "Настройка форм" (значок "Шестерёнка" в главном меню админки -> пункт "Настройка форм").

Некоторый результат, который можно достигнуть путём применения определённого набора правил к соответствующим ресурсам (через шаблон) с помощью элемента MODX "Настройка форм".

Расположение TV переменных у ресурса, представление которого было настроено с помощью инструмента "Настройка форм"
Расположение TV переменных у ресурса, представление которого было настроено с помощью инструмента, который называется настройка форм

Вывод TV (дополнительных полей)

В MODX вывод значения TV переменной, связанной с текущим ресурсом, осуществляется также как и любого другого поля этого ресурса.

Например, получим значение TV поля authors у текущего ресурса (в шаблоне):

[[*authors]]

Рассмотрим ещё один пример. В котором разберём, как можно с помощью сниппета pdoResources, организовать вывод всех дочерних ресурсов (по отношению к текущему ресурсу) вместе с их TV полями:

[[!pdoResources?
  &parents=`[[*id]]`
  &includeTVs=`authors,cover-photo-book,quantity-of-pages,release-year`
  &tpl=`@INLINE
    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
    <ul>
      <li>Автор(ы): [[+tv.authors]]</li>
      <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
      <li>Год выпуска: [[+tv.release-year]]</li>
    </ul>
    <img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
  `
]]

То же самое действие, но уже с использованием сниппета getResources:

// вызов сниппета getResources
[[!getResources?
  &parents=`[[*id]]`
	&includeTVs=`1`
	&tpl=`book`
]]

// содержимое чанка book:
<h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
<ul>
  <li>Автор(ы): [[+tv.authors]]</li>
  <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
  <li>Год выпуска: [[+tv.release-year]]</li>
</ul>
<img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
Вывод всех дочерних ресурсов (по отношению к текущему) вместе со значениями их TV-полей
Вывод всех дочерних ресурсов (по отношению к текущему) вместе со значениями их TV-полей

MODX - Использование в условии where TV переменных

Например, следующий код показывает, как можно выбрать книги (ресурсы), в зависимости от некоторого условия (поле автор должно содержать значение "Резиг"). Условия в сниппете pdoResources задаются с помощью параметра where.

[[!pdoResources?
  &parents=`[[*id]]`
  &includeTVs=`authors,cover-photo-book,quantity-of-pages,release-year`
  &tpl=`@INLINE
    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
    <ul>
      <li>Автор(ы): [[+tv.authors]]</li>
      <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
      <li>Год выпуска: [[+tv.release-year]]</li>
    </ul>
    <img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
  `
  &where=`{"authors:LIKE":"%Резиг%"}`
]]

Сортировка ресурсов по TV полю

Для сортировки ресурсов в MODX Revo в зависимости от того какое значение имеет TV поле можно выполнить с помощью параметра сниппета pdoResources sortby.

Например, выведем книги по году выпуска (по убыванию):

[[!pdoResources?
  &parents=`[[*id]]`
  &includeTVs=`authors,cover-photo-book,quantity-of-pages,release-year`
  &tpl=`@INLINE
    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
    <ul>
      <li>Автор(ы): [[+tv.authors]]</li>
      <li>Количество страниц: [[+tv.quantity-of-pages]]</li>
      <li>Год выпуска: [[+tv.release-year]]</li>
    </ul>
    <img src="/[[+tv.cover-photo-book]]" alt="Фото обложки книги [[+pagetitle]]">
  `
  &sortby=`release-year`
  &sortdir=`DESC`
]]