MODX - TV параметры

Статья, в которой рассмотрим назначение 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`
]]


   MODX Revo 0    1286 0

Комментарии (6)

  1. Сергей 06 декабря 2016, 13:58 # 0
    Если в разных контекстах языковые версии ресурсов связаны через Babel и tv-переменные заполнены только у главного контекста то как сделать выборку языковых версий ресурсов из других контекстов, а tv-переменные взять из основного контекста? Выборка с помощью pdoResources естественно.
    1. Александр Мальцев 07 декабря 2016, 15:02 # 0
      Здесь придётся писать сниппет, т.к. с помощью pdoResources такую выборку не получится сделать. Вам придётся сначала получить для каждого ресурса в одном контексте, связанный с ним ресурс в другом контексте через TV параметр babelLanguageLinks. Данная TV переменная хранит данные в виде (например: web:64;en:65). Т.е. она показывает связь между ресурсами в разных контекстах. Далее вам необходимо будет эту строку разобрать и получить id ресурсов из другого контекста. И после этого переходить к получению необходимых TV полей.

      Чтобы этого не делать, можно настроить синхронизацию необходимых TV переменных с помощью Babel. Для этого заходите на страницу «Системные настройки» -> Babel -> параметр babel.syncTvs. Нажимаете на кнопку «Редактировать» и в открывшемся диалоговом окне в качестве значения устанавливаете необходимые id TV для синхронизации. После этого значения указанных TV будут автоматически синхронизироваться у связанных ресурсов в разных контекстах.
      1. Сергей 07 декабря 2016, 17:07 # 0
        Спасибо, я поэкспериментирую с настройками.
        Может Вам приходилось работать с дополнением ms2Gallery, когда фото прикреплены к ресурсу? В случае с tv-переменными можно поступить так как вы написали выше, а вот как поступить если фотки были загружены при использовании дополнения ms2Gallery? Ну мне показалось, что использовать это дополнение для прикрепления фоток к ресурсам проще чем создавать tv-переменные. Хотя сайты у меня есть с использованием разных решений на счет фото.
        1. Александр Мальцев 08 декабря 2016, 14:03 # 0
          Тут всё зависит от задачи. Если дополнение ms2Gallery позволит его решить, то почему бы его не использовать. Тем более что работать с ним просто, т.к. изображения привязываются к id ресурса. Для выборки изображений можно использовать условие msResourceFile.resource_id=modResource.id. Подробная документация, а также инструкции по выводу изображений с помощью pdoResources приведены на странице этого компонента в modstore.pro.
    2. Сергей 15 декабря 2016, 11:52 # 0
      Добрый день, у меня интернет магазин компьютеров и комплектующих на modx revo + minishop2 + tickets. У каждого продукта большое количество параметров. С помощью mfilter2 сделал фильтрацию параметров. По вашей статье сделал tv для шаблона жесткие диски, параметр «Назначение» -appointment.
      Пытаюсь вывести с помощью
      [[!mFilter2?
      &parents=`[[*id]]`
      &limit=`10`
      &element=`msProducts`
      &filters=`
      ms|price:number,
      ms|vendor:vendors,
      tv|appointment
      `
      &_filterOptions=`{«autoLoad»:0}`
      &class=`msProduct`
      &sort=`ms|price:asc`
      &tplOuter=`tpl.mFilter2.outer.2`
      &tpls=`tpl.msProducts.row,tpl.msProducts.row2`
      &tplFilter.outer.ms|price=`tpl.mFilter2.filter.slider`
      &tplFilter.row.ms|price=`tpl.mFilter2.filter.number`
      &tplFilter.outer.ms|vendor=`tpl.mFilter2.filter.select`
      &tplFilter.row.ms|vendor=`tpl.mFilter2.filter.option`
      &showLog=`1`
      ]]
      Не выходит ничего, может я вообще что то не так делаю, раньше делал поля с помощью msfieldsmanager но получалось что в одном свойстве товара было до 100 параметров. Как лучше выполнить дополнительные поля товаров, чтоб у каждого товара они были уникальными, и могли настраиваться фильтром?
      1. Александр Мальцев 16 декабря 2016, 11:10 # 0
        Попробуйте добавить в вызов сниппета параметр includeTVs:
        &includeTVs=`appointment`
        

      Вы должны авторизоваться, чтобы оставлять комментарии.