Регистрация
Вход через соцсети
Восстановление пароля

Связь многие ко многим между разделами и публикациями

Новый топик
27.06.2009, 12:15
Ответить | Цитировать
furamag
furamag

Зарегистрирован:
2008-04-13
Сообщений: 19

У меня на сайте довольно сложный справочник, в котором одна статья может принадлежать к разным разделам. До 50% статей должны иметь два раздела-родителя. Как это можно реализовать в NetCat? Если бы я писал сам систему, то реализовал бы посредством дополнительной MySql таблицы (таблица статьи, таблица разделы и дополнительная таблица - связи). Но вот как это сделать для NetCat ума не приложу. Причём, неплохо было бы удобный интерфейс придумать для добавления разделов.

В общем, подскажите, пожалуйста, общий алгоритм реализации. Сделать я смогу всё сам. Заранее спасибо за помощь!
28.06.2009, 13:35
Ответить | Цитировать
DiGGy
DiGGy
DiGGy

Зарегистрирован:
2005-04-04
Сообщений: 1546

У меня был проект - информационный портал - со схожей задачей. Всё свёл к след. решению:
1. Все документы добавляются в один раздел "Реестр документов".
2. Каждый документ имеет классификацию по ряду параметров
3. Каждый раздел по сути является фильтром для "Реестра документов".

Чтобы отфильтровать требуемые документы, надо сделать выборку из реестра по каким-то параметрам, тут 2 варианта:
1. В настройках каждого раздела прописать внешнюю ссылку типа /reestr/?date=..&rubric=..&type=.. и т.д. Исполнение простое, но требует "выноса мозгов" у Заказчика при формировании таких ссылок.
2. Задействовать "Настройки отображения компонента раздела". В данном случае Заказчик получает более удобоваримый интерфейс для организации фильтра. Также плюс в том, что УРЛ адреса имеют нормальный вид, т.е. никто не видит параметры заданного фильтра.

Пример каталога с фильтром.
Пример настроек фильтра:
Изображение

Temet nosce...
03.07.2009, 09:48
Ответить | Цитировать
furamag
furamag

Зарегистрирован:
2008-04-13
Сообщений: 19

DiGGy, спасибо за ответ. Я думаю, что мне не совсем подойдёт такое решение. Просто у меня уже рабочий сайт и нужно будет переделать очень многое, чтобы реализовать то, что вы предложили.
У меня есть два других решения, но они не лишены недостатков.

1. Добавить к компоненту, для объектов которого нужен больше, чем один раздел поле или несколько полей типа "Связь с другим объектом". Формат поля нужно прописать как "Subdivision". Таким образом мы получим довольно удобный интерфейс для прикрепления дополнительных разделов к каждому объекту. Поскольку, когда я делал данный сайт, у меня познаний в NetCat было очень мало, а познания в php/mysql были довольно неплохие, то у меня вывод объектов и списка объектов в компоненте сделан посредством запросов прямо в полях компонента к БД. Я не знаю насколько это правильно, но в моём случае мне нужно будет при выводе списка объектов компонента просто вставить несколько дополнительных условий в запрос к БД.
Плюсы метода: в моём случае - быстрая реализация. Я могу реализовать этот метод минут за 20.
Минусы метода: избыточность БД. В идеале, для связи объект-раздел мы должны организовать отдельную таблицу связей. Предложенный выше метод не очень "красив", если у вас объект будет принадлежать к 5 и более разделам.

2. Добавить в БД таблицу для связей объектов и разделов. При добавлении нового объекта добавить в форму добавления конструкцию на JavaScript, чтобы можно было добавлять неограниченное количество дополнительных полей для внесения в них дополнительных разделов. Сделать "Действие после добавления объекта", которое будет добавлять дополнительные связи в таблицу связей. При выводе объекта или списка объектов сделать более сложный запрос к БД (в моём случае) или воспользоватся функциями NetCat (если это возможно), чтобы выбрать все объекты прикреплённые к данному разделу. Вот только интерфейс привязки к объекту дополнительных разделов я пока не придумал. Подозреваю, что можно как-то хитро вызвать окошко, которое используется при заполнении поля типа "Связь с другим объектом" и таким образом удобно добавить дополнительный раздел.
Плюсы метода: более правильная реализация в плане проектирования БД. Полностью избыточности избежать не удаётся, но она сводится к минимуму.
Минусы метода: пока что не знаю как реализовать интерфейс добавления дополнительных разделов к объекту.

Кто-то что-то может сказать по поводу написанного?
03.07.2009, 11:05
Ответить | Цитировать
DiGGy
DiGGy
DiGGy

Зарегистрирован:
2005-04-04
Сообщений: 1546

Я бы пошел по 2му варианту, ибо он более соотв-ет реляционной организации БД.
Добавляете компонент с полями: ИД_компонента, ИД_записи_компонента, ИД раздела.
Ну соотв-но прописываете всю триггерную логику для отслеживания целостности данных.

Интерфейс. Заходите в режиме редактирования в полный просмотр записи. В этом полном просмотре через s_list_class(xx,yy,"&ИД_записи_компонента=...&...",true) выводите на редактирование выше указанный компонент и пользуетесь всеми возможностями штатного функционала неткета. Жмете добавить, поля ИД_компонента, ИД_записи_компонента автоматом берете от текущей записи полного "просмотра", а раздел выбираете из <select>. Если с умом подойти, то всё это можно уложить в 3 клика:
1. Жмем добавить раздел.
2. Выбор раздела.
3. Сохранить (после сохранения автоматический редирект на исходную страницу).

Temet nosce...
198 196 2009-07-03 11:05:59 7737
Описание проекта