Как реализовать двухсторонние ссылки на узлы?

20

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

Например, в системе отслеживания билетов с двумя билетами (узлами) A & B можно создать ссылку на узел из билета A -> B и пометить B как дочерний. При просмотре билета А эта информация будет тривиальной. Однако я также хотел бы отобразить эту взаимосвязь при просмотре билета B и показать билет A в качестве его родителя.

Это то же самое требование будет также применяться в неиерархических ситуациях (заявки C & D) со ссылкой из C -> D, отношения должны быть выставлены на билете D, а также на C.

markdorison
источник

Ответы:

25

Доступно много модулей, ваш пробег может варьироваться:

BackReference (только Drupal 6)

NodeReferrer (бета-версия Drupal 7)

Узловые отношения (только Drupal 6)

Соответствующие ссылки на узлы (стабильная версия Drupal 7)

Соответствующие ссылки на сущности (Drupal 7 dev release)

Content Dependency (стабильная версия Drupal 7)

tim.plunkett
источник
Соответствующие ссылки на узлы прекрасно работают для меня, и как только CER станет стабильным, я переключусь на это.
4

Для Drupal 6 лучшим вариантом, вероятно, является модуль NodeReferrer . Для Drupal 7, Relation отвечает всем требованиям, но еще не готов.

Пьер Буйль
источник
Я всегда использую модуль NodeReferrer, для чего он стоит
electblake
1
Модуль связи теперь готов, с июля 12 года
ted.strauss
Да, отношения, кажется, довольно мощный вариант. В противном случае, CER также является хорошим облегченным вариантом.
Шивамс
4

Если вы используете Drupal 7 / Views, вы можете построить «обратные» отношения, чтобы получить список узлов, которые ссылаются на данный узел (или, возможно, пользователей, которые ссылаются на данный узел). Проверьте патч в этом выпуске: http://drupal.org/node/1043260

По моему мнению, если вам не нужны явные, предварительно построенные обратные отношения, хранящиеся в базе данных (иногда это может быть полезно по соображениям производительности), использование одного из других решений является излишним. Вы всегда можете посмотреть отношения в своем собственном запросе SQL, если вам нужно ...

[Редактировать: с момента первоначального написания этого поста патч в вышеприведенном выпуске был зафиксирован в References for D7 и должен быть предпочтительным способом обратной ссылки (прекрасно работает, когда просто нужны списки узлов или пользователей, ссылающихся на определенный другой узел или пользователя) .]

[Редактировать 2: Если вы используете Entity Reference, похоже, что предпочтительным решением является использование соответствующих ссылок на сущности , а также имеется менее широко используемая синхронизация полей с ссылками на сущности .]

geerlingguy
источник
Похоже, References станет устаревшей в пользу Entity Reference. Не уверен, где это оставляет этот ответ.
Джей
1
Ссылки будут оставаться в памяти до тех пор, пока D7 не станет отдаленной памятью ... но если вы используете ER, вы можете использовать соответствующие ссылки на сущности, чтобы сделать то же самое, что и ссылки, предоставляемые из коробки.
geerlingguy
3

В Drupal 7 (который вы указали) кажется, что решение состоит в том, чтобы использовать Справочный модуль сущностей в сочетании с модулем (Поля синхронизации) справочных полей (Entity), который добавляет необходимые функциональные возможности для синхронизации отношений.

То же самое может быть достигнуто с помощью модуля References Module с модулем cnr - это решение работает (в настоящее время я использую его на одном сайте Drupal 7), но оно устарело / устарело в пользу первого решения, которое я дал.

Все остальные решения, упомянутые в приведенных выше ответах, относятся только к Drupal 6 (за исключением Relation, который потенциально может стать отличным модулем, но сейчас, на самом деле, ничего особенного и много проблем).

Моше Эшель
источник
Голосую за этот ответ, потому что он недавно, и Моше является старшим членом сообщества Drupal. В принятом ответе единственным стабильным модулем D7 является CNR, и это амортизируется в пользу CER (у которого пока нет стабильного выпуска).
Андрей
1
Отношения не имели много проблем даже в марте. И Моше Вишель drupal.org/user/168876 ! = Моше Вейцман drupal.org/user/23 (посмотрите на этот uid ...) кстати.
@chx Я сам был удивлен, увидев меня в качестве старшего участника ... Я пытаюсь стать лучшим участником, но я не думаю, что когда-нибудь поднимусь до уровня Первоначального Моше. Что касается модуля «Отношения», я основал его на обратной связи от кого-то из знающих (я не буду называть имен) - у меня не было возможности действительно протестировать его в то время, и я опирался на это мнение. В настоящее время я работаю над проектом D7 - я думаю, что он мне нужен, поэтому я дам свое обновленное мнение здесь, когда я закончу.
Моше Эшель
2

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

enikola
источник
0

Вы можете использовать модуль Content Dependency .

Он предоставляет вам обратные ссылки через вкладку и поддерживает следующие модули: ссылка на узел / ссылка на сущность .

друпал
источник
1
Не совсем уверен, как это можно использовать для создания взаимных ссылок?
mpdonadio