migrate_filedepot.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. // Migreeri D7 filedepot failid D11-sse.
  3. // 1. file_managed kirjed private://filedepot/...
  4. // 2. seo filedepot_files -> filedepot_folder node filedepot_folder_file välja
  5. // 3. uri_scheme temporary -> private
  6. use Drupal\Core\Database\Database;
  7. use Drupal\field\Entity\FieldStorageConfig;
  8. $src = Database::getConnection('default', 'migrate');
  9. $dst = Database::getConnection();
  10. // 1. file_managed: migreeri private://filedepot/... kirjed.
  11. // D7 fid -> D11 uus fid (migratsioon ei toonud private faile üle).
  12. $src_files = $src->query(
  13. "SELECT fid, uid, filename, uri, filemime, filesize, status, timestamp
  14. FROM {file_managed} WHERE uri LIKE 'private://filedepot/%'"
  15. )->fetchAllAssoc('fid');
  16. $fid_map = []; // D7 fid -> D11 fid
  17. $dst->query('START TRANSACTION');
  18. try {
  19. foreach ($src_files as $fid => $f) {
  20. // Kontrolli, kas sama uri juba olemas.
  21. $existing = $dst->select('file_managed', 'fm')
  22. ->fields('fm', ['fid'])
  23. ->condition('uri', $f->uri)
  24. ->execute()->fetchField();
  25. if ($existing) {
  26. $fid_map[$fid] = $existing;
  27. continue;
  28. }
  29. $new_fid = $dst->insert('file_managed')
  30. ->fields([
  31. 'uuid' => \Drupal::service('uuid')->generate(),
  32. 'langcode' => 'und',
  33. 'uid' => $f->uid ?: 1,
  34. 'filename' => $f->filename,
  35. 'uri' => $f->uri,
  36. 'filemime' => $f->filemime,
  37. 'filesize' => $f->filesize,
  38. 'status' => $f->status,
  39. 'created' => $f->timestamp,
  40. 'changed' => $f->timestamp,
  41. ])
  42. ->execute();
  43. $fid_map[$fid] = $new_fid;
  44. }
  45. $dst->query('COMMIT');
  46. echo "file_managed: " . count($fid_map) . " kirjet\n";
  47. } catch (\Exception $e) {
  48. $dst->query('ROLLBACK');
  49. echo "ERROR: " . $e->getMessage() . "\n";
  50. return;
  51. }
  52. // 3. uri_scheme temporary -> private (TEE ENNE inserti, muidu save() taastab tabeli).
  53. $storage = FieldStorageConfig::loadByName('node', 'filedepot_folder_file');
  54. if ($storage) {
  55. $storage->setSetting('uri_scheme', 'private');
  56. $storage->save();
  57. echo "uri_scheme -> private\n";
  58. }
  59. // 2. filedepot_files -> filedepot_folder node (cid -> nid -> node).
  60. // cid kaudu: filedepot_categories.cid -> nid = filedepot_folder node.
  61. $cat_nid = [];
  62. foreach ($src->query("SELECT cid, nid FROM {filedepot_categories}") as $r) {
  63. $cat_nid[$r->cid] = $r->nid;
  64. }
  65. $src_fd = $src->query(
  66. "SELECT fid, cid, drupal_fid, fname, title, description, fileorder
  67. FROM {filedepot_files} WHERE status = 1"
  68. );
  69. $count = 0;
  70. $delta_map = []; // nid -> järgmine delta
  71. foreach ($src_fd as $f) {
  72. $cid = (int) $f->cid;
  73. if (!isset($cat_nid[$cid])) continue;
  74. $nid = $cat_nid[$cid];
  75. $drupal_fid = (int) $f->drupal_fid;
  76. if (!isset($fid_map[$drupal_fid])) continue;
  77. $new_fid = $fid_map[$drupal_fid];
  78. // delta: monotoonne loendur node kohta (fileorder võib korduda).
  79. if (!isset($delta_map[$nid])) $delta_map[$nid] = 0;
  80. $delta = $delta_map[$nid]++;
  81. $dst->insert('node__filedepot_folder_file')
  82. ->fields([
  83. 'bundle' => 'filedepot_folder',
  84. 'deleted' => 0,
  85. 'entity_id' => $nid,
  86. 'revision_id' => $nid,
  87. 'langcode' => 'und',
  88. 'delta' => $delta,
  89. 'filedepot_folder_file_target_id' => $new_fid,
  90. 'filedepot_folder_file_display' => 1,
  91. 'filedepot_folder_file_description' => (string) $f->description,
  92. ])
  93. ->execute();
  94. // file_usage kirje (FileReferenceResolver vajab seda allalaadimisõiguseks).
  95. $exists = $dst->select('file_usage', 'fu')
  96. ->fields('fu', ['fid'])
  97. ->condition('fid', $new_fid)
  98. ->condition('module', 'file')
  99. ->condition('type', 'node')
  100. ->condition('id', $nid)
  101. ->execute()->fetchField();
  102. if (!$exists) {
  103. $dst->insert('file_usage')
  104. ->fields([
  105. 'fid' => $new_fid,
  106. 'module' => 'file',
  107. 'type' => 'node',
  108. 'id' => (string) $nid,
  109. 'count' => 1,
  110. ])
  111. ->execute();
  112. }
  113. $count++;
  114. }
  115. echo "filedepot_folder_file: $count kirjet\n";
  116. echo "done\n";