Настройка подчиненного материала (cck)

Аватар пользователя sas@drupal.org sas@drupal.org 23 мая 2007 в 21:14

Задача: Есть два материала назовем один 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.JPG61.25 КБ
Иконка изображения arg_views_master.JPG43.15 КБ
Иконка изображения master_link_to_create_slave.JPG47.46 КБ
Иконка изображения master_view_ref_on_slave.JPG39.64 КБ
Иконка изображения set_pid_slave.JPG41.62 КБ
Иконка изображения views_master.JPG33.66 КБ
0 Thanks

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 24 мая 2007 в 10:12

romantaran (симпатичный сайтик) - рад был сгодиться. Связь используется практически везде, если есть хотя бы две сущности со связами, обычно это делаеться кодом на уровне модулей, а вот cck открывает новый уровень абстракции для пользователей :)

Аватар пользователя Dan Dan 24 мая 2007 в 8:33

А почему не написал про editview?
Я так понял, что если его запречь, то отпадёт необходимость в создании ссылки "create slave", тоесть при отображении вида, в нём же будет отображено несколько полей для заполнения и кнопка "добавить".
У меня правда не заработало - падал апач, но я так понял, у тебя работало?

Аватар пользователя sas@drupal.org sas@drupal.org 24 мая 2007 в 10:04

Да сейчас добавлю вчера сслыки делал drupal.org 3 часа планово "лежал" с 19.00 базу переводили.
edirview используется - он добавляет поле "edit node" в views на рисунке видно, а вот когда apachу поднимешь и будет немного желания и времени посмотри пожалуйста как по поводу "по месту", "на лету", а то я юнга, вот бы ты со своими знаниями подсказал !!

Аватар пользователя emzi emzi 24 мая 2007 в 10:27

Да, больная тема. Часто для работы с подчиненными данными создание ноды на каждого слейва слишком накладно, но вариантов пока нет. Для задачи, описанной выше, есть модуль Node relativity, с задачей справляется, но для нормальной темизации тоже придется поковыряться с views.

Аватар пользователя sas@drupal.org sas@drupal.org 24 мая 2007 в 11:15

Вот единомышленник - emzi. Ставил nodefamily - связь настраивается визуально - но во views отбор по pid не организуется. Два вопроса к Вам:
1) Может поделитесь описанием для организации и ссылкой на модули, Node relativity в dev версии не глючит ?
2) Как организовать редактирование и создание подчиненого материала в форме влдельца ?

Аватар пользователя Dan Dan 24 мая 2007 в 10:38

> как по поводу "по месту", "на лету", а то я юнга, вот бы ты со своими знаниями подсказал !!
По месту на лету, это вопросы по AJAX, наверное. Но я в нём не мастак, к сожалению :(

Аватар пользователя emzi emzi 24 мая 2007 в 12:32

по п.1 - если есть интерес, описание сделаю, серьезных глюков на текущей версии я пока не наблюдаю. Есть мелочи типа того, что если требуется удалить тип ноды из списка управляемых, то сначала надо поставить все возможные связи в none.
2. для создания дочерних нод в модуле есть спец. блок, для редактирования я использую ссылку "edit" в подчиненном View.

Аватар пользователя sas@drupal.org sas@drupal.org 24 мая 2007 в 16:43

Да настроил в admin/settings/relativity , скорее всего dev виноват я еще обновлял views - горячая разработка. В принципе меня вполне устраивает (cck), даже скажу больше с этим методом на практике меньше "заворотов" пока было - удобней настраивать и поддерживать.

Аватар пользователя Dimm Dimm 25 мая 2007 в 10:20

А почему нельзя сделать так: 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 '';
?>

Аватар пользователя sas@drupal.org sas@drupal.org 25 мая 2007 в 10:52

>> 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 "вручную" ? Да, не завидую пользователю :)

Аватар пользователя Dimm Dimm 25 мая 2007 в 16:08

А зачем вообще добавлять ссылки на slave?
Можно же определить принадлежность slave к master динамической выборкой.

Аватар пользователя sas@drupal.org sas@drupal.org 25 мая 2007 в 16:32

Для того, чтобы определить динамической выборкой - на до в slave записать ссылку на master, а ссылки на slave написаны в вашем посте.

Аватар пользователя Dimm Dimm 25 мая 2007 в 17:05

Может я не понимаю что именно Вам нужно, но основываясь на данном примере я сделал принадлежность типа данных "товар" к типу данных "магазин".
В "товаре" сделал поле CCK Node-Reference, тип "магазин".
Затем с помощью View с предачей аргумента сделал выборку товаров принадлежащих магазину.
И добавил код примера в node-shop.tpl.php.
Теперь на странице каждого магазина есть список его товаров.

Аватар пользователя sas@drupal.org sas@drupal.org 25 мая 2007 в 20:02

Вы пишите - В "товаре" сделал поле CCK Node-Reference, тип "магазин"
Если один товар может принадлежать нескольким магазинам - это хорошее решение, но если "копозиции" могут принадлежать" только одному конкретному "альбому" и при это "альбом" сам является материалом (есть поля), то мое решение сокращает работу по выбору в Вашем примере "магазина", так как поле по которому views делает динамический отбор формируется автоматически ( не надо выбирать "магазин"),. Нажав в "альбоме" - "создать композицию" получает автоматически привязанный материал и ничего для связи в node reference выбирать НЕ НАДО)

