Как проще всего реализовать подобный функционал?

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

Аватар пользователя Alex_R Alex_R 20 мая 2010 в 17:15

Есть два разных типа материала, материал одного типа может ссылаться на материал(ы) другого типа. Если у материалов разные авторы, то связь между ними осуществляется по заявке (с любой стороны, по обоюдному согласию сторон). Какими средствами лучше всего организовать механизм заявок/подтверждений/отказов?
Объясняю на примере: На сайте есть раздел посвященный некому периодическому мероприятию (таких разделов много). По каждому мероприятию пишется основной официальный отчет (материал первого типа), На мероприятии присутствуют люди, которые ведут свои блоги в которые размещают свои отчеты с этого (и других) мероприятия (статьи/фотогалереи - материал(ы) второго типа). Далее автор подобного личного отчета должен иметь возможность подать заявку на включение ссылки на свой отчет в официальный отчет, а автор официального отчета должен рассмотреть заявку на включение этой ссылки в официальный отчет и сказать "да" или "нет", и наоборот, если автор личного отчета почему либо не подал такую заявку, то автор общего отчета может тоже подать заявку на установление связи с интересующим его документом и решение в таком случае принимает автор материала второго типа. Подача повторных заявок должна быть настраиваемой.
Что забить в поиск, чтобы найти нужное мне я не смог сообразить, на любой запрос выдает кучу всего не нужного Sad Вроде посидев неделю другую уже в силах и сам подобный модуль написать, но почему то мне кажется, что не надо огород городить и есть готовое, проверенное решение. Может кто подскажет?

Комментарии

Аватар пользователя Alex_R Alex_R 20 мая 2010 в 22:15

iHappy wrote:
нечего не понятно

Ну попробую с другой стороны объяснить.
1. В каждом типе материала есть поле ССК "Ссылка на материал" в каждом материале таких полей можно добавить сколько угодно. (множество ссылок на разные материалы).
2. При установке в материале "А" ссылки на материал "Б" автор материала "Б" должен получить об этом уведомление, что на его пытается ссылаться материал "А". И либо установить в своем материале ссылку на материал "А", либо этого не делать.
3. Все остальные пользователи сайта должны видеть только те ссылки, материалы которых ссылаются друг на друга.

Если и так не понятно, то видимо проще сделать, чем объяснить Sad

Аватар пользователя Alex_R Alex_R 20 мая 2010 в 23:03

<a href="mailto:sas@drupal.org">sas@drupal.org</a> wrote:
Это не материалы но принцип похож на Ваш user_relationships

Если правильно понял, то это как "Друзья" в "В Контакте" пока оба не скажут, что они друзья в списках друзей друг у друга не видны.
Да, очень похоже, но нужно применительно к материалам. Сейчас попробую разобраться как это там реализовано, может чего интересного для себя узнаю.

Аватар пользователя md5@drupal.org md5@drupal.org 21 мая 2010 в 1:30

Можно попытаться почудить с Workflow, но лично я не уверен, что получится. Скорее всего, что-то все-таки придется писать самому. В любом случае, Workflow наиболее подходящий для этого старт, ИМХО.

UPD. Немного пораскинул мозгами, пришел к следующему выводу. Необходимый набор — модули Workflow, Actions, Triggers, CCK, Node reference. Если пользователи, которые могут создавать мероприятия, и пользователи, которые могут чего-то к ним дописывать, разнесены по разным ролям, будет легче; если нет — тяжко придется, пока всё это настроишь, легко что-то упустить, а потом искать глюк часами. Хотя с первого раза и так не заработает Smile

Итак, схема работы примерно следующая. Юзер №2 (который пишет материалы к мероприятию) создает контент определенного типа и выбирает материал, куда это крепится (связка CCK + Node reference). После этого материал с помощью связки Workflow + Actions + Triggers попадает на редактирование юзеру №1 (который создал данное мероприятие), причем юзер №1 имеет права на редактирование добавляемой записи. После этого он либо публикует её, либо удаляет, либо отправляет обратно юзеру №2 на переработку или редактирует сам и потом публикует.

Есть момент. Поскольку решение о публикации принимает юзер №1, запись от юзера №2 должна быть изначально неопубликованой. Как это можно сделать, мозг полпервого ночи отвечать почему-то отказывается. Возможно, придется завести еще одно ССК-поле, которое мог бы редактировать только юзер №1, у роли которого есть соотв. права. Но если у юзеров №№ 1 и 2 одинаковая роль, данный способ не прокатит и останется уповать на возможности Workflow, а это я немного подзабыл уже.

Вот как-то так. Если бы передо мной стояла такая задача, перво-наперво попробовал бы именно таким методом.

Аватар пользователя Alex_R Alex_R 21 мая 2010 в 4:29

<a href="mailto:md5@drupal.org">md5@drupal.org</a> wrote:
UPD. Немного пораскинул мозгами, пришел к следующему выводу. Необходимый набор — модули Workflow, Actions, Triggers, CCK, Node reference.

Спасибо за развернутый ответ!
Завтра постараюсь разобраться с этим вариантом, на данный момент модуль Workflow раньше никогда не использовал и пока не представляю что он позволяет. Сразу скажу, что смутило в вашем описании:
<a href="mailto:md5@drupal.org">md5@drupal.org</a> wrote:

