Задача: Есть два материала назовем один Master а другой Slave. Необходимо, чтобы материал типа Slave был привязан к материалу Master, связь много к одному. (Например есть материал "Альбом" и материал "композиции альбома" или "Тема форума" и "Комментарий к этой теме" ).
Используемы модули:
ссk
computed field
viewfield
views
editview
Последовательность настройки:
1. Создаем тип материала "slave" (cck), для материала "slave" создаем "views", адрес страницы url - "views_slave";
2. Создаем тип материала "master" (cck), для материала "master" создаем "views", адрес страницы url - "views_master";
3. Для материала "Master" (cck) создаем поле "create slave" (ссылка при нажатии на которую будет создаваться "slave"), тип поля - "computed field";
4. Для материала "Master" создаем поле "view reference on slave" для отображения материалов "slave" к этому "master" тип - "view reference";
5. Для материала "slave" создаем поле "pid" для сохранения номера материала "master", тип поля - "computed field";
Вложение | Размер |
---|---|
views_slave.JPG | 61.25 КБ |
arg_views_master.JPG | 43.15 КБ |
master_link_to_create_slave.JPG | 47.46 КБ |
master_view_ref_on_slave.JPG | 39.64 КБ |
set_pid_slave.JPG | 41.62 КБ |
views_master.JPG | 33.66 КБ |
Комментарии
Спасибо! Мне как раз нечто подобное было нужно. Буду пробовать.
romantaran (симпатичный сайтик) - рад был сгодиться. Связь используется практически везде, если есть хотя бы две сущности со связами, обычно это делаеться кодом на уровне модулей, а вот cck открывает новый уровень абстракции для пользователей
А почему не написал про editview?
Я так понял, что если его запречь, то отпадёт необходимость в создании ссылки "create slave", тоесть при отображении вида, в нём же будет отображено несколько полей для заполнения и кнопка "добавить".
У меня правда не заработало - падал апач, но я так понял, у тебя работало?
Да сейчас добавлю вчера сслыки делал drupal.org 3 часа планово "лежал" с 19.00 базу переводили.
edirview используется - он добавляет поле "edit node" в views на рисунке видно, а вот когда apachу поднимешь и будет немного желания и времени посмотри пожалуйста как по поводу "по месту", "на лету", а то я юнга, вот бы ты со своими знаниями подсказал !!
спасибо, прам ответ на мой вопрос
Пойду пробовать
Да, больная тема. Часто для работы с подчиненными данными создание ноды на каждого слейва слишком накладно, но вариантов пока нет. Для задачи, описанной выше, есть модуль Node relativity, с задачей справляется, но для нормальной темизации тоже придется поковыряться с views.
Вот единомышленник - emzi. Ставил nodefamily - связь настраивается визуально - но во views отбор по pid не организуется. Два вопроса к Вам:
1) Может поделитесь описанием для организации и ссылкой на модули, Node relativity в dev версии не глючит ?
2) Как организовать редактирование и создание подчиненого материала в форме влдельца ?
> как по поводу "по месту", "на лету", а то я юнга, вот бы ты со своими знаниями подсказал !!
По месту на лету, это вопросы по AJAX, наверное. Но я в нём не мастак, к сожалению
по п.1 - если есть интерес, описание сделаю, серьезных глюков на текущей версии я пока не наблюдаю. Есть мелочи типа того, что если требуется удалить тип ноды из списка управляемых, то сначала надо поставить все возможные связи в none.
2. для создания дочерних нод в модуле есть спец. блок, для редактирования я использую ссылку "edit" в подчиненном View.
Спасибо, поставлю - настрою, будеть что новое, интересное - поделюсь
Поставил и настроил node relativity, при создании master появился пустой fieldset - "Link operations" и все
а отношения установили в настройках самого модуля?
Да настроил в admin/settings/relativity , скорее всего dev виноват я еще обновлял views - горячая разработка. В принципе меня вполне устраивает (cck), даже скажу больше с этим методом на практике меньше "заворотов" пока было - удобней настраивать и поддерживать.
views не должны влиять, скорее что-то другое
А почему нельзя сделать так: http://drupal.org/node/124446
Вроде проще.
context-sensitive embedded views
Drupal 5.x
If you want to embed a view in a node type, it is quite likely that you will want to make it context sensitive.
For example, I have two node types: project and issue. In each Project node I want to display a list (view) of the Issues associated with that particular Project. So our 'context-node' is a Project and our 'listed-node' is an Issue.
The trick here is really the Argument Handling, but first :
We need a way of associating an Issue with a particular Project.
A simple method is to add a CCK Node-Reference field to issue nodes. In the Node-Reference field configuration:
label the field Projects,
choose the 'Select List' widget, and
set the 'Content types that can be referenced:' to project.
Now would be a good time to create a couple of new Issues and associate them with a Project using the Projects select list.
And we need a View to embed.
Create a View named issue_view.
In the Page fieldgroup: check 'Provide Page View', and select 'List View'.
In the Fields fieldgroup: select 'Node: Title'.
In the Arguments fieldgroup: select 'Node Reference: Projects (field_projects)' and set it to 'Display All Values'.
Embedding the View in the context-node.
In order for the Argument to work as a 'context filter' it needs to receive an argument from the node in which it appears. How we send this argument depends on the method for embedding the view in the node.
For this example we want every Project to include a list of associated Issues, and we don't want users or editors to change this behaviour; so we will hard-wire it into the theme using the node-project.tpl.php. (There are a couple of drawbacks to this method: [1] it only works with PHPtemplate themes and [2] this is custom theming, so if you use more than one theme on your site, you need to create and modify a node-project.tpl.php in each drupal/theme/$yourtheme folder.)
After creating a node-project.tpl.php in our drupal/theme/$ourtheme folder (by renaming a copy of the node.tpl.php), insert the following code chunk wherever we want it to appear:
<?php
// load the context-node's 'metadata'
global $current_view;
// * define the context-node's NID as the argument
$current_view->args[0]=$node->nid;
// * select the name of the view to embed as $view1
$view1 = views_get_view('issue_view');
// * define this section for CSS
print '
// * display a subtitle for the view section
print '
' . t($node->title . ' Issues') . '
';
// send $args to the View's Argument Handler and display $view1 in the context-node
print (views_build_view('embed', $view1, $current_view->args, false, false));
print '
';
?>
>> A simple method is to add a CCK Node-Reference field to issue nodes. In the Node-Reference field configuration:
>> label the field Projects,
>> choose the 'Select List' widget, and
>> set the 'Content types that can be referenced:' to project.
>> Now would be a good time to create a couple of new Issues and associate them with a Project using the Projects select list.
>> And we need a View to embed.
Это значит - добавлять ссылки на slave "вручную" ? Да, не завидую пользователю
А зачем вообще добавлять ссылки на slave?
Можно же определить принадлежность slave к master динамической выборкой.
Для того, чтобы определить динамической выборкой - на до в slave записать ссылку на master, а ссылки на slave написаны в вашем посте.
Может я не понимаю что именно Вам нужно, но основываясь на данном примере я сделал принадлежность типа данных "товар" к типу данных "магазин".
В "товаре" сделал поле CCK Node-Reference, тип "магазин".
Затем с помощью View с предачей аргумента сделал выборку товаров принадлежащих магазину.
И добавил код примера в node-shop.tpl.php.
Теперь на странице каждого магазина есть список его товаров.
Вы пишите - В "товаре" сделал поле CCK Node-Reference, тип "магазин"
Если один товар может принадлежать нескольким магазинам - это хорошее решение, но если "копозиции" могут принадлежать" только одному конкретному "альбому" и при это "альбом" сам является материалом (есть поля), то мое решение сокращает работу по выбору в Вашем примере "магазина", так как поле по которому views делает динамический отбор формируется автоматически ( не надо выбирать "магазин"),. Нажав в "альбоме" - "создать композицию" получает автоматически привязанный материал и ничего для связи в node reference выбирать НЕ НАДО)
Все, дошло. Спасибо большое за полезное руководство и разъяснения.
Всегда пожалуйста, здесь как раз информацией полезной обмениваемся и от этого развиваемся.
Приятно видеть, черт побери, возросший уровень педагогического мастерства.
Перечислены используемые модули, выложены скриншоты и даны ссылки. Понятно, доступно, эффектно.
Вот бы каждому так !!!
sas@drupal.org , спасибо Тебе за помощь в решении моей проблемы. Если бы каждый так подробно писал, было бы здорово!Делать сайт на друпале было бы намного проще:))
Пожалуйста ! Всегда было интересно почему, если кто-то то-то имеет и не отдает - понятно, а вот если знаешь - поделись, и с тобой поделятся Всего знать невозможно, обменялись информацией и "выросли". Все просто - сделаете, что - нибудь - увидите вопрос на форуме, что люди "бьются" - помоги соседу и мир станет лучше и ярче.
Теперь для этих целей есть модуль Node hierarchy
dm66, спасибо, отличный модуль!
Спасибо за модуль!
Последовательность настройки немного не верна. пункт 1 нельзя выполнить раньше чем пункт 5
А как сделать так, чтобы дочерние материалы отображались не сразу при просмотре родительского материала, но чтобы они были доступны по ссылке, например, show slaves ?
Сделать страницу с использованием views и передать номер материала в качестве аргумента.
а в шестом друпале это работает?
Просто даже $node->nid в поле display format игнорирует, пробовал просто $nid - та же история соответственно подчинённый материал создаётся без аргументов.
Что называется "чайник кипит". Пока ничего не выходит. Поставлены последние версии drupal и модули. Может у кого получилось "доразжует" материал? Собственно вопросы-уточнения:
1. Шаг 3. По скрину невидно где есть пробелы, а где нет, причем после $display = стоит какая-то вертикальная палка - это символ или курсор? А вот это node_save($node) - опечатка или нет?
Вобщем такой-ли код:
if (!$node->nid) node_slave($node);
$display = ('Create slave', 'node/add/slave/'.$node->nid);
ниже есть пункт "Store using the database settings below" - надоли там что-то вводить?
2. Шаг 4. Надо-ли ставить галку "Force default"?
Что выбирать в "Allowed views:"?
Надо-ли ставить галку "Use a common default value for all nodes if the user does not override it on the node form."?
3. Шаг 5. Правильный ли код:
$args = explode('/',$_GET['q']);
$node_field[0]['value'] = $args[3];
$display = ('Link to master', 'node/'.$node_field_item['value']);
Какое значение нужно выбрать в "Store using the database settings below" (их там 5)?
При попытки создания материала slave возникает ошибка: Parse error: syntax error, unexpected ',' in Z:\home\proba516\www\sites\all\modules\computed_field\computed_field.module(230) : eval()'d code on line 1
Совершенно непойму, где-то же должно жестко указываться какая конкретно нода slave принадлежит конкретной ноде master (или наоборот)?
На каком шаге используется editview?
Буду признателен за ответы на вопросы, да наверное не только я.
Это рекомендации разработчиков computed field
Да
На момент создания материала - без сохранения хотя бы чего либо не работало, сейчас возможно уже не обязательно. Второй вариант - не создавать поле в материале а добавить ссылку в node.tpl.php
Да.
Это не важно - не используется - так как стоит "Force default"
Это тоже не важно, так как Force default
Да
Проверьте "computed code"
типа int
поле "pid" для сохранения номера материала "master"
В данном примере не используется.
P.S. Ничего не стоит на месте, и "опыт сын ошибок трудных ..." позволил "пройти дальше" по пути настройки и найти более гибкие решения, пока к сожалению не могу все описать в рисунках, но кому очень надо и срочно стучите в ICQ ( см. профиль ) постараюсь помочь
sasdrupal.org не вводите человека в заблуждение!
<?php
if (!$node->nid) node_save($node);
// учимся читать
// http://api.drupal.ru/api/function/l/6
$display = l('Create slave', 'node/add/slave/'.$node->nid);
// и соответственно
$display = l('Link to master', 'node/'.$node_field_item['value']);
?>
Конечно l() правильно поправил, только непонятно нужно ли человеку или нет ?
Мне кажется это не тот сайт, где можно прикалываться. Я обосновал свой "глупый вопрос", а Вы на него ответили неверно, в результате у меня вообще ничего невышло и я чуть было не "забил" на эту тему.
Спасибо, дело сдвинулось с мертвой точки.
Только вот наблюдаю странный глюк - то ноды "slave" по "Link to master" ссылаются на /drupal/node/, а не на master, то вдруг правильно работают. Пробовал node_save($node); и node_slave($node); то оба работают, то не работают. Так что здесь должно стоять?
node_save($node)