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

Но кроме встроенных полей с каждым ресурсом можно ещё связать (добавить к нему) любое количество других полей. Осуществляются эти действия в MODX Revolution посредством TV переменных. Связывание TV параметров с ресурсами выполняется не напрямую, а через шаблоны. Т.е. для того чтобы дополнительное поле появилось у ресурса, соответствующий TV параметр должен быть связан с его шаблоном. Из-за этого данные переменные и называются TV, т.е. переменными шаблона (Template Variable).
Создание TV (дополнительных полей)
Рассмотрим, как в MODX Revolution с помощью TV-переменных можно расширить назначение стандартных ресурсов (документов). Например, разберём какие TV поля необходимо добавить к ресурсам, чтобы их можно было использовать, для представления книг на сайте.
В MODX создание TV параметров осуществляется очень просто, посредством выполнения следующих шагов:
- Войти в админку (менеджер) MODX Revolution.
- Перейти в левой панели во вкладку "Элементы" и нажать на кнопку "Новое дополнительное поле".
- В открывшейся странице ввести имя дополнительному полю, например,
authors
. Данное поле будем использовать для хранения авторов книги. - Перейти на вкладку "Параметры ввода" и указать необходимый формат данных, который будет определять тип значения, которое может быть помещено в этот TV параметр. Для TV переменной authors установим тип значения ввода, равный "текст".
- В секции "Параметры вывода" следует задать формат, в котором необходимо выводить данные из этого поля. Например, TV параметр
authors
будем выводить в формате текста. Для этого ему установим соответствующее значение в качестве значения параметра "Тип вывода". - В разделе "Доступно для шаблонов" необходимо выбрать те шаблоны, через которые TV поле появится у соответствующих ресурсов.
Для примера создадим ещё несколько TV параметров: release-year
(год выпуска), quantity-of-pages
(количество страниц), cover-photo-book
(фото обложки книги). Привяжем TV поля к тому же шаблону (например, шаблон книги).
Заполнение TV полей при создании или редактировании ресурсов
После создания TV полей они становятся доступными во время создания или редактирования соответствующих ресурсов. Располагаются TV-поля на страницах ресурсах по умолчанию во вкладке "Дополнительные поля".

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

