You are here

function _content_migrate_get_field_values in Content Construction Kit (CCK) 7.3

Create a D7-style field array from data stored in the D6 content field tables.

Parameters

$field_name: Optionally request only a specific field name.

1 call to _content_migrate_get_field_values()
content_migrate_get_field_values in modules/content_migrate/content_migrate.module
Create a D7-style field array from data stored in the D6 content field tables.

File

modules/content_migrate/includes/content_migrate.values.inc, line 14
content_migrate.values.inc Code to produce D7-style field and instance values from the data in D6 tables. Separated into a separate file for efficiency.

Code

function _content_migrate_get_field_values($field_name = NULL) {
  $field_values =& drupal_static(__FUNCTION__);
  if (!is_array($field_values)) {
    $field_values = array();
  }
  if (empty($field_values) && db_table_exists('content_node_field')) {
    $field_values = array();
    $query = db_select('content_node_field', 'nf', array(
      'fetch' => PDO::FETCH_ASSOC,
    ));
    $node_instance_alias = $query
      ->join('content_node_field_instance', 'ni', 'ni.field_name=nf.field_name');
    $result = $query
      ->fields($node_instance_alias, array(
      'type_name',
      'widget_module',
      'widget_type',
      'widget_settings',
      'display_settings',
    ))
      ->fields('nf')
      ->orderBy('type_name')
      ->execute();
    foreach ($result as $row) {
      $field_value = $row;
      $query2 = db_select('content_node_field_instance', 'nfi', array(
        'fetch' => PDO::FETCH_ASSOC,
      ));
      $result2 = $query2
        ->fields('nfi')
        ->orderBy('type_name')
        ->condition('field_name', $field_value['field_name'])
        ->execute();
      $widget_types = array();
      foreach ($result2 as $row2) {
        $widget_types[] = $row2['widget_type'];
      }
      $widget_types = array_unique($widget_types);
      if (count($widget_types) > 1) {
        $field_value['messages'][] = '<span class="error">' . t("Caution: The '@field' field is a shared field that uses different widgets. The '@widget' widget is sometimes used to determine the destination field type for the new field. The migration may not work correctly if other widgets used by this shared field would create different results.", array(
          '@field' => $field_value['field_name'],
          '@widget' => $row['widget_type'],
        )) . '</span>';
      }

      // Pass instance settings to the field, in case they are needed.
      $instance_value = array(
        'bundle' => $row['type_name'],
        'widget' => array(
          'type' => $row['widget_type'],
          'module' => $row['widget_module'],
          'settings' => unserialize($row['widget_settings']),
        ),
        'display' => array(
          'settings' => unserialize($row['display_settings']),
        ),
      );
      unset($field_value['widget_type'], $field_value['widget_module'], $field_value['widget_settings'], $field_value['display_settings']);

      // All Drupal 6 fields were attached to nodes.
      $field_value['entity_types'] = array();
      if ($field_value['multiple'] == 0) {
        $field_value['cardinality'] = 1;
      }
      elseif ($field_value['multiple'] == 1) {
        $field_value['cardinality'] = FIELD_CARDINALITY_UNLIMITED;
      }
      else {
        $field_value['cardinality'] = $field_value['multiple'];
      }

      // We need column information for the old table.
      $field_value['columns'] = unserialize($field_value['db_columns']);

      // Field settings.
      $default_settings = field_info_field_settings($row['type']);
      $field_value['settings'] = array_merge($default_settings, unserialize($field_value['global_settings']));
      unset($field_value['multiple'], $field_value['global_settings'], $field_value['required'], $field_value['db_columns']);

      // Let modules change these values.
      drupal_alter('content_migrate_field', $field_value, $instance_value);
      unset($field_value['allowed_values_php']);

      // We retain $field_value['columns'] and $field_value['db_storage']
      // even though they are not used or different in D7
      // so we can find the old table information.
      // Add field definiation to $field_values array.
      $field_values[$field_value['field_name']] = $field_value;
    }
  }
  if (!empty($field_name)) {
    return $field_values[$field_name];
  }
  return $field_values;
}