Convert fields and instances to config.
function field_update_8003() {
$uuid = new Uuid();
$state = Drupal::state();
$deleted_fields = $state
->get('field.field.deleted') ?: array();
$deleted_instances = $state
->get('field.instance.deleted') ?: array();
$field_data = array();
// Migrate field definitions.
$records = db_query("SELECT * FROM {field_config}")
->fetchAll(PDO::FETCH_ASSOC);
foreach ($records as $record) {
$record['data'] = unserialize($record['data']);
$config = array(
'id' => $record['field_name'],
'uuid' => $uuid
->generate(),
'type' => $record['type'],
'module' => $record['module'],
'active' => $record['active'],
'settings' => $record['data']['settings'],
'storage' => array(
'type' => $record['storage_type'],
'module' => $record['storage_module'],
'active' => $record['storage_active'],
'settings' => $record['data']['storage']['settings'],
),
'locked' => $record['locked'],
'cardinality' => $record['cardinality'],
'translatable' => $record['translatable'],
'entity_types' => $record['data']['entity_types'],
'indexes' => $record['data']['indexes'] ?: array(),
'status' => 1,
'langcode' => 'und',
);
// Reassign all list.module fields to be controlled by options.module.
if ($config['module'] == 'list') {
$config['module'] = 'options';
}
// Save in either config or state.
if (!$record['deleted']) {
Drupal::config('field.field.' . $config['id'])
->setData($config)
->save();
}
else {
$config['deleted'] = TRUE;
$deleted_fields[$config['uuid']] = $config;
// Additionally, rename the data tables for deleted fields. Technically
// this would belong in an update in field_sql_storage.module, but it is
// easier to do it now, when the old numeric ID is available.
if ($config['storage']['type'] == 'field_sql_storage') {
$field = new Field($config);
$tables = array(
"field_deleted_data_{$record['id']}" => _field_sql_storage_tablename($field),
"field_deleted_revision_{$record['id']}" => _field_sql_storage_revision_tablename($field),
);
foreach ($tables as $table_old => $table_new) {
if (db_table_exists($table_old)) {
db_rename_table($table_old, $table_new);
}
}
}
}
// Store the UUID and field type, they will be used when processing
// instances.
$field_data[$record['id']] = array(
'uuid' => $config['uuid'],
'type' => $record['type'],
);
}
// Migrate instance definitions.
$records = db_query("SELECT * FROM {field_config_instance}")
->fetchAll(PDO::FETCH_ASSOC);
foreach ($records as $record) {
$record['data'] = unserialize($record['data']);
$config = array(
'id' => $record['entity_type'] . '.' . $record['bundle'] . '.' . $record['field_name'],
'uuid' => $uuid
->generate(),
'field_uuid' => $field_data[$record['field_id']]['uuid'],
'field_type' => $field_data[$record['field_id']]['type'],
'entity_type' => $record['entity_type'],
'bundle' => $record['bundle'],
'label' => $record['data']['label'],
'description' => $record['data']['description'],
'required' => $record['data']['required'],
'default_value' => isset($record['data']['default_value']) ? $record['data']['default_value'] : array(),
'default_value_function' => isset($record['data']['default_value_function']) ? $record['data']['default_value_function'] : '',
'settings' => $record['data']['settings'],
'status' => 1,
'langcode' => 'und',
);
// Save in either config or state.
if (!$record['deleted']) {
Drupal::config('field.instance.' . $config['id'])
->setData($config)
->save();
}
else {
$config['deleted'] = TRUE;
$deleted_instances[$config['uuid']] = $config;
}
// Update {file_usage} table in case this instance has a default image.
if (!empty($config['settings']['default_image'])) {
db_update('file_usage')
->fields(array(
'id' => $config['field_uuid'],
))
->condition('type', 'default_image')
->condition('module', 'image')
->condition('id', $record['field_id'])
->condition('fid', $config['settings']['default_image'])
->execute();
}
}
// Save the deleted fields and instances in state.
$state
->set('field.field.deleted', $deleted_fields);
$state
->set('field.instance.deleted', $deleted_instances);
}