function field_update_8003

Convert fields and instances to config.

Related topics

File

drupal/core/modules/field/field.install, line 243
Install, update, and uninstall functions for the Field module.

Code

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);
}