Парные TV, динамическое добавление и вывод

Здравствуйте. Давно работаю с modx и часто встречаю ситуацию, когда необходимо ресурсу создать поля TV, но заранее неизвестно, сколько их должно быть.
Самый яркий пример, это фотографии у позиций, у одной позиции их может быть три, а у второй одна, ну и т.д — для такой задачи с фото, существуют галереи, но это не всегда удобно и проблема не всегда именно в ситуации с фотографиями.
Допустим у меня есть категории, в этих категориях есть блок с УТП, который представлен парами 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>	
`]]
Но создается впечатление, что это все костыльно и не гибко.
Возможно есть способы решить данную задачу более по-человечески.
Было бы хорошо, если бы в админ панели была возможность, прямо в ресурсе категорий создавать необходимое кол-во полей ТВ именно для этой категории, нужно три пары для категории — создаем три, нужно десть пар — пожалуйста.
Второй момент с выводом этих ТВ, сейчас я их прописываю жестко в код страницы, а хотелось бы проходится циклом и забирать только те поля, которые есть у данной категории, если их пять, то и вывести нужно пять, если десть — то десять.
Возможно кто-то сможет подсказать как правильно решать такие задачи или же мой вариант вполне нормальный и так делать и нужно?
Dolce
03 февраля 2018, 11:05
modx.pro
1
1 647
0

Комментарии: 3

Скаут
03 февраля 2018, 15:05
0
Мне кажется, для таких целей надо использовать migx.
На его основе можно создавать так называемые «повторяющиеся» строки (repeatable field), т.е. каждому ресурсу задавать столько сколько нужно при создании/редактировании.
Хранится все это в виде json, и дёргаться бд будет один раз для всех полей, а не 1 ТВ — 1 запрос.
выводится тоже, одним вызовом все что есть.

вроде так, а вот код-пример уже подсказать не смогу.
    Андрей
    03 февраля 2018, 17:19
    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.
      Dolce
      03 февраля 2018, 19:42
      0
      Большое спасибо, буду копать в эту сторону
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3