связь "многие к многим" пример реализации.

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

Аватар пользователя player player 20 февраля 2008 в 18:04

Навеяно долгим пониманием вопроса и следующими материалами.
Настройка подчинённого материала (cck)
context-sensitive embedded views
Отношение “многие к одному” в Drupal, видение и реализация особо не разбирался, но думаю по теме
Insert view + CCK

ЗАДАЧА:

В клинике есть отделения. Каждое отделение решает ряд проблем со здоровьем. Но! Одну и ту же проблему, можно решить в разных отделениях. Выходит связь многие ко многим. Для удобства необходимо чтобы пользователь указывая свою проблему видел какие отделения её решают. То есть на странице материала типа "Виды решаемых проблем" необходимо вывести список отделений которые эту проблему смогут решить, и соответственно на странице отделений должны быть решаемые проблемы.

РЕШЕНИЕ:

Для решения этой проблемы нам понадобятся модули

Качаем и включаем. В модуле cck незабудте включить Node Reference.

Теперь нам необходимо создать материалы для отделений и проблем а также назначить им дополнительные поля
Далее по шагам.

  1. Создаем материал с именем Виды решаемых проблем, в типе указываем
    problem_type.
  2. Создаем материал с именем Отделения, в типе указываем otdels.
  3. Добавляем cck поле с именем node_reference в материал «отделения»
    с следующими настойками.Настройки данных:
    • Ставим галочку на "Множественный выбор" (потому что отделение может
      решать несколько проблем)
    • Ставим галочку на Виды решаемых проблем в типах содержимого, на которые
      можно ссылаться.
  4. Сохраняем настройки.

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

  1. Создаем вид отделений.
  2. Называем уникальным именем otdel_views.
  3. Устанавливаем галочку "Подготовить страничный вид"
  4. В типах видов выбираем «Список аннотаций»
  5. В фильтре выбираем наш тип документа "Отделения"
  6. В арнументах выбираем «Node Reference: Виды решаемых проблем (field_probl_resh)» у устанавливаем «отобразить все значения»

многие к многим
А теперь самое интересное. Для того чтобы наш вид выводился на странице видов решаемых проблем нам нужно перегрузить (переопределить) вывод материала. Для этого создаем node-problem_type.tpl.php в который полностью копируем node.tpl.php

И добавляем туда следующий код
// Загружаем метаданные ноды
global $current_view;
// обьявляем NID содерзашей контент ноды как аргумент
$current_view->args[0]=$node->nid;
// получаем наш вид
$view1 = views_get_view('otdel_views');
print '

';
// посылаем $args в заголовок аргумента вида и выводим $view1 в материал
print (views_build_view('embed', $view1, $current_view->args, false, false));
print '

';
?>

Если есть модуль Content Templates, то код можно прамо в материал встроить, но я не пробовал.

P.S.
Сразу вопрос знатокам. Я где то видел что Natalie писала что-то про аргументы которые можно использовать как-то в настройках Node Reference -> Advanced - Nodes that can be referenced (View). Так вот как этой штукой пользоваться? И кто разобрался в аргументах? Жду замечаний и критики!

Комментарии

Аватар пользователя Идиот Идиот (не проверено) 20 февраля 2008 в 20:59

А я бы проблемы загнал в словарь.
Отделениям бы задал термины из этого словаря.

Если нужны подробные материалы о проблемах - так же дополнительно загнал бы "истории" и тоже бы связал с выбранными терминами.

Ну а дальше кастомизировать отображение таксономии и иже с ними.

Аватар пользователя seaji seaji 20 февраля 2008 в 23:09

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

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

Аватар пользователя Natalie Natalie 20 февраля 2008 в 23:39

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

Аватар пользователя player player 21 февраля 2008 в 0:31

Тут проблема возможно будет иметь описание. Хотя пока она имеет только название. Делал так сказать с заделом. Просто аппетит у клиентов приходит во время еды.

Аватар пользователя Toshka Toshka 4 мая 2008 в 0:36

>Для этого создаем node-problem_type.tpl.php в который полностью копируем page.tpl.php
Вы наверное имели ввиду копирнуть туда node.tpl.php

Аватар пользователя seaji seaji 26 мая 2008 в 15:53

По поводу вот этого:
"Node Reference -> Advanced - Nodes that can be referenced (View)"
В настоящий момент это поле не воспринимает токены. Хотя в планах у них стоит добавление этой функциональности.
С токенами было бы проще, в качестве референсного вида можно было бы указать что то типа my_view/[nid]
где [nid] это и есть токен для ID ноды. Но это не работает (сам проверял).
Вместо этого аргументы приходится доставать функцией arg() прям в самом виде, в поле "Argument Handling Code".

То есть поле, которое должно обрабатывать аргументы, само (так сказать) добывает для себя аргументы, а потом перерабатывает.
Вот как я делал (поле "Argument Handling Code"):
<?php
if (!$args[0]) {
if ((arg(0)=='node')&&(is_numeric(arg(1)))&&(arg(2)=='edit')) {
$args[0] = arg(1);
}
else { $args[0]= 1; }
}
return $args;
?>
Т.е. если мы находимся на странице вида node/[nid]/edit (редактируем ноду), то заполучаем ID этой ноды как аргумент для передачи виду, который выбирает другие ноды, которые имеют отсылку к этой ноде через поле Node Reference.
Заметьте, что здесь нет варианта node/add/[node_type] (добавление новой ноды) - это специально, мне так нужно было.

Аватар пользователя seaji seaji 26 мая 2008 в 16:04

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

Аватар пользователя Barcelona Barcelona 7 октября 2008 в 13:22

А у меня при вставке вьюхи node.tpl.php выдаёт ошибку: Fatal error: Call to undefined function: views_build_view() in z:\home\tryboprovod\www\themes\salamander\node-chermet_node_type.tpl.php on line 22

И с чем это есть?

Аватар пользователя faraon faraon 8 января 2009 в 23:55

"Barcelona" wrote:
А у меня при вставке вьюхи node.tpl.php выдаёт ошибку: Fatal error: Call to undefined function: views_build_view() in z:\home\tryboprovod\www\themes\salamander\node-chermet_node_type.tpl.php on line 22

И с чем это есть?


Версия друпала 6?
В ней нету views_build_view()