Node Reference - Drupal Commerce - Автоматическое создание связи.

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

Аватар пользователя microproger microproger 15 декабря 2014 в 16:25

На первом этапе хочу поделиться с общественностью хорошим примером, предложенным в свое время Жилиным: http://www.drupal.ru/username/zhylik
Сейчас уже как 3 года не заходит на сайт. Верю, что у него все ок.

Есть модуль References, который, кстати, в Друпале8 уже в ядре, но разговор сейчас про DRUPAL7.

Итак, вводная:

- 2 типа материала, например, для упрощения: Курица (koko) и Яйцо (ags).

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

1. Заходим на страницу "Курица"
2. Жмем ссылку "Снести яйцо"
3. Попадаем на страницу создания ноды "Яйцо", заполняем в обычном режиме не заботясь о связях и обратных ссылках. Жмем сохранить. В итоге получаем ноду "Яйцо" с уже настроенной ссылкой Node Reference на "Курицу", указанную в п. 1.

Подозреваю и верю, что это можно делать разными способами - Rules, программно или еще как - сам механизм всегда можно изменить без ущерба для структуры, т.к. в итоге получаем только правильно настроенную ссылку.

КАК ЭТО РЕАЛИЗУЕТСЯ:

1. К Курице привязывается поле Computed Field
Правим только раздел

Display Code (PHP):

____________________________________

$display_output = l('Снести Яйцо', 'node/add/ags/'. $entity->nid);
____________________________________

(Не забываем снять галку о хранении инфо в БД - не храним данные)

Настраиваем отображение этого поля как unsanitized

После настройки заходим на страницу курицы (koko) NID, например, 5678

Из режима просмотра ноды жмем кнопку "Снести яйцо", получаем форму создания ноды "Яйцо":

www.mysite.ru/node/add/ags/5678

где последние 4 цифры - это как раз NID Курицы.

2. В ноде Яйца создаем 2 поля: непосредственно Node Referense, в настройках которого разрешаем ссылаться на тип материала "Курица" и

Поле Computed Field, Которое из текущего URL вытащит NID Курицы и вставит его в Node Reference.

D этом поле Computed Field, так всегда убираем галочку хранения в бд и правим раздел:

Computed Code (PHP)
________________________________

$path = arg(0) .'/'. arg(1);

if ($path == 'node/add' && is_numeric(arg(3))) {

$entity->field_koko[LANGUAGE_NONE][0]['nid'] = intval(arg(3));

}

$entity_field[0]['value'] = '';

____________________________________

Где field_koko - то самое поле Node Reference.

Все работает. Отображение данных о яйцах на ноде курицы и наоборот - уже дело техники, здесь не обсуждается.

!!!!!!!!!!!!!!!!!!!!!!!
ЭТО БЫЛ РЕЦЕПТ!!! Далее не читайте если у Вас: нездоровые нервы, нет времени, финансовый кризис.

Есть модуль DRUPAL COMMERCE
Товар в этом модуле состоит из двух сущностей, если можно так сказать
1. - стандартный тип материала "отображение товара" - для него вышеуказанный рецепт работает (node/add/ и все остальные действия, как в примере)
2. - "Товар", который добавляется по ссылке mysite.ru/admin/commerce/products/add/tops/ Это те самые вариации товара.

Если повторять пример с курицами и яйцами, то создать ссылку типа mysite.ru/admin/commerce/products/add/aggs/7789 - Получается.
"Товар" создается, но поле Node Reference никак не хочет автозаполняться по NID из URL.

Подозреваю, что это потому, что код

________________________________

$path = arg(0) .'/'. arg(1);

if ($path == 'node/add' && is_numeric(arg(3))) {

$entity->field_koko[LANGUAGE_NONE][0]['nid'] = intval(arg(3));

}

$entity_field[0]['value'] = '';

____________________________________

только для сущности типа "NODE"

Если кто поможет поправить его для товара DRUPAL COMMERCE, который добавляется через
mysite.ru/admin/commerce/products/add/aggs
mysite.ru/admin/commerce/products/add/aggs/7789

- СПАСИБО ОГРОМНОЕ

Комментарии

Аватар пользователя microproger microproger 15 декабря 2014 в 16:40

Последний код выглядит так:
__________________________________
$path = arg(0) .'/'. arg(1);

if ($path == 'admin/commerce/products/add' && is_numeric(arg(3))) {

$entity->field_koko[LANGUAGE_NONE][0]['nid'] = intval(arg(3));

}

$entity_field[0]['value'] = '';
________________________________________

Аватар пользователя Niklan Niklan 15 декабря 2014 в 17:00

Прочитал первые пару строк, бегло так. Скажу сразу - нету смысла так делать из-за Node reference,
Не надо путать модуль с entity reference - он будет в ядре 8-ки, а node reference не будет в ядре, так что имеет смысл сразу же гайд (если я правильно понял) обновить под это дело.

Аватар пользователя qsoul qsoul 15 декабря 2014 в 17:47

1) В тип материала добавить поле entity reference "курица"
2) Устанавлиеваем Field default token.
3) В настройке "стандартного значени" появится Token for default value. Туда ставим токен[current-page:url:args:last].
4) В странице курици ставим кнопку-ссылку типа node/add/egg/5 (де 5 - nid курицы).

У меня есть такая же связка, только "проект - задача". Все работает по такому вот принципу.

Аватар пользователя qsoul qsoul 15 декабря 2014 в 18:38

"dreamsforsale" wrote:
Ругается что нет такого токена
[current-page:url:args:last]

У вас там под всеми полями, куда можно вводить токены должна быть ссылка типа "see avaliable tokens"

Аватар пользователя microproger microproger 15 декабря 2014 в 19:36

Все решилось проще с помощью

Entityreference
Entityreference prepopulate
Entity Reference Prepopulate Token
+ создание ссылки с NID

qsoul,Niklan - Респект Вам, товарисчи!

Аватар пользователя leagnus leagnus 26 июля 2015 в 20:23

Т.е. при создании/добавлении товара можно автоматически привязать его к определённому Display Product?
Напр., с пом. поля в товаре наподобие "Default Display: ...".

Хочется создавать / добавлять товары отдельно от их "Витрины" (карточки товара), чтобы у них было поле "карточка товара по умолчанию: такая-то". Но ноды-то типа дисплей – конкретные инстансы, – всё равно нужно как-то их автоматически создавать.