Парные 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
Мне кажется, для таких целей надо использовать migx.
На его основе можно создавать так называемые «повторяющиеся» строки (repeatable field), т.е. каждому ресурсу задавать столько сколько нужно при создании/редактировании.
Хранится все это в виде json, и дёргаться бд будет один раз для всех полей, а не 1 ТВ — 1 запрос.
выводится тоже, одним вызовом все что есть.
вроде так, а вот код-пример уже подсказать не смогу.
На его основе можно создавать так называемые «повторяющиеся» строки (repeatable field), т.е. каждому ресурсу задавать столько сколько нужно при создании/редактировании.
Хранится все это в виде json, и дёргаться бд будет один раз для всех полей, а не 1 ТВ — 1 запрос.
выводится тоже, одним вызовом все что есть.
вроде так, а вот код-пример уже подсказать не смогу.
Возможно кто-то сможет подсказать как правильно решать такие задачи или же мой вариант вполне нормальный и так делать и нужно?Как уже подсказали выше, используйте MIGX. Приведённый код это жесть конечно :))
Конкретно по вашему примеру, можно сделать так:
1. Ставим MIGX
2. Создаём тв с типом MIGX, далее настройки:
Вкладки формы:
[
{
"caption": "Заголовок",
"fields": [
{
"field": "title",
"caption": "Описание",
"inputTVtype": "text"
},
{
"field": "img",
"caption": "Картинка",
"inputTVtype": "image",
"sourceFrom": "migx"
}
]
}
]
Разметка колонок:
[{
"header": "Описание",
"dataIndex": "title"
},{
"renderer": "this.renderImage",
"sourceFrom": "migx",
"header": "Картинка",
"dataIndex": "img"
}]
Вывод на странице (1 — id страницы, paramName — имя ТВшки):
{set $rows = 1 | resource : 'paramName' | fromJSON}
{if $rows?}
<div class="dignity">
<div class="dignity__inner">
{foreach $rows as $idx => $row}
<div class="dignity__item">
<img src="{$row.img}" alt="" class="dignity__img">
<div class="dignity__title">{$row.title}</div>
</div>
{/foreach}
</div>
</div>
{/if}
Вывод сделан на Fenom (должен быть установлен pdoTools, и включена системная настройка — Использовать Fenom на страницах). Если есть желание использовать стандартный парсер, то можно выводить стандартным сниппетом getImageList из комплекта MIGX.
Большое спасибо, буду копать в эту сторону
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.