Навеяно долгим пониманием вопроса и следующими материалами.
Настройка подчинённого материала (cck)
context-sensitive embedded views
Отношение “многие к одному” в Drupal, видение и реализация особо не разбирался, но думаю по теме
Insert view + CCK
ЗАДАЧА:
Качаем и включаем. В модуле cck незабудте включить Node Reference.
Теперь нам необходимо создать материалы для отделений и проблем а также назначить им дополнительные поля
Далее по шагам.
- Создаем материал с именем Виды решаемых проблем, в типе указываем
problem_type. - Создаем материал с именем Отделения, в типе указываем otdels.
- Добавляем cck поле с именем node_reference в материал «отделения»
с следующими настойками.Настройки данных:- Ставим галочку на "Множественный выбор" (потому что отделение может
решать несколько проблем) - Ставим галочку на Виды решаемых проблем в типах содержимого, на которые
можно ссылаться.
- Ставим галочку на "Множественный выбор" (потому что отделение может
- Сохраняем настройки.
После того как типы материалов готовы нам необходимо создать список отделений который будет выводится в материале проблемы. Этот список мы будем с вами выводить с помощью вида.
- Создаем вид отделений.
- Называем уникальным именем otdel_views.
- Устанавливаем галочку "Подготовить страничный вид"
- В типах видов выбираем «Список аннотаций»
- В фильтре выбираем наш тип документа "Отделения"
- В арнументах выбираем «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). Так вот как этой штукой пользоваться? И кто разобрался в аргументах? Жду замечаний и критики!
Комментарии
А я бы проблемы загнал в словарь.
Отделениям бы задал термины из этого словаря.
Если нужны подробные материалы о проблемах - так же дополнительно загнал бы "истории" и тоже бы связал с выбранными терминами.
Ну а дальше кастомизировать отображение таксономии и иже с ними.
Если у проблемы есть только название, то скорее всего это - термин из словаря.
Если у нее есть описание, фотография, дедлайн и пр. - это нода.
Везде где только можно нужно пользоваться таксономией, так быстрей получиться.
Термины походят для организации категорий, особенно иерархических структур (например, виды животных). В данном конктексте это может быть срочность или тяжесть проблемы.
Тут проблема возможно будет иметь описание. Хотя пока она имеет только название. Делал так сказать с заделом. Просто аппетит у клиентов приходит во время еды.
>Для этого создаем node-problem_type.tpl.php в который полностью копируем page.tpl.php
Вы наверное имели ввиду копирнуть туда node.tpl.php
Совершенно верно. Спасибо за поправку.
спасибо!
Спасибо, полезно о.О )
По поводу вот этого:
"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] (добавление новой ноды) - это специально, мне так нужно было.
Извините, забыл обьяснить свою задачу.
Мне нужно было сделать кросс референс.
Т.е. ноды типа А могут ссылаться на какую либо ноду типа В.
Таким образом, получается, что у ноды типа В возможно несколько "потомков" (нод типа А)
Ну, а если нужно выбрать ну к примеру самого главного из потомков, то в этом случае мы делаем ссылку в обратном направлении, от В к А, но уже выбор должен быть из тех А, которые ссылаются на данный конкретный В.
пока читал чуть не закипел
Сорри
Не стоит. Просто я сам когда такие штуки начинаю описывать иногда путаюсь
А у меня при вставке вьюхи 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
И с чем это есть?
Модуль Views включен?
Да, включен. хотя ошибка вызывает такое чувство что какого модуля не хватает...
Версия друпала 6?
В ней нету views_build_view()