Клонирование сущностей в hook_entity_presave()

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

Аватар пользователя marassa marassa 11 февраля 2021 в 17:58

Прошу совета у более опытных товарищей.
Что нужно: загружать по несколько картинок одним махом.
Почему сложно: каждая картинка хранится в отдельной ноде (специальный тип материала), вместе с ней хранятся всевозможные ее атрибуты - теги, дата съемки из EXIFа, копирайт, ссылка(и) на объект(ы), к которым относится картинка и т.п. Если бы делал сейчас, наверное попробовал бы сделать картинку не нодой, а медиа-сущностью, но уж сделано как сделано - что ж теперь об этом.
Все найденные мною модули пакетной загрузки картинок фактически загружают множество значений в одно многозначное поле типа Image в одной и той же ноде, ну или работают с Media. А мне надо при загрузке N картинок создать N нод, у которых одинаковым будет только поле ссылки на объект(здание), со страницы которого вызвана форма добавления картинок.
Что планирую сделать:
1. В hook_entity_form_display_alter при создании ноды типа картинка выставить элементу формы, ответственному за загрузку картинки, '#multiple' => TRUE , чтобы можно было выбрать и загрузить несколько картинок (чисто в форме, в бд у ноды по-прежнему ограничение на одну картинку).
2. В hook_entity_presave, если картинок загружено более одной, в цикле склонировать текущую ноду, положив в каждый клон по одной картинке. То есть на момент сохранения вместо одной ноды с множеством картинок получится много нод, в каждой по одной картинке.
Получится?

Комментарии

Аватар пользователя marassa marassa 24 марта 2021 в 7:48

В общем, как сделал:
С пунктом 1 не получилось. Как ни пытался обманом заставить Друпал позволить в форме вводить много значений для поля, определенного как однозначное - не получилось. Ну да бог с ним - оказывается в storage settings для поля можно запросто менять количество допустимых значений с 1 на N и обратно, при этом ничего нигде не ломается. Поставил цыфру 24 (практически от балды, для моего случая хватает).
В hook_node_presave (который уже был) добавил следующий код:

  if ($entity->bundle() == 'pictures') {
    // explode multiple image values into multiple picture nodes
    while (count($entity->field_picture) > 1) {
      $clone = $entity->createDuplicate();
      while (count($clone->field_picture) > 1) {
        $clone->field_picture->removeItem(1);
      }
      $clone->save();
      $entity->field_picture->removeItem(0);
    }
  }

Теперь юзер при создании ноды pictures может загрузить в нее N картинок, а при сохранении ноды создаётся N нод, в каждой по одной картинке.