Вы здесь

Как автоматически заполнить поля сущности при автосоздании её в виджете autocomplete?

2

При добавлении к сущности А поля "Ссылка на сущность Б" и использовании виджета "Автодополнение" можно выбрать опцию "Создать связанные сущности если они еще не существуют". При этом если пользователь наберет в поле текст, не являющийся меткой уже имеющейся сущности Б, то таковая будет автоматически создана, пустая как барабан, с одной лишь меткой/тайтлом. Мне нужно при создании этой сущности автоматически заполнить еще пару полей на базе значений полей сущности А. Всё это должно происходить за кадром, без формы (пользователь тут права голоса не имеет) поэтому замечательный prepopulate не подходит.
Вопрос: если вдруг существует какой-нибудь волшебный модуль, который может это сделать, буду премного благодарен за наводку, а если нет, подскажите пожалуйста какой хук можно использовать? Повторюсь, что при создании сущности Б мне нужны поля сущности А, из которой запущено автосоздание Б.

Версия Drupal: 
8.x
Категория: 
Entity API
Вопрос задан 22.01.2017 - 18:50

Ответы

1

Если верить некоторым сайтам, D8 также есть два хука

function hook_entity_presave(EntityInterface $entity)
function hook_node_presave(EntityInterface $node)

$current_node = \Drupal::routeMatch()->getParameter('node');

в hook_entity_presave сперва наперво нужно смотреть bundle потому, какая сущность не очевидно.

Если есть зависимость заполнения полей именно в том, что сущность создана в "Автодополнение" и никак иначе, то можно поискать по коду этого модуля строку '->save();' или 'invoke', может быть он реализует подобный хук перед условно $entity->save();

Ответ дан 23.01.2017 - 03:02

Спасибо, изучу!

можно поискать по коду этого модуля строку '->save();' или 'invoke',

Проблема лишь в том, что "этот модуль" теперь называется Core, так что искать придется долго :)
Но ничего, кто ищет, тот найдет ;)

Комментарий оставлен 23.01.2017 - 09:39

PS Кажется нашел:
/core/modules/node/src/Plugin/EntityReferenceSelection/NodeSelection.php
Такой маленький файл, а в нём и оба бага, которые не дают мне жить *), и, похоже, место для вставки нужного мне кода.
Дело за малым: выучить PHP ;)
* сопутствующие баги:
https://www.drupal.org/node/2845144
https://www.drupal.org/node/2845138

Комментарий оставлен 23.01.2017 - 09:59

В общем, спустя два месяца вернулся к этой теме и опять обломался.
Важная деталь, о которой я умолчал: всё это происходит при СОЗДАНИИ сущности А. То есть пользователь добавляет ноду типа "Здание" и вводит его адрес, город (ER поле), страну (ER поле), архитектора (ER поле). Если такого города и такого архитектора еще нет в базе, то они создаются друпалом автоматически, но мне надо и к той и к другой записи добавить кое-что из еще несохраненной сущности А, в частности страну. hook_node_presave прекрасно отрабатывает, а вот routeMatch()->getParameter('node'); возвращает пустоту ибо мы находимся на страничке /node/add/artefact - нет там еще никакого id...
А ведь где-то в памяти совсем рядом загружен еще несохраненный текущий объект А - как бы добраться до него?

Комментарий оставлен 01.04.2017 - 14:01

Решил проблему ;) Поставил hook_node_presave на первичную сущность А, оттуда нахожу по референсам и гружу свежеавтосозданные ноды и заполняю в них всё, что мне нужно. Сам не пойму как сразу не догадался.

Комментарий оставлен 01.04.2017 - 17:58
-1

Возможно Rules в этом поможет ?

Ответ дан 25.01.2017 - 14:43
Аватар пользователя Denis
Denis
58

Denis, спасибо - мне уже как-то советовали Rules для решения какой-то другой локальной проблемки, тогда я забоялся из такой гаубицы палить по моим воробьям, но критическая масса воробьев, похоже, скоро будет набрана ;)

Комментарий оставлен 25.01.2017 - 19:51