Парные TV, динамическое добавление и вывод
Здравствуйте. Давно работаю с modx и часто встречаю ситуацию, когда необходимо ресурсу создать поля TV, но заранее неизвестно, сколько их должно быть.
Самый яркий пример, это фотографии у позиций, у одной позиции их может быть три, а у второй одна, ну и т.д — для такой задачи с фото, существуют галереи, но это не всегда удобно и проблема не всегда именно в ситуации с фотографиями.
Допустим у меня есть категории, в этих категориях есть блок с УТП, который представлен парами TV с картинкой и TV с подписью(тут в принципе тоже ситуация с изображениями, но опять же это не всегда так, просто я опишу суть вопроса на этом примере)
В админ панели это смотрится не очень-то хорошо, у меня 12 полей для каждой категории. Но в одной категории этих пар может быть три, в другой — все шесть, а завтра появится третья, и в ней будет десть, допустим. Придется идти и создавать еще четыре пары для всех категорий.
Далее, чтобы не выводить лишние пары, у которых пустые значения, использую стандартную фильтрацию modx:
Возможно есть способы решить данную задачу более по-человечески.
Было бы хорошо, если бы в админ панели была возможность, прямо в ресурсе категорий создавать необходимое кол-во полей ТВ именно для этой категории, нужно три пары для категории — создаем три, нужно десть пар — пожалуйста.
Второй момент с выводом этих ТВ, сейчас я их прописываю жестко в код страницы, а хотелось бы проходится циклом и забирать только те поля, которые есть у данной категории, если их пять, то и вывести нужно пять, если десть — то десять.
Возможно кто-то сможет подсказать как правильно решать такие задачи или же мой вариант вполне нормальный и так делать и нужно?
Самый яркий пример, это фотографии у позиций, у одной позиции их может быть три, а у второй одна, ну и т.д — для такой задачи с фото, существуют галереи, но это не всегда удобно и проблема не всегда именно в ситуации с фотографиями.
Допустим у меня есть категории, в этих категориях есть блок с УТП, который представлен парами TV с картинкой и TV с подписью(тут в принципе тоже ситуация с изображениями, но опять же это не всегда так, просто я опишу суть вопроса на этом примере)
<div class="dignity">
<div class="dignity__inner">
<div class="dignity__item">
<img src="[[*cat__utpImg--1]]" alt="" class="dignity__img">
<div class="dignity__title">[[*cat__utpTitle--1]]</div>
</div>
<div class="dignity__item">
<img src="[[*cat__utpImg--2]]" alt="" class="dignity__img">
<div class="dignity__title">[[*cat__utpTitle--2]]</div>
</div>
<div class="dignity__item">
<img src="[[*cat__utpImg--3]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--3]]</div>
</div>
<div class="dignity__item">
<img src="[[*cat__utpImg--4]]" alt="" class="dignity__img">
<div class="dignity__title">[[*cat__utpTitle--4]]</div>
</div>
<div class="dignity__item">
<img src="[[*cat__utpImg--5]]" alt="" class="dignity__img">
<div class="dignity__title">[[*cat__utpTitle--5]]</div>
</div>
<div class="dignity__item">
<img src="[[*cat__utpImg--6]]" alt="" class="dignity__img">
<div class="dignity__title">[[*cat__utpTitle--6]]</div>
</div>
</div>
</div>В данном примере шесть пар TV с изображениями и названиямиВ админ панели это смотрится не очень-то хорошо, у меня 12 полей для каждой категории. Но в одной категории этих пар может быть три, в другой — все шесть, а завтра появится третья, и в ней будет десть, допустим. Придется идти и создавать еще четыре пары для всех категорий.
Далее, чтобы не выводить лишние пары, у которых пустые значения, использую стандартную фильтрацию modx:
[[*cat__utpImg--1:notempty=`
<div class="dignity">
<div class="dignity__inner">
<div class="dignity__item">
<img src="[[*cat__utpImg--1]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--1]]</div>
</div>
[[*cat__utpImg--2:notempty=`
<div class="dignity__item">
<img src="[[*cat__utpImg--2]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--2]]</div>
</div>
`]]
[[*cat__utpImg--4:notempty=`
<div class="dignity__item">
<img src="[[*cat__utpImg--3]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--3]]</div>
</div>
`]]
[[*cat__utpImg--4:notempty=`
<div class="dignity__item">
<img src="[[*cat__utpImg--4]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--4]]</div>
</div>
`]]
[[*cat__utpImg--5:notempty=`
<div class="dignity__item">
<img src="[[*cat__utpImg--5]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--5]]</div>
</div>
`]]
[[*cat__utpImg--6:notempty=`
<div class="dignity__item">
<img src="[[*cat__utpImg--6]]" alt="" class="dignity__img">
<div class="dignity__title"> [[*cat__utpTitle--6]]</div>
</div>
`]]
</div>
</div>
`]]Но создается впечатление, что это все костыльно и не гибко.Возможно есть способы решить данную задачу более по-человечески.
Было бы хорошо, если бы в админ панели была возможность, прямо в ресурсе категорий создавать необходимое кол-во полей ТВ именно для этой категории, нужно три пары для категории — создаем три, нужно десть пар — пожалуйста.
Второй момент с выводом этих ТВ, сейчас я их прописываю жестко в код страницы, а хотелось бы проходится циклом и забирать только те поля, которые есть у данной категории, если их пять, то и вывести нужно пять, если десть — то десять.
Возможно кто-то сможет подсказать как правильно решать такие задачи или же мой вариант вполне нормальный и так делать и нужно?
Комментарии: 3
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
На его основе можно создавать так называемые «повторяющиеся» строки (repeatable field), т.е. каждому ресурсу задавать столько сколько нужно при создании/редактировании.
Хранится все это в виде json, и дёргаться бд будет один раз для всех полей, а не 1 ТВ — 1 запрос.
выводится тоже, одним вызовом все что есть.
вроде так, а вот код-пример уже подсказать не смогу.
Конкретно по вашему примеру, можно сделать так:
1. Ставим MIGX
2. Создаём тв с типом MIGX, далее настройки:
Вкладки формы:
Разметка колонок:
Вывод на странице (1 — id страницы, paramName — имя ТВшки):
Вывод сделан на Fenom (должен быть установлен pdoTools, и включена системная настройка — Использовать Fenom на страницах). Если есть желание использовать стандартный парсер, то можно выводить стандартным сниппетом getImageList из комплекта MIGX.