Второй мануал на тему «Создания связи родитель-ребенок средствами Node Reference для Drupal 7»

Включите следующие модули:

  • views, views ui
  • viewfield
  • computed_field
  • token
  • references

Создайте 2 типа нод. Ноды с машинным именем master будут родителями, а ноды slave — детьми.

Теперь необходимо создать связь типа node reference. На страничке admin/structure/types/manage/slave/fields добавляем поле с меткой Родитель, именем field_parent и типа Node Reference и пусть оно будет, например, в виде списка.

На странице настройки данного поля, укажем, что оно должно ссылаться на ноды типа master. Поле настроено.

Теперь для нод типа master необходимо создать поле, которое на страничке нод такого типа будет выводить ссылку вида node/add/slave/15, где 15 — номер самой открытой ноды-родителя. Для этого на страничке правки перечня полей материала типа master (admin/structure/types/manage/master/fields) создадим поле типа computed field с метой Кнопка создания и именем field_create_slave.

На странице настройки созданного поля важным является только одно — Display Code (PHP). Содержание, которое полу-программным способом формируется в нем, будет выведено на страничке материала данного типа. Нам надо, чтобы была выведена ссылка. Ссылки в друпале создаются при помощи функции l(), которой в качестве первого параметра передается текст ссылки, а качестве второго — путь. Кроме того, нам потребуется использовать объект $entity, в котором хранятся все данные ноды (т.е. открытой ноды типа master).

В поле Display format вводим следующий код (будьте аккуратны с кавычками):

$display_output = l('Создать slave', 'node/add/slave/'. $entity->nid);

Галочку Store using the database settings below (required for Views use) можно снять, т.к. мы не используем такую функциональность данного поля.

Теперь ради тестирования создайте ноду типа master и посмотрите на получившуюся ссылку на страничке просмотра данной ноды. При создании такой ноды достаточно заполнить только ее заголовок. Обратите внимание, что в пути ссылки Создать slave присутствует номер текущей ноды.

Теперь попробуйте перейти по ссылке Создать slave и в открывшейся форме поищите поле Родитель. Оно заполнилось автоматически? Нет. А все потому, что, чтобы оно заполнилось, необходимо «научить» форму подставлять данные из адресной строки (т.е. аргумент) в это поле родителя.

Т.к. «обучать» мы будем форму создания материала типа slave, откройте страничку правки полей этого типа материала (admin/structure/types/manage/slave/fields).

«Обучение» состоит в необходимости исполнения определенного PHP-кода, который в ходе выполнения произведет заполнение необходимого поля. Такое можно реализовать при помощи поля типа Computed field, используя другие его возможности (не те, которые были использованы при создании ссылки).

Заметьте, это другое поле типа Computed field (не то, которым сделали ссылку), оно никак не связано с полем Кнопка создания и вообще находится в другом типе материала.

Итак, создавайте поле с меткой Автосвязывание, именем field_parenter и типа computed fieldslave !!).

На странице настройки поля, необходимо заполнить поле Computed Code. В него надо записать PHP код, который будет действовать только на страничке добавления материала типа slave и будет производить только 1 действие: извлекать из текущей адресной строки номер ноды-родителя и подставлять ее в поле Родитель.

Особенности работы полей типа Computed field заключается в том, что код, записанный в Computed Code, отработает только в момент сохранения ноды, а не в момент открытия формы. Вы запомните это, я ниже по тексту покажу как это видно в реале.

Итак, в поле Computed Code загоняем следующий код:

$path = arg(0) .'/'. arg(1);
if ($path == 'node/add' && is_numeric(arg(3))) {
$entity->field_parent[LANGUAGE_NONE][0]['nid'] = intval(arg(3));
}
$entity_field[0]['value'] = '';

Значения поля Display Code (PHP) менять не надо. Галочку Store using the database settings below (required for Views use) надо снять, т.к. мы опять ничего не храним в БД.

Давайте испытаем. Создайте ноду типа parent и перейдите по ссылке Создать slave в ней. Открылась форма создания ребенка. Введите заголовок и прокрутите вниз до поля Родитель. Как видите, оно не заполнилось. Как так? Ведь мы писали код в поле Автосвязывание?

Помните я писал про особенность работы computed field, что оно отработает только после сохранения ноды? Вот. Оставьте в поле Родитель значение none и сохраните ноду-ребенка.

Готово.

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

Для начала создадим вьюху, которую потом занесем в поле. На страничке admin/structure/views/add в качестве названия вьюхи укажите children_slaves_of_parent и в кчестве типа укажите Node, т.к. мы будет выбирать ноды (типа slave).

Во вьюхе добавляем поле (Fields) под названием Content: Title, в форме правки поля указываем галочкой Link this field to the original piece of content. В качестве стиля (Format) выбираем Table.

Теперь добавим аргумент, который будет передаваться данной вьюхе средствами viewfield. В графе Contextual filters добавьте новый аргумент типа Content: Родитель (field_parent)

Больше в аргументе ничего настраивать не надо.

СОХРАНЯЕМ ВЬЮХУ.

Теперь для master добавим поле типа viewfield. Пусть метка будет Дети, название field_children. Тип, разумеется, Views.

На страничке настройки поля нам надо настроить только 2 графы в свитке Default value: Дети и Arguments. В поле дети выберите из списка всех вьюх, ту, которая называется children_slaves_of_parent — Master.

В поле Arguments укажите [node:nid].

Кроме того установите галочку Always use default value.

Сохраняйте. И открывайте любую ноду типа master, к которому вы создавали детей.

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

Для этого необходимо изменить код поля Кнопка создания ноды типа master на такой (в Display Code):

$display_output = l('Создать slave', 'node/add/slave/'. $entity->nid, array('query' => 'destination=node/'. $ entity->nid));

Сохраняйте и попробуйте снова пройти по ссылке создания ребенка и сохранить его. Должно перекинуть на родителя.

Drupal 7

Категория: Drupal

Оставьте свой комментарий