Conditions | 19 |
Paths | 96 |
Total Lines | 146 |
Code Lines | 69 |
Lines | 0 |
Ratio | 0 % |
Changes | 2 | ||
Bugs | 0 | Features | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
1 | <?php |
||
22 | function df_tools_translation_scenarios_migration_finished(Migration $migration) { |
||
23 | // The Locale module splits its translation functions into separate include |
||
24 | // files, based on utility. |
||
25 | // To ensure that each function we require is available, load its respective |
||
26 | // include file. |
||
27 | \Drupal::moduleHandler()->loadInclude('locale', 'bulk.inc'); |
||
28 | |||
29 | // Initialize variables required to parse migration. |
||
30 | /** @var Drupal\migrate_source_csv\Plugin\migrate\source\CSV $source */ |
||
31 | $source = $migration->getSourcePlugin(); |
||
32 | |||
33 | /** @var Drupal\migrate_source_csv\CSVFileObject $iterator */ |
||
34 | $iterator = $source->initializeIterator(); |
||
35 | $filename = $iterator->getPath() . '/' . $iterator->getFilename(); |
||
36 | |||
37 | /** @var \Drupal\migrate\Plugin\migrate\destination\EntityContentBase $destination_plugin */ |
||
38 | $destination_plugin = $migration->getDestinationPlugin(); |
||
39 | $entity_type = explode(':', $destination_plugin->getPluginId())[1]; |
||
40 | $storage = \Drupal::entityTypeManager()->getStorage($entity_type); |
||
41 | |||
42 | // Determine the ID required to lookup entities in this migration. |
||
43 | $id_map = []; |
||
44 | $ids = array_keys($source->getIds()); |
||
45 | $processes = $migration->getProcess(); |
||
46 | |||
47 | // Prefer UUIDs to other fields. |
||
48 | if (in_array('UUID', $ids, TRUE)) { |
||
49 | $id_map = ['uuid', 'UUID']; |
||
50 | } |
||
51 | else { |
||
52 | foreach ($processes as $field => $process) { |
||
53 | if (isset($process[0]['source']) && $process[0]['source'] == $ids[0]) { |
||
54 | $id_map = [$field, $ids[0]]; |
||
55 | break; |
||
56 | } |
||
57 | } |
||
58 | } |
||
59 | |||
60 | // Get a list of all currently installed languages. |
||
61 | $languageManager = \Drupal::languageManager(); |
||
62 | // We only care about langcodes. |
||
63 | $langcodes = array_keys($languageManager->getLanguages()); |
||
64 | |||
65 | // Create a migrate executable, which we use later to set row values. |
||
66 | if (function_exists('drush_log')) { |
||
67 | $log = new DrushLogMigrateMessage(); |
||
68 | } |
||
69 | else { |
||
70 | $log = new MigrateMessage(); |
||
71 | } |
||
72 | |||
73 | $executable = new MigrateExecutable($migration, $log); |
||
74 | |||
75 | // Process translations for each langcode. |
||
76 | foreach ($langcodes as $langcode) { |
||
77 | $new_filename = str_replace('.csv', ".$langcode.csv", $filename); |
||
78 | |||
79 | if (file_exists($new_filename)) { |
||
80 | $file = df_tools_translation_initialize_csv($new_filename); |
||
81 | $count = $file->count(); |
||
82 | $file->rewind(); |
||
83 | $iterator->rewind(); |
||
84 | |||
85 | // Update translations for each Entity. |
||
86 | for ($i = 0; $i < $count; ++$i) { |
||
87 | // Get the current row. |
||
88 | $source_row = $iterator->current(); |
||
89 | $row = new Row($file->current(), $source->getIds()); |
||
|
|||
90 | |||
91 | // Search for the Entity based on its identifier. |
||
92 | $field = $id_map[0]; |
||
93 | |||
94 | // We use the source file here as a UUID is not always used, and field |
||
95 | // values (title) may be translated into different languages. |
||
96 | $value = $source_row[$id_map[1]]; |
||
97 | $ids = \Drupal::entityQuery($entity_type) |
||
98 | ->condition($field, $value) |
||
99 | ->execute(); |
||
100 | |||
101 | // If a migration failed the Entity won't exist, check for that. |
||
102 | if (empty($ids)) { |
||
103 | continue; |
||
104 | } |
||
105 | |||
106 | // Load the Entity, so we can grab field values and add a translation. |
||
107 | $id = reset($ids); |
||
108 | |||
109 | /** @var Drupal\Core\Entity\ContentEntityBase $entity */ |
||
110 | $entity = $storage->load($id); |
||
111 | |||
112 | if (!$entity->hasTranslation($langcode)) { |
||
113 | $entity_values = $entity->toArray(); |
||
114 | $translation = $entity->addTranslation($langcode, $entity_values); |
||
115 | } |
||
116 | else { |
||
117 | $translation = $entity->getTranslation($langcode); |
||
118 | } |
||
119 | |||
120 | // Properly set the content translation metadata, if applicable. |
||
121 | if ($translation->hasField('content_translation_source')) { |
||
122 | /** @var \Drupal\content_translation\ContentTranslationManager $manager */ |
||
123 | $manager = \Drupal::service('content_translation.manager'); |
||
124 | $manager->getTranslationMetadata($translation) |
||
125 | ->setSource($entity->language()->getId()); |
||
126 | } |
||
127 | |||
128 | // Collect a list of process plugins that either have no source, or |
||
129 | // have a source that our translated CSV also has. |
||
130 | $process_plugins = []; |
||
131 | |||
132 | foreach ($migration->getProcess() as $field_name => $process) { |
||
133 | $untranslatable = ['uuid', 'type', 'path']; |
||
134 | |||
135 | if (!in_array($field_name, $untranslatable)) { |
||
136 | if (!isset($process[0]['source']) || $row->hasSourceProperty($process[0]['source'])) { |
||
137 | $process_plugins[$field_name] = $process; |
||
138 | } |
||
139 | } |
||
140 | } |
||
141 | // Process the row, then use its destination values as field values |
||
142 | // for our translation. |
||
143 | $executable->processRow($row, $process_plugins); |
||
144 | |||
145 | foreach ($row->getDestination() as $field_name => $values) { |
||
146 | $field = $translation->$field_name; |
||
147 | |||
148 | if ($field instanceof TypedDataInterface) { |
||
149 | $field->setValue($values); |
||
150 | } |
||
151 | } |
||
152 | |||
153 | // Save the translation. |
||
154 | if ($translation instanceof RevisionLogInterface) { |
||
155 | $translation->setRevisionLogMessage(NULL); |
||
156 | } |
||
157 | |||
158 | $translation->save(); |
||
159 | |||
160 | // Move to the next row. |
||
161 | $file->next(); |
||
162 | $iterator->next(); |
||
163 | } |
||
164 | } |
||
165 | } |
||
166 | |||
167 | locale_translate_delete_translation_files(); |
||
168 | } |
||
170 |