Динамическое в динамическом

Всем привет!

Возникла задача сделать в Админке удобный функционал для заполнения данных об этажах зданий (здания — это ресурсы MODx). Заполнять будет менеджер компании-заказчика.

Данные такие:
  1. название этажа,
  2. картинка-планировка,
  3. файлик с планировкой
  4. и экспликация этажа (таблица помещений этажа с названиями и площадями).

Кол-во этажей в каждом здании разное и заранее неизвестно. В смысле, оно становится определённым в процессе заполнения.

Первые три пункта не вызывают вопросов. Можно было бы использовать тот же МультиТВ.

А вот 4-й… Дело в том, что кол-во помещений на каждом этаже тоже разное и заранее неизвестно.

То есть как бы надо использовать МультиТВ внутри МультиТВ :)

Я обдумал пару-тройку решений, но все кажутся какими-то неуклюжими.

Буду рад, если вкратце напишете, кто как решал такие задачи. Может, что-то готовое есть для Эво, а я не знаю. Может, и на МультиТв это можно сделать?

24 комментария

avatar
Так есть такое ;) мульти в мульти
На гитхабе у либера
avatar
Спасибо, щас поскребем у него в сусеках ))
avatar
Если отыщете, выложите ссылку на решение.
avatar
Пока нашел только это modx.im/blog/questions/4783.html
avatar
Вот где она liber87/add_multitv
avatar
Делал недавно что-то подобное с использованием подготовленного svg,
ddmultifhields

centrum-trk.ru
joxi.ru/eAOWaYaUy1ePAo
joxi.ru/a2XnyZyTxn3Grg
joxi.ru/12M5KYKS3VY72J
joxi.ru/DrlBPoPiMWBb2P
А вот 4-й… Дело в том, что кол-во помещений на каждом этаже тоже разное и заранее неизвестно.
Решается нарисованным svg макетом — если номера на svg нет, привязки к нему не будет
Комментарий отредактирован 2017-06-06 14:12:03 пользователем swed
avatar
Решение очень своеобразное :), но для моих целей не совсем то.
avatar
Я такое делал когда-то, задавая этажи отдельными ресурсами, вложенными в здания, а уже отдельные квартиры в них — с помощью dd_multiplefield.
Поскольку здания были не очень многоэтажными(в пределах 20), то получилось весьма удобно — можно было допустим весь этаж легко скопировать в другой дом.
avatar
Тоже вариант, особенно если сделать на ресурсе-здании кнопку «Создать этаж».

Но, пожалуй, в моем случае это было бы слишком мудрёное решение — здания еще более «не очень» многоэтажные, чем у вас, от 1 до 3х этажей.

Поэтому я не стал «плодить сущности без необходимости» и обошелся созданием нужных ТВ для каждого этажа.

Тем не менее, хотелось найти общее удобное решение для любых подобных случаев на будущее, и пока я такого не вижу.
avatar
напомнило калькулятор оконных конструкций, похожая логика:

- Calculator
 - Типы конструкций
  - Элементы
   - Элемент, параметры, картинки...
  - Элементы
  - Конструкции (из указанных елементов)
avatar
Гляньте вот:
modx.im/blog/addons/5237.html

Мультитв в мультитв есть тоже но пока плагином:
github.com/dmi3yy/add_multitv
avatar
Спасибо,

1) по Content Blocks — уже мельком смотрел, интересная штука, буду применять.

2) по add_multitv — я тогда нашел это у либера, посмотрел и увидел, что:
— сделано для конкретного случая,
— что структура инпутов и т.д. для ввода данных жестко зашита в JS-коде,
— что документации ноль.
И решил всё-таки не тратить время на то, чтобы разбирать код и переписывать его.
avatar
Добрый день.
Можно поинтересоваться, к чему в итоге пришли и как реализовали?
P.S. Похожая задача настигла))
avatar
нашел то что надо, вопрос снимается
avatar
Интересно, что вы выбрали? я бы, наверное, использовал PageBuilder.
avatar
его и выбрал)) По началу, да и сейчас, не понял чем отличются ContentBlocks от PageBuilder и почему здесь и на гите стоит видео от Дмитрия по ContentBlocks. Но оно как раз и помогло, т.к. нужна была именно фишка type => group.
В общем, сижу и наслаждаюсь.
А заодно читаю доки и думаю, может подскажете, как решить здесь же еще два вопроса:
1. Как сделать, чтобы вкладка PageBuilder была только на нужных шаблонах (страницах), а не на всех.
2. Как во внутрь запихнуть вкладки от bootstrap, чтобы одна из них по умолчанию была активной
avatar
1. Через контейнер или show_in_templates
2. хз
avatar
Спасибо.
Уже и в доках прочитал, но пока не получается, по прежнему вкладка на всех страницах, код будет ниже.
avatar
Все работает, нужно просто из папки config удалить весь ненужный хлам.
avatar
По поводу названия — ContentBlocks был первым вариантом названия, впоследствии автор переименовал в PageBuilder.

1. Уже подсказали.
2. Не понял вопрос — вовнутрь чего запихнуть?

А вообще, в PageBuilder есть prepare (то ли в комментах к посту про дополнение здесь, то ли на ГитХабе, не помню, где я обсуждал с автором про препаре к PB).

У 64j также есть подобное решение, кажется multiFields, оно есть здесь в Экстрас).
avatar
Спасибо. По п.2., там и еще нюанс есть.
Сделал такой конфиг
<?php

    return [
        'title' => 'Группа ссылок',

        'show_in_templates' => [ 5 ],

//        'show_in_docs' => [ 2 ],

//        'hide_in_docs' => [ 5 ],

//        'order' => 1,

//        'container' => 'default',


        'templates' => [
            'owner' => '
				<div>[+text+]</div>
                <div>[+links+]</div>
            ',

            'links' => '<span><a href="[~[+link+]~]">[+title+]</a></span> ',
        ],

        'fields' => [
			'text' => [
                'caption' => 'Группа',
                'type'    => 'text',
            ],
            'links' => [
                'caption' => 'Ссылки',
                'type'    => 'group',
				'fields' => [
					'link' => [
						'caption' => 'Ссылка, id',
						'type'    => 'text',
					],
					'title' => [
						'caption' => 'Название',
						'type'    => 'text',
					],
				],
			
			],
		],
    ];

в админке все Ок

На фронте пока так

А надо так, вкладками
Комментарий отредактирован 2020-01-09 17:39:57 пользователем paic
avatar
В общем, сделал как в multiTV — отдельные шаблоны и 2 вызова, в конфиге так
'templates' => [
			'nav' => [
				'owner' => '<a id="nav-dis-tab[+iteration+]" data-toggle="tab" href="#d[+iteration+]" [[if? &is=`[+iteration+]:is:1` &then=`class="active"`]]>[+text+]</a>',
			],

			'tab-content' => [
				'owner' => '<div class="tab-pane fade [[if? &is=`[+iteration+]:is:1` &then=`show active`]]" id="d[+iteration+]" role="tabpanel" aria-labelledby="nav-dis-tab">
								[+links+]
							</div>',
				'links' => '<span><a href="[~[+link+]~]">[+title+]</a></span> ',
			],
        ],

if вроде тоже работает
avatar
Да, табы так и делаются, двумя вызовами. Только я еще конфиги в отдельный контейнер засовываю. Чтобы ничего лишнего не попало.
avatar
Трудно не воспользоваться советом автора.
Спасибо за достойную разработку!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.