Вывод 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]]">

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` ]]
Возник вопрос по поводу вывода tv, имеющего множественное значение.
Вкратце, схема такова:
Есть список продуктов. Привязка продуктов к рецептам реализована через tv типа checkbox, названное product-to-recipe.
Есть список рецептов. Привязка рецептов к продуктам реализована через tv типа checkbox, названное recipe-to-product.
Оба tv имеют возможность выбора нескольких значений и шаблон вывода delimiter.
А вот как теперь «расклеить» вывод нескольких значений этих tv (то есть, разделить их, убрав ||) — чтото я не догоню никак. Только через решение со сниппетом, или всё-таки есть другие варианты?
Проблема решается через фильтры ввода-вывода. Оказалось достаточно в TV прописать коротЕнькую запись и всё встало на места.
Пример —
Если содержимое TV — числовые значения, результат примера — столько классов с числовым значением, сколько значений прописано в TV. Потенциал решения, думается, понятен…
и второй вопрос — как менять расположение блоков на странице? в шаблоне или на странице категории? не нахожу нигде prnt.sc/13o0n52
MODX Revolution 2.8.1-pl
Использую mFilter2 для фильтрации ресурсов, возникла проблема с отображением TV полей ресурса при результатах фильтрации (просто в категориях и в карточке товара все ок отображается), проблема именно в результатах фильтрации.
Код чанка wika_categoryTpl:
Проблема с отображаем img — [[+tv.image]]. Все остальное выводится. Доступы стоят для доп. поля в шаблонах.
Весь день голову ломаю, решения не нашел. Помогите, пожалуйста.
Лог выводится такой:
Заранее спасибо!
Указал в чанке вместо [[+tv.image]] — [[+image]] и все.
Поясню:
Есть фильтр — множественный выбор, выводятся значения данного фильтра сейчас по алфавиту, как сделать чтобы по положению в админке выводились значения фильтра?
Спасибо.
Так вывожу ресурсы текущей категории, но есть ещё TV-поле category, в котором указано, что ресурс принадлежит так же дополнительной категории. Это тоже нужно прописать в условиях.
— тоже работает, и выводит по TV- полю.
Как написать эти условия вместе?
А как можно было бы вывести кириллические значения TV «множественный выбор» с «возможными значениями» Круг==circ||Квадрат==square||Треугольник==tri
При обычном выводе во фронт отдаются латинские значения
В этой записи ключ располагается до «==», а значение после. При выводе значения TV на страницу, MODX конечно же выводит значения, а не ключи.
Если нужно наоборот, то кроме как писать свой сниппет для этого случая другого наверно решения нет.
Для этого создаём свой сниппет, например, outputMultipleTV со следующим кодом:
После этого чтобы вывести на страницу ключи TV с множественным выбором через запятую взываем этот сниппет:
В tvName нужно передать имя TV с множественным выбором, а в delimiter строку для отделения одного значения от другого.
Содержимое сниппета outputMultipleTV в этом случае будет следующим:
Если не работает, то можно попробовать очистить кэш.
Спасибо за Ваши уроки, очень помогает.
Подскажите, пожалуйста, в верстке у меня предусмотрен спаун картинки «акция», как можно сделать что бы в TV полях была возможность включить или выключить такой вызов? Или возможно есть другой способ?
Чанк:
В каком направлении хотя бы искать?
Спасибо!
После установки пакета ClientConfg, перейдите в конфигурацию (Пакеты -> Конфигурация) и создайте группу, например, основные параметры. Затем, например, создайте ключ, is_promotion, имеющий тип поля «Чекбокс».
В чанке напишите конструкцию:
В этом случае картинка «акция» будет выводиться пользователям только в том случае, если в конфигурации данное поле находится в отмеченном (включенном) состоянии.
Я только учусь, не судите строго, пересмотрел уже кучу информации в Интернете но решения не нашел.
Или в самом чанке вызова товара пишу Тоже ничего.
Уже несколько дней не могу найти решение, по идее должно быть очень простое, подскажите, пожалуйста.
Если TV имеет имя sale, то никаких префиксов указывать не нужно, оно выводится также как обычные поля ресурсов. В этом случае также не нужно использовать MODX фильтры.
Это будет работать так: Если галочка в дополнительном поле «Акция» установлена, то выведется содержимое чанка sale, если нет, то ничего не выведется.
Была ошибка с моей стороны, я использую pdoPage, и забыл добавить в &includeTVs новое TV.
Я так понимаю, TV-параметры сильно нагружают систему?
Подскажите, пожалуйста, какие есть трюки для того, чтобы обойтись без TV-параметров вообще или сделать их выборку «быстрой».
Например, выбирать все TV одним запросом? Или другие варианты?
TV-параметры — это удобный и простой механизм для добавления дополнительных полей к ресурсам. Если их использовать не слишком много, то они, конечно же, увеличат время генерации страницы, но это увеличение будет не существенным. Тут важнее правильно подойти к задаче и посмотреть, как её решить лучше. Также хорошая практика заключается в измерение времени написанных решений, а то узкое место может оказаться не там, где вы думаете.
Например, время запроса, в котором необходимо просто получить одно TV поле не составит более 0,001 секунды. Совсем другая ситуация, например, когда этих полей много и всех их, например, нужно использовать в запросе на странице поиска. Тут конечно время увеличится довольно сильно. Но и тут может разное придумать, всё зависит от проекта. Например, создать дополнительную таблицу и при сохранении ресурса или других действиях добавлять или обновлять строку в этой таблице. В этой таблице каждый ресурс и все его дополнительные поля будут храниться в одной записи. В этом случае поиск получится молниеносным.
Можно конечно и не использовать TV. Один из вариантов это использовать дополнительную таблицу. Пример этого решения приведён в этой статье.
И по поводу дополнительной таблицы правильно я понимаю, создаю таблицу в базе данных, далее, где указать, куда сохранять и откуда брать данные для фильтрации?
Второй вариант менее трудоёмкий, он заключается в том, чтобы оставить TV-поля, но создать дополнительную таблицу с данными которыми содержатся в TV-полях. При этом при сохранении TV-поля данные должны попадать в эту таблицу. Далее в mFilter2 использовать данные в этой таблице, а в не TV. В результате сильно уменьшиться время выполнения запроса и данные будут отдаваться намного быстрее.
Есть tv-поле data, в котором указываю дату начала мероприятия.
Теперь думаю, как сделать, что бы можно было показывать прошедшие мероприятия и будущие.
Для фильтрации использую nFilter2, по этому хорошо было бы фильтровать по TV-полю.
Вот как в это поле вывести условие:
Так фильтр выводит прошедшие мероприятия.
сниппет dataToday — текущая дата.
А мне надо что бы была возможность переключать «прошедшие-будущие»
У меня вопрос — так как опыта ноль, создаю свой первый проект, сразу, то есть о чем читаю — то и делаю… В результате теряю много времени, так как приходится восполнять нередко обнаруживаемые «белые пятна» (а их много) и не всегда понимаю, какими инструментами решать ту или иную задачу. Подскажите, мне нужно спарсить данные с одного сайта — а именно базу данных нескольких сот объектов с описаниями, фотками и прочими делами. Парсер (программу) я вроде нашел, она выводит результаты в различном виде, в том числе в файле для mySQL, или в обычной EXEL. Вопрос — как мне залить это на сайт? Я не прошу полной инструкции, прошу посоветовать какими инструментами это делать, что надо первым делом изучить? нужно ли прямо сейчас начинать изучать СУБД mySQL, взаимодействие с БД через консоль, короче, все с нуля, или есть какие то уже готовые инструменты для этого? Это можно сделать в MODX или в phpMyadmin? в результате должен получиться каталог с функцией поиска по наборам параметров.
По одному заводить не варианта, сами понимаете. кроме того, предполагается, что пользователи с некоторыми правами могли бы создавать и редактировать эти объекты через фронтэнд, а так же прикреплять к себе существующие объекты, подтвердив свое право это сделать через некую авторизацию (скажем, подтвердив свои права через почту объекта). короче, какой путь быстрее?
Для получения контента со страниц сайта можно написать php скрипт с использованием cURL (клиентской библиотеки для работы с URL).
И, следовательно, конструкция
должна выводить id, а не pagetitle.
Я сочиняю сниппет, где использую значение tv «price». По логике мне нужно отличать положительное значение, пустое значение и «0». А в итоге и пустое и «0» — оба — «0».
Как я понял, при выводе TV преобразуется в string, и ничего сделать не получается. В настройках TV тип ввода — число, тип вывода — по умолчанию (тип «число» не предлагается).
Пробовал умножать вывод на 1 — тип к integer приводится, но и пусто и «0» становятся «0».
Можно с этим что-то сделать?
PS. При выводе TV через теги такого поведения не наблюдается, там "" и «0» отличаются.
TV значения в базе данных хранятся в формате строки. Но это не мешает выполнить действия которые вы описали выше.
Пример сниппета:
Еще не очень хорошо знаю PHP((
Буду учиться)
Помогите пожалуйста У меня такой снипет:
Через него выводятся фотки в разные колонки (право и лево), в зависимости что указанно в TV поле «proekt».
Мне нужно добавить еще одно поле «tipo», и сделать вывод разных фотографий на разных страницах моего сайта.
Вопрос как сделать что бы учитывались эти два поля одновременно?
Пытаюсь вывести с помощью
[[!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 параметров. Как лучше выполнить дополнительные поля товаров, чтоб у каждого товара они были уникальными, и могли настраиваться фильтром?
Чтобы этого не делать, можно настроить синхронизацию необходимых TV переменных с помощью Babel. Для этого заходите на страницу «Системные настройки» -> Babel -> параметр babel.syncTvs. Нажимаете на кнопку «Редактировать» и в открывшемся диалоговом окне в качестве значения устанавливаете необходимые id TV для синхронизации. После этого значения указанных TV будут автоматически синхронизироваться у связанных ресурсов в разных контекстах.
Может Вам приходилось работать с дополнением ms2Gallery, когда фото прикреплены к ресурсу? В случае с tv-переменными можно поступить так как вы написали выше, а вот как поступить если фотки были загружены при использовании дополнения ms2Gallery? Ну мне показалось, что использовать это дополнение для прикрепления фоток к ресурсам проще чем создавать tv-переменные. Хотя сайты у меня есть с использованием разных решений на счет фото.