Drupal 9 image field migration

Зіткнувся із завданням при міграції з 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();"