Если пользователи, которые могут создавать мероприятия, и пользователи, которые могут чего-то к ним дописывать, разнесены по разным ролям

Достаточно сложно отслеживается, поскольку это мультисайтинг с общими юзерами, условно общим контентом, но с разными ролями для каждого сайта. При этом материалы типа "А"(общие отчеты) доступны только для конкретного сайта, а материалы типа "Б" (личные фотоальбомы и т.д.) и являются одним из условно общих видов контента и условием включения их в контент конкретного сайта как раз и должна стать эта установленная связь между документами. (как сделать включение в контент знаю).

<a href="mailto:md5@drupal.org">md5@drupal.org</a> wrote:

запись от юзера №2 должна быть изначально неопубликованой.

Вот это явно нереально, поскольку статус "Неопубликовано" для каждого документа уникально, а в блоге автора документ должен быть сразу виден.

<a href="mailto:md5@drupal.org">md5@drupal.org</a> wrote:

Возможно, придется завести еще одно ССК-поле, которое мог бы редактировать только юзер №1, у роли которого есть соотв. права.

Если можно расскажите поподробнее какими модулями достигается функционал, чтобы пользователь определенной роли мог редактировать только конкретное поле в документе, но не сам документ.

Я честно говоря пока склоняюсь к мысли создания своего модуля который вижу примерно так:
1. Создается таблица с тремя полями NID1, NID2, Status (0 - ожидает решения, 1 - связь разрешена, 2 - связь запрещена). И подключается, чтобы Views мог с ней работать.
2. При создании заявки на связь в таблицу заносится запись NID1 = NID документа который ссылается, NID2 = NID документа на который ссылаются, Status = 0 (при создании записи делаются проверки на совместимость типов материалов и отсутствие такой связи)
3. В каждый документ подключается 3 представления:
Первое (действующие связи): Status = 1, NID1 или NID2 = nid данного документа - показывается всем,
(автору документа с возможностью редактирования статуса в случае если NID2 = nid).
Скорее всего его имеет смысл разделить на два представления NID1 = nid и NID2 = nid,
хотя это исключит возможность общей сортировки, так что не уверен.
Второе (ожидающие подтверждения) : Status = 0, NID2 = nid данного документа - показывается только автору
с возможностью редактирования статуса.
Третье(запрещенные связи): Status = 2, NID2 = nid данного документа - показывается только автору
с возможностью редактирования статуса.
4. При заходе на сайт пользователя создается представление Status = 0 и NID2 принадлежит данному пользователю и если данное представление не пустое, то пользователь переадресовывается на страницу с данным представлением.
5. Возможно к этому еще подключить сообщение по емейлу о появлении новых ожидающих подтверждения связей.

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

Аватар пользователя md5@drupal.org md5@drupal.org 31 мая 2010 в 11:58

"Alex_R" wrote:
Достаточно сложно отслеживается, поскольку это мультисайтинг с общими юзерами, условно общим контентом, но с разными ролями для каждого сайта. При этом материалы типа "А"(общие отчеты) доступны только для конкретного сайта, а материалы типа "Б" (личные фотоальбомы и т.д.) и являются одним из условно общих видов контента и условием включения их в контент конкретного сайта как раз и должна стать эта установленная связь между документами. (как сделать включение в контент знаю).

Сочувствую.
"Alex_R" wrote:
Если можно расскажите поподробнее какими модулями достигается функционал, чтобы пользователь определенной роли мог редактировать только конкретное поле в документе, но не сам документ.

Попробуйте посмотреть на этот модуль — workflow_fields">http://drupal.org/project/workflow_fields]workflow_fields[/module]. Кажется, то, что надо.

Ваш вариант решения похож на что-то правильное, но надо пробовать.

И кстати, знаю, что меня сейчас за такое предложение запинают ногами по печени, но в вашем случае, чтобы что-то (не) выводилось в нужном месте, придется, наверное, использовать РНР-код прямо в файле шаблона темы. Меня, во всяком случае, такая безидейность пару раз сильно выручала.

Аватар пользователя pselfin pselfin 31 мая 2010 в 14:58

Мне вот интересно: что может помешать авторам(как с одной, так и с другой стороны) поставить просто в тексте ссылку куда угодно, кроме честности и совести?
Может это проще организовать "Правилами использования сайта" да личными сообщениями?

Аватар пользователя Alex_R Alex_R 31 мая 2010 в 18:14

<a href="mailto:P.Selfin@drupal.org">P.Selfin@drupal.org</a> wrote:
Мне вот интересно: что может помешать авторам(как с одной, так и с другой стороны) поставить просто в тексте ссылку куда угодно, кроме честности и совести?
Может это проще организовать "Правилами использования сайта" да личными сообщениями?

1. Запрет использования ссылок в материалах (не мой случай, но вполне возможная ситуация)
2. Обыкновенная забывчивость.
3. При удалении материала обычная ссылка останется "в никуда", а в этом случае тоже исчезнет.

Модуль в первом приближении сделан и в настоящее время тестируется, о чем я уже писал, думаю, что на днях выложу обновленную версию.