Аватар пользователя Dimm Dimm 25 мая 2007 в 21:27

Все, дошло. Спасибо большое за полезное руководство и разъяснения.

Аватар пользователя sas@drupal.org sas@drupal.org 26 мая 2007 в 11:07

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

Аватар пользователя Atl Atl 26 мая 2007 в 19:59

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

Вот бы каждому так !!!

Аватар пользователя gorr gorr 27 мая 2007 в 18:29

sas@drupal.org , спасибо Тебе за помощь в решении моей проблемы. Если бы каждый так подробно писал, было бы здорово!Делать сайт на друпале было бы намного проще:))

Аватар пользователя sas@drupal.org sas@drupal.org 27 мая 2007 в 18:36

Пожалуйста ! Всегда было интересно почему, если кто-то то-то имеет и не отдает - понятно, а вот если знаешь - поделись, и с тобой поделятся :) Всего знать невозможно, обменялись информацией и "выросли". Все просто - сделаете, что - нибудь - увидите вопрос на форуме, что люди "бьются" - помоги соседу и мир станет лучше и ярче.

Аватар пользователя player player 4 мая 2008 в 16:48

Последовательность настройки немного не верна. пункт 1 нельзя выполнить раньше чем пункт 5

Аватар пользователя rashaverak rashaverak 26 августа 2008 в 11:05

А как сделать так, чтобы дочерние материалы отображались не сразу при просмотре родительского материала, но чтобы они были доступны по ссылке, например, show slaves ?

Аватар пользователя sas@drupal.org sas@drupal.org 31 августа 2008 в 22:54

Сделать страницу с использованием views и передать номер материала в качестве аргумента.

Аватар пользователя quaser quaser 31 октября 2008 в 12:34

а в шестом друпале это работает?
Просто даже $node->nid в поле display format игнорирует, пробовал просто $nid - та же история соответственно подчинённый материал создаётся без аргументов.

Аватар пользователя Serg_M Serg_M 11 марта 2009 в 7:44

Что называется "чайник кипит". Пока ничего не выходит. Поставлены последние версии 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?

Буду признателен за ответы на вопросы, да наверное не только я.

Аватар пользователя sas@drupal.org sas@drupal.org 12 марта 2009 в 21:54
"Serg_M" wrote:

if (!$node->nid) node_slave($node);

Это рекомендации разработчиков computed field

"Serg_M" wrote:

$display = ('Create slave', 'node/add/slave/'.$node->nid);

Да

"Serg_M" wrote:

ниже есть пункт "Store using the database settings below" - надоли там что-то вводить?

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

"Serg_M" wrote:

Надо-ли ставить галку "Force default"?

Да.

"Serg_M" wrote:

Что выбирать в "Allowed views:"?

Это не важно - не используется - так как стоит "Force default"

"Serg_M" wrote:

Надо-ли ставить галку "Use a common default value for all nodes if the user does not override it on the node form."?

Это тоже не важно, так как Force default

"Serg_M" wrote:

$args = explode('/',$_GET['q']);
$node_field[0]['value'] = $args[3];
$display = ('Link to master', 'node/'.$node_field_item['value']);

Да

"Serg_M" wrote:

При попытки создания материала 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

Проверьте "computed code"

"Serg_M" wrote:

Какое значение нужно выбрать в "Store using the database settings below" (их там 5)?

типа int

"Serg_M" wrote:

Совершенно непойму, где-то же должно жестко указываться какая конкретно нода slave принадлежит конкретной ноде master (или наоборот)?

поле "pid" для сохранения номера материала "master"

"Serg_M" wrote:

На каком шаге используется editview?

В данном примере не используется.

P.S. Ничего не стоит на месте, и "опыт сын ошибок трудных ..." позволил "пройти дальше" по пути настройки и найти более гибкие решения, пока к сожалению не могу все описать в рисунках, но кому очень надо и срочно стучите в ICQ ( см. профиль ) постараюсь помочь :)

Аватар пользователя andypost@drupal.org andypost@drupal.org 19 марта 2009 в 14:17

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']);
?>

Аватар пользователя Serg_M Serg_M 21 марта 2009 в 9:11
"<a href="mailto:sas@drupal.org">sas@drupal.org</a>" wrote:

Конечно l() правильно поправил, только непонятно нужно ли человеку или нет ? :)

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

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

sasdrupal.org не вводите человека в заблуждение!

Спасибо, дело сдвинулось с мертвой точки.

Только вот наблюдаю странный глюк - то ноды "slave" по "Link to master" ссылаются на /drupal/node/, а не на master, то вдруг правильно работают. Пробовал node_save($node); и node_slave($node); то оба работают, то не работают. Так что здесь должно стоять?

Аватар пользователя sas@drupal.org sas@drupal.org 20 марта 2009 в 22:18
"Serg_M" wrote:

Пробовал node_save($node); и node_slave($node); то оба работают, то не работают. Так что здесь должно стоять?

node_save($node)