map_widget.install in Map Widget 8
Install, update and uninstall functions for the map_widget module.
File
map_widget.installView source
<?php
/**
* @file
* Install, update and uninstall functions for the map_widget module.
*/
use Drupal\Core\Entity\Entity\EntityFormDisplay;
/**
* Untangles recursively nested map data.
*/
function map_widget_update_8101() {
$form_displays = \Drupal::entityTypeManager()
->getStorage('entity_form_display')
->loadMultiple(NULL);
$update_definitions = [];
foreach ($form_displays as $display) {
if (!$display instanceof EntityFormDisplay) {
throw new UnexpectedValueException('Loaded display not an instance of EntityFormDisplay');
}
// Map fields are only base fields.
/** @var \Drupal\Core\Field\FieldDefinitionInterface[] $definitions */
$definitions = \Drupal::service('entity_field.manager')
->getBaseFieldDefinitions($display
->getTargetEntityTypeId());
$components = $display
->getComponents();
foreach ($components as $field_name => $component) {
if ($component['type'] === 'map_assoc_widget') {
$update_definitions[] = $definitions[$field_name];
}
}
foreach ($update_definitions as $field_definition) {
$storage = \Drupal::entityTypeManager()
->getStorage($field_definition
->getTargetEntityTypeId());
$field_name = $field_definition
->getName();
$query = $storage
->getQuery();
$affected_ids = $query
->exists($field_name)
->execute();
foreach ($affected_ids as $id) {
$entity = $storage
->load($id);
$munged_maps = $entity
->get($field_name)
->getValue();
$fixed_maps = _map_widget_map_fixer($munged_maps);
$entity
->get($field_name)
->setValue($fixed_maps);
$entity
->save();
}
}
}
}
/**
* Helper function to untangle corrupted maps.
*
* @param array $munged_maps
* The tangled data.
*
* @return array
* The untangled data.
*/
function _map_widget_map_fixer(array $munged_maps) {
$fixed_maps = [];
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($munged_maps), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $key => $value) {
// Check for possible normal entry.
if (is_array($value)) {
if (isset($value['key']) && isset($value['value']) && !isset($fixed_maps[$value['key']])) {
$fixed_maps[$value['key']] = $value['value'];
}
}
else {
// Possible normal entry.
if ($value == 'value' || $key == 'key') {
// Processed at a higher level of the iterator.
continue;
}
if (!isset($fixed_maps[$key])) {
$fixed_maps[$key] = $value;
}
}
}
// If our repair didn't harvest anything, return the original to prevent loss.
return empty($fixed_maps) ? $munged_maps : $fixed_maps;
}
Functions
Name | Description |
---|---|
map_widget_update_8101 | Untangles recursively nested map data. |
_map_widget_map_fixer | Helper function to untangle corrupted maps. |