Как связать три сущности, одна из которых дата

Главные вкладки

Аватар пользователя Regmaya Regmaya 16 декабря 2009 в 1:08

Как лучше* всего реализовать такие отношения:
Есть тип "Событие" (концерт, спектакль), которое может происходить в "Месте" (Большой театр, Красная площадь) в определенные "Даты".
Нужны два типа страниц: "Событие" и "Место".
При создании события есть возможность выбрать места проведения с датами для каждого места.
Например, концерт группы "АВВА" с 25 по 30 декабря в "Дворце пионеров", а с 3 по 12 января в клубе "Максимум".
На сайте на странице события "Концерт группы "АВВА" указаны места и даты, на странице "Дворец пионеров" указаны все события, проходящие здесь, с датами, в том числе "АВВА" (25-30 декабря), на странице "События за январь" выводятся понятно что, в том числе "АВВА" (клуб "Максимум").
Страницы, видимо, надо будет делать с помощью Views, а вот как сделать связи между событиями-местами-датами, я не знаю.
Связь "Событие-Место" делаем с помощью CCK Node reference. Как теперь добавить для каждой такой связи свои даты? Подскажите, в каком направлении копать?

*Лучше всего, значит, с использованием самых популярных модулей, без залезания в код и БД.

Комментарии

Аватар пользователя kyky kyky 16 декабря 2009 в 3:12

Кратко:
связь делается с помощью Node reference;
вывод дочерних нод можно осуществить через CCK views field по аргументу текущей ноды;
вывод событий/мест/групп -- views с аргументами.

ps1: ищите на этом сайте, вы далеко не первый, кто поднял это вопрос;
ps2: такие схемы нужно сначала рисовать на бумажке.

Аватар пользователя Dan Dan 16 декабря 2009 в 4:59

kyky, Вы не поняли вопрос - надо к одной ноде прикрепить через node_reference другие, и на каждую привязку повесить дату.

Хороший вопрос, сам недавно думал. Несколько вариантов решения придумал, но все - самописные. Надо порыть д.орг - наверняка есть.

Аватар пользователя yurgon yurgon 16 декабря 2009 в 10:17

да все просто делается

берется 3 типа материалов:

1. Место проведения
2. Что проходит
3. Событие - Афиша

Далее...

Вы создаете место, затем создаете "Что проходит" ну все это конечно со своими полями и тд, как вам удобно.

Затем создаете Афишу, к Афише прикручены все эти 2 поля (место и что проходит) через node_reference + поле с датой.

Вот и все, а далее выводите как вам угодно через views.

Геморно, но какой вопрос такой и ответ.

Аватар пользователя Dan Dan 16 декабря 2009 в 18:15

Я на node_reference собаку съел. И двух кошек. Группировка полей при вводе очень нужна, если не найду, сам напишу.

Аватар пользователя Regmaya Regmaya 16 декабря 2009 в 19:19

yurgon, спасибо за идею, можно и так, вполне приемлимая реализация.
Dan - внимательный, сразу понял суть вопроса.

Если я правильно понимаю, то проблема сводится к следующему:
Как создать node_reference на node_reference?

Я дал полное описание задачи, чтобы более опытные люди подсказали другие варианты реализации без этой проблемы (как это сделал yurgon).

Насколько я понял модуль Inline Nodereferences как раз делает нечто подобное, но я не понял как его скачать.

Аватар пользователя Dan Dan 16 декабря 2009 в 20:34

"Regmaya" wrote:
Насколько я понял модуль Inline Nodereferences как раз делает нечто подобное, но я не понял как его скачать.

Его нельзя скачать, т.к. нет ни одной версии.

Аватар пользователя kyky kyky 17 декабря 2009 в 3:19

"yurgon" wrote:
да все просто делается
берется 3 типа материалов:

Я про это и писал: нужны 3 сущности -- что (фильм, группа), где (место), когда (событие).
И вяжутся по node_reference. Вывод вьюсами с аргументами.

Аватар пользователя Dan Dan 17 декабря 2009 в 4:22

"kyky" wrote:
Я про это и писал: нужны 3 сущности -- что (фильм, группа), где (место), когда (событие). И вяжутся по node_reference. Вывод вьюсами с аргументами.

Это верно всё, но из-за того, что у вас лишняя сущность (не то чтобы лишняя, скорее избыточная - дата), вы породите много лишних объектов.

Пример:

Нода даты 1
 Когда: дата1-дата2 (поле)
 Что: Фильм "Сюрприз" (нода "союрприз")
 Где: КТ "Молот" (нода "молот")
Нода даты 2
 Когда: дата3-дата4 (поле)
 Что: Фильм "Сюрприз" (нода "союрприз")
 Где: КТ "Рассвет" (нода "рассвет")

Сколько получается нод? 5! Общая формула 1 + 2n, где n - число мест, то есть для 10-ти кинотеатров надо будет завести 21 ноду. Но т.к. кинотеатры и фильмы - "нормальные ноды", то формула будет (1+2n)-(1+n )= n, то есть паразитное кол-во нод при такой архитектуре прямо пропорционально кол-ву мест (что в данном случае очевидно, но так бывает не всегда).
Плюс необходимо сделать список самих нод-дат (дабы получить Афишу), и сделать список афиш на кинотеатр.

Должно же быть по-другому:

Афиша фильма "Сюприз" (нода)
 Фильм "Сюрприз" (нода сюрприз)
 ---
 Где: КТ "Молот" (нода "молот")
 Когда: дата1-дата2 (поле "дата1-2")
 ---
 Где: КТ "Рассвет" (нода "рассвет")
 Когда: дата3-дата4 (поле "дата3-4")

При такой архитектуре кол-во паразитных нод равно нулю.

Аватар пользователя kyky kyky 17 декабря 2009 в 9:26

"Dan" wrote:
Должно же быть по-другому:

В вашем примере вы отталкиваетесь от самого фильма.
То есть -- я открываю ноду фильма "Аватар", читаю аннотацию, смотрю скриншоты и вижу, в каких кинотеатрах он будет идти и когда. Но я принципиально хожу в один кинотеатр, поэтому я сразу открываю ноду этого кинотеатра и смотрю, когда в нем будет идти "Аватар" и во сколько.
Ваша связь не позволит мне вывести ноду кинотеатра с фильмами и расписанием -- на уровне интерфейса, конечно. Уточню, что на уровне sql это всё решается элементарно (как ваша, так и моя структура), но у нас идет разговор именно об иерархии и выводе нод.

Давайте рассмотрим мою связь подробнее: в ней нет того смещения в сторону фильмов, как у вас.
У меня отдельно существуют фильмы и кинотеатры, и те и другие могут иметь свой рейтинг, комментарии, дополнительные реквизиты. Их объединяет сущность "сеанс", которая тоже уникальна и дает больше гибкости.
Например, в ноде "сеанс" я указываю кинотеатр, фильм, что будет входить в программу, ссылки на споноров (для премьеры одни, для остального показа -- другие), размещаю в ней разного рода замануху, и т.д.

Да, пусть нод станет больше, зато больше возможностей и гибкости: открываю ноду "фильм" -- вижу, в каких кинотеатрах он идет и во сколько; открываю кинотеатр -- вижу, какие в нем идут фильмы и во сколько; открываю раздел "что посмотреть вечером" -- сводная сетка по фильмам/кинотеатрам.

Аватар пользователя Dan Dan 17 декабря 2009 в 13:45

Да, со всем согласен. Именно поэтому в 4-м комменте я и написал: "Группировка полей при вводе очень нужна, если не найду, сам напишу." Плюс интеграция группировки во views.