function viewsreference_update_8103 in Views Reference Field 8.2
Migrate title and argument columns to the new data field.
File
- ./
viewsreference.install, line 34 - Install, update and uninstall functions for the viewsreference module.
Code
function viewsreference_update_8103() {
// Retrieve list of all viewsreference fields mapped by entity type.
$entity_field_manager = \Drupal::service('entity_field.manager');
$field_map = $entity_field_manager
->getFieldMapByFieldType('viewsreference');
foreach ($field_map as $entity_type_id => $fields) {
foreach ($fields as $field_name => $field) {
// Store the table data since we need to whipe the table to install the
// schema updates.
$database = \Drupal::database();
$tables = [
"{$entity_type_id}__{$field_name}",
"{$entity_type_id}_revision__{$field_name}",
];
$existing_data = [];
foreach ($tables as $table) {
// Get the old data.
$existing_data[$table] = $database
->select($table)
->fields($table)
->execute()
->fetchAll(PDO::FETCH_ASSOC);
// Wipe it.
$database
->truncate($table)
->execute();
}
// Install the schema updates.
$manager = \Drupal::entityDefinitionUpdateManager();
$manager
->updateFieldStorageDefinition($manager
->getFieldStorageDefinition($field_name, $entity_type_id));
// Restore and serialize the data.
foreach ($tables as $table) {
// Unset removed title/argument fields.
$table_fields = end($existing_data[$table]);
unset($table_fields[$field_name . '_title'], $table_fields[$field_name . '_argument']);
if (!empty($table_fields) && is_array($table_fields)) {
$insert_query = $database
->insert($table)
->fields(array_keys($table_fields));
foreach ($existing_data[$table] as $row) {
// Create new data field with serialized data and remove separate
// title/argument values.
$row[$field_name . '_data'] = serialize([
'title' => $row[$field_name . '_title'],
'argument' => $row[$field_name . '_argument'],
]);
unset($row[$field_name . '_title'], $row[$field_name . '_argument']);
$insert_query
->values(array_values($row));
}
$insert_query
->execute();
}
}
// Update field definition settings to enable the title/argument plugins.
foreach ($field['bundles'] as $bundle) {
$bundle_fields = $entity_field_manager
->getFieldDefinitions($entity_type_id, $bundle);
/** @var \Drupal\core\Field\FieldConfigInterface $field_definition */
$field_definition = $bundle_fields[$field_name];
$settings = $field_definition
->getSettings();
$settings['enabled_settings'] = [
'argument' => 'argument',
'offset' => 0,
'limit' => 0,
'pager' => 0,
'title' => 'title',
];
$field_definition
->setSettings($settings);
$field_definition
->save();
}
}
}
}