You are here

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