
Зіткнувся із завданням при міграції з 7го на 8й (9) Drupal. Міграція проводилася стандартним модулем upgrade з адмінки. Завдання полягала у тому, щоб перенести всі зображення з поля image використання модулем media.
Знайшлося рішення через hook_update.
Для початку, перевіряємо, чи можливо картинка вже є в базі з минулих запусків або з інших причин.
$medias_thumb = \Drupal::entityTypeManager()
->getStorage('media')
->loadByProperties([
'bundle' => [$convert['media_bundle']],
'name' => $node->{$old_field}->entity->label()]
);
if (!empty($medias_thumb)) {
$new_field = $convert['new_node_image_field'];
$node->{$new_field}->entity = reset($medias_thumb);
$node->save();
\Drupal::logger('image_to_media')->notice(
sprintf('Reuse IMAGE_THUMB for node "%s".', $node->getTitle())
);
}
Якщо картинки немає в базі, вантажимо її, створюємо копію в новому полі.
if (!empty($medias)) {
$media = reset($medias);
$file_id = $media->field_media_image->target_id;
$file = File::load($file_id);
$new_field = $convert['new_node_image_field'];
$node->{$new_field}->entity = _mymodule_create_media_image_entity(
$convert['media_bundle'],
$file,
$node->{$old_field}->alt
);
$node->save();
$media_ids_remove[] = $media->id();
\Drupal::logger('image_to_media')->notice(
sprintf('Reuse media for node "%s".', $node->getTitle())
);
}
Повна версія скрипта доступна за посиланням https://gist.github.com/onesixromcom/d8be7e86c25821aea30a6fb5f380ddf2
Для запуску цього хука через драш можна використати команду:
drush php-eval "module_load_install('mymodule_custom'); mymodule_custom_update_8801();"