Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
173 / 173
100.00% covered (success)
100.00%
7 / 7
CRAP
n/a
0 / 0
name_post_update_create_name_list_format
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
3
name_post_update_formatter_settings
100.00% covered (success)
100.00%
27 / 27
100.00% covered (success)
100.00%
1 / 1
7
name_post_update_formatter_settings_link_and_external_sources
100.00% covered (success)
100.00%
31 / 31
100.00% covered (success)
100.00%
1 / 1
9
name_post_update_field_settings_merge
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
3
name_post_update_field_settings_remove_inline_css
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
1 / 1
4
name_post_update_add_wrapper_type_to_name_widget
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
7
name_post_update_add_autocomplete_match_settings
100.00% covered (success)
100.00%
33 / 33
100.00% covered (success)
100.00%
1 / 1
8
1<?php
2
3/**
4 * @file
5 * Post update functions for Name.
6 */
7
8declare(strict_types=1);
9
10/**
11 * Adds the default list format.
12 */
13function name_post_update_create_name_list_format() {
14  /** @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface $name_list_format_storage */
15  $name_list_format_storage = \Drupal::entityTypeManager()->getStorage('name_list_format');
16
17  $default_list = $name_list_format_storage->load('default');
18  if ($default_list) {
19    if (!$default_list->locked) {
20      $default_list->locked = TRUE;
21      $default_list->save();
22      $message = t('Default name list format was set to locked.');
23    }
24    else {
25      $message = t('Nothing required to action.');
26    }
27  }
28  else {
29    $name_list_format = $name_list_format_storage->create([
30      'id' => 'default',
31      'label' => 'Default',
32      'locked' => TRUE,
33      'status' => TRUE,
34      'delimiter' => ', ',
35      'and' => 'text',
36      'delimiter_precedes_last' => 'never',
37      'el_al_min' => 3,
38      'el_al_first' => 1,
39    ]);
40    $name_list_format->save();
41    $message = t('Default name list format was added.');
42  }
43
44  return $message;
45}
46
47/**
48 * Corrects the field formatter settings for new name list type settings.
49 */
50function name_post_update_formatter_settings() {
51  $field_storage_configs = \Drupal::entityTypeManager()
52    ->getStorage('field_storage_config')
53    ->loadByProperties(['type' => 'name']);
54  $default_settings = [
55    "format" => "default",
56    "markup" => FALSE,
57    "output" => "default",
58    "list_format" => "default",
59  ];
60
61  foreach ($field_storage_configs as $field_storage) {
62    $field_name = $field_storage->getName();
63    $fields = \Drupal::entityTypeManager()
64      ->getStorage('field_config')
65      ->loadByProperties(['field_name' => $field_name]);
66    foreach ($fields as $field) {
67      $properties = [
68        'targetEntityType' => $field->getTargetEntityTypeId(),
69        'bundle' => $field->getTargetBundle(),
70      ];
71      $view_displays = \Drupal::entityTypeManager()
72        ->getStorage('entity_view_display')
73        ->loadByProperties($properties);
74      foreach ($view_displays as $view_display) {
75        if ($component = $view_display->getComponent($field_name)) {
76          $settings = (array) $component['settings'];
77          $settings['list_format'] = isset($settings['multiple']) && $settings['multiple'] == 'default' ? '' : 'default';
78          $settings = array_intersect_key($settings, $default_settings);
79          $settings += $default_settings;
80          $view_display->setComponent($field_name, [
81            'type' => 'name_default',
82            'settings' => $settings,
83          ] + $component)->save();
84        }
85      }
86    }
87  }
88
89  return t('New name list formatter settings are implemented. Please review any name display settings that used inline lists.');
90}
91
92/**
93 * Updates the field formatter settings.
94 *
95 * Adds new link and alternative data sources settings.
96 */
97function name_post_update_formatter_settings_link_and_external_sources() {
98  $new_settings = [
99    "format" => "default",
100    "markup" => "none",
101    "list_format" => "",
102    "link_target" => "",
103    "preferred_field_reference" => "",
104    "preferred_field_reference_separator" => ", ",
105    "alternative_field_reference" => "",
106    "alternative_field_reference_separator" => ", ",
107  ];
108  $field_storage_configs = \Drupal::entityTypeManager()
109    ->getStorage('field_storage_config')
110    ->loadByProperties(['type' => 'name']);
111  foreach ($field_storage_configs as $field_storage) {
112    $field_name = $field_storage->getName();
113    $fields = \Drupal::entityTypeManager()
114      ->getStorage('field_config')
115      ->loadByProperties(['field_name' => $field_name]);
116    foreach ($fields as $field) {
117      $properties = [
118        'targetEntityType' => $field->getTargetEntityTypeId(),
119        'bundle' => $field->getTargetBundle(),
120      ];
121      $view_displays = \Drupal::entityTypeManager()
122        ->getStorage('entity_view_display')
123        ->loadByProperties($properties);
124      foreach ($view_displays as $view_display) {
125        /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $view_display */
126        if ($component = $view_display->getComponent($field_name)) {
127          $settings = (array) $component['settings'];
128          $markup_needs_migration = (
129            empty($settings['markup']) || $settings['markup'] == '1'
130          );
131          if ($markup_needs_migration) {
132            $settings['markup'] = empty($settings['markup']) ? 'none' : 'simple';
133          }
134          if (isset($settings['output'])) {
135            unset($settings['output']);
136          }
137          $settings += $new_settings;
138          $view_display->setComponent($field_name, [
139            'type' => 'name_default',
140            'settings' => $settings,
141          ] + $component)->save();
142        }
143      }
144    }
145  }
146}
147
148/**
149 * Merges the custom field and storage settings together.
150 */
151function name_post_update_field_settings_merge() {
152  $merged_fields = [
153    'components',
154    'minimum_components',
155    'max_length',
156    'labels',
157    'allow_family_or_given',
158    'autocomplete_source',
159    'autocomplete_separator',
160    'title_options',
161    'generational_options',
162    'sort_options',
163  ];
164  $merged_fields = array_combine($merged_fields, $merged_fields);
165
166  $field_storage_configs = \Drupal::entityTypeManager()
167    ->getStorage('field_storage_config')
168    ->loadByProperties(['type' => 'name']);
169  foreach ($field_storage_configs as $field_storage) {
170    /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
171    $storage_settings = $field_storage->getSettings();
172    $merged_settings = array_intersect_key($storage_settings, $merged_fields);
173    $field_name = $field_storage->getName();
174    $fields = \Drupal::entityTypeManager()
175      ->getStorage('field_config')
176      ->loadByProperties(['field_name' => $field_name]);
177    foreach ($fields as $field) {
178      /** @var \Drupal\field\Entity\FieldConfig $field */
179      $field_settings = $field->getSettings();
180      $field_settings += $merged_settings;
181      $field->setSettings($field_settings)->save();
182    }
183    $storage_settings = array_diff_key($storage_settings, $merged_fields);
184    $field_storage->setSettings($storage_settings)->save();
185  }
186}
187
188/**
189 * Removes the inline CSS settings and sets the widget layout.
190 */
191function name_post_update_field_settings_remove_inline_css() {
192  $field_storage_configs = \Drupal::entityTypeManager()
193    ->getStorage('field_storage_config')
194    ->loadByProperties(['type' => 'name']);
195  foreach ($field_storage_configs as $field_storage) {
196    /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
197    $field_name = $field_storage->getName();
198    $fields = \Drupal::entityTypeManager()
199      ->getStorage('field_config')
200      ->loadByProperties(['field_name' => $field_name]);
201    foreach ($fields as $field) {
202      /** @var \Drupal\field\Entity\FieldConfig $field */
203      $field_settings = $field->getSettings();
204      unset($field_settings['inline_css']);
205      unset($field_settings['component_css']);
206      if (empty($field_settings['widget_layout'])) {
207        $field_settings['widget_layout'] = 'stacked';
208      }
209      $field->setSettings($field_settings)->save();
210    }
211  }
212
213  \Drupal::service('config.factory')->getEditable('name.settings')
214    ->clear('element_wrapper')
215    ->clear('inline_styles')
216    ->clear('inline_styles_rtl')
217    ->save();
218}
219
220/**
221 * Sets missing Name widget wrapper settings to container.
222 */
223function name_post_update_add_wrapper_type_to_name_widget() {
224  $config_storage = \Drupal::service('config.storage');
225  $config_factory = \Drupal::service('config.factory');
226  $updated_count = 0;
227
228  foreach ($config_storage->listAll('core.entity_form_display.') as $config_name) {
229    $display_config = $config_factory->getEditable($config_name);
230    $content = (array) $display_config->get('content');
231    $changed = FALSE;
232    foreach ($content as $field_name => $component) {
233      if (($component['type'] ?? '') !== 'name_default') {
234        continue;
235      }
236      $settings = (array) ($component['settings'] ?? []);
237      $wrapper_type_is_missing = (
238        !isset($settings['wrapper_type']) || $settings['wrapper_type'] === ''
239      );
240      if ($wrapper_type_is_missing) {
241        $settings['wrapper_type'] = 'container';
242        $component['settings'] = $settings;
243        $content[$field_name] = $component;
244        $changed = TRUE;
245      }
246    }
247    if ($changed) {
248      $display_config->set('content', $content)->save();
249      $updated_count += 1;
250    }
251  }
252
253  return t('Updated @count form displays with name wrapper settings.', [
254    '@count' => $updated_count,
255  ]);
256}
257
258/**
259 * Adds autocomplete match settings to legacy Name field configurations.
260 */
261function name_post_update_add_autocomplete_match_settings() {
262  $components = [
263    'title',
264    'given',
265    'middle',
266    'family',
267    'generational',
268    'credentials',
269  ];
270  $default_overrides = array_fill_keys($components, '');
271  $updated_count = 0;
272
273  $field_storage_configs = \Drupal::entityTypeManager()
274    ->getStorage('field_storage_config')
275    ->loadByProperties(['type' => 'name']);
276
277  foreach ($field_storage_configs as $field_storage) {
278    /** @var \Drupal\field\Entity\FieldStorageConfig $field_storage */
279    $field_name = $field_storage->getName();
280    $fields = \Drupal::entityTypeManager()
281      ->getStorage('field_config')
282      ->loadByProperties(['field_name' => $field_name]);
283
284    foreach ($fields as $field) {
285      /** @var \Drupal\field\Entity\FieldConfig $field */
286      $settings = $field->getSettings();
287      $changed = FALSE;
288
289      if (!array_key_exists('autocomplete_match', $settings)) {
290        $settings['autocomplete_match'] = 'starts_with';
291        $changed = TRUE;
292      }
293
294      $overrides = $settings['autocomplete_match_overrides'] ?? [];
295      if (!is_array($overrides)) {
296        $overrides = [];
297      }
298      $merged_overrides = $overrides + $default_overrides;
299      $overrides_need_update = (
300        !array_key_exists('autocomplete_match_overrides', $settings)
301        || $merged_overrides !== $overrides
302      );
303      if ($overrides_need_update) {
304        $settings['autocomplete_match_overrides'] = $merged_overrides;
305        $changed = TRUE;
306      }
307
308      if ($changed) {
309        $field->setSettings($settings)->save();
310        $updated_count += 1;
311      }
312    }
313  }
314
315  return t('Updated @count name fields with autocomplete match settings.', [
316    '@count' => $updated_count,
317  ]);
318}