function _content_migrate_get_instance_values in Content Construction Kit (CCK) 7.3
Create a D7-style instance array from data stored in the D6 content field tables.
Parameters
$bundle: Optionally request only instances of a specific bundle.
$field_name: Optionally request only instances of a specific field_name.
1 call to _content_migrate_get_instance_values()
- content_migrate_get_instance_values in modules/
content_migrate/ content_migrate.module - Create a D7-style instance array from data stored in the D6 content field tables.
File
- modules/
content_migrate/ includes/ content_migrate.values.inc, line 112 - 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_instance_values($bundle = NULL, $field_name = NULL) {
$instance_values =& drupal_static(__FUNCTION__);
if (empty($instance_values) && db_table_exists('content_node_field_instance')) {
$allowed_fields = field_info_field_types();
$allowed_widgets = field_info_widget_types();
$allowed_formatters = field_info_formatter_types();
$instance_values = array();
$query = db_select('content_node_field_instance', 'ni', array(
'fetch' => PDO::FETCH_ASSOC,
));
$node_field_alias = $query
->join('content_node_field', 'nf', 'ni.field_name=nf.field_name');
$result = $query
->fields('ni')
->fields($node_field_alias, array(
'type',
'module',
'required',
'global_settings',
))
->orderBy('label', 'ASC')
->execute();
foreach ($result as $row) {
$instance_value = $row;
$instance_value['messages'] = array();
// Pass field settings to the instance, in case they are needed.
$field_value = array(
'require' => $instance_value['required'],
'type' => $instance_value['type'],
'module' => $instance_value['module'],
'settings' => unserialize($instance_value['global_settings']),
);
unset($instance_value['type'], $instance_value['module'], $instance_value['global_settings']);
// All Drupal 6 instances were attached to nodes.
$instance_value['entity_type'] = 'node';
// Unserialize arrays.
foreach (array(
'widget_settings',
'display_settings',
'global_settings',
) as $key) {
$instance_value[$key] = !empty($instance_value[$key]) ? (array) unserialize($instance_value[$key]) : array();
}
// Build instance values.
$instance_value['bundle'] = $instance_value['type_name'];
$instance_value['default_value'] = !empty($instance_value['widget_settings']['default_value']) ? $instance_value['widget_settings']['default_value'] : '';
// Core does not support this, but retain it so
// another module can do something with it
// in drupal_alter.
if (isset($instance_value['widget_settings']['default_value_php'])) {
$instance_value['widget']['settings']['default_value_php'] = $instance_value['widget_settings']['default_value_php'];
}
// Build widget values.
$instance_value['widget'] = array();
// TODO Some widget types have been renamed in D7.
$instance_value['widget']['type'] = $instance_value['widget_type'];
$instance_value['widget']['weight'] = $instance_value['weight'];
$instance_value['widget']['module'] = $instance_value['widget_module'];
$instance_value['widget']['active'] = $instance_value['widget_active'];
$default_settings = field_info_widget_settings($field_value['type']);
$instance_value['widget']['settings'] = array_merge($default_settings, $instance_value['widget_settings']);
// Build display values.
$instance_value['display'] = array();
$label = $instance_value['display_settings']['label'];
$missing_formatters = array();
$excluded_display = array();
foreach ($instance_value['display_settings'] as $context => $settings) {
if ($context == 'label') {
continue;
}
// @TODO Multigroup fields have some unexpected elements, we need to work out what should happen to them.
if ($context == 'parent' || $context == 'weight') {
continue;
}
$instance_value['display'][$context]['label'] = $label['format'];
// The format used in D6 may not match the formatter in D7.
// Fix it using drupal_alter().
$instance_value['display'][$context]['type'] = $settings['format'];
$instance_value['display'][$context]['weight'] = $instance_value['weight'];
if ($settings['format'] == 'hidden') {
$instance_value['display'][$context]['settings'] = array();
unset($instance_value['display'][$context]['module']);
}
else {
$instance_value['display'][$context]['settings'] = field_info_formatter_settings($settings['format']);
$instance_value['display'][$context]['module'] = $instance_value['widget_module'];
}
}
// Unset unneeded values.
unset($instance_value['type_name'], $instance_value['global_settings'], $instance_value['widget_settings'], $instance_value['display_settings'], $instance_value['widget_module'], $instance_value['widget_active']);
// Unset some values that don't exist on all fields.
if (isset($instance_value['widget']['settings']['default_value'])) {
unset($instance_value['widget']['settings']['default_value']);
}
// Let modules change these values.
drupal_alter('content_migrate_instance', $instance_value, $field_value);
// Get rid of this value once CCK or some other module has handled it.
if (isset($instance_value['widget']['settings']['default_value_php'])) {
unset($instance_value['widget']['settings']['default_value_php']);
}
// Translate D6 core build modes. Some hook_content_migrate_instance_alter()
// implementations (e.g. date) need the old indexes to retrieve additional
// data, so we do this after the hook has run.
$mapping = array(
2 => 'search_index',
3 => 'search_result',
4 => 'rss',
5 => 'print',
);
$new_displays = array();
foreach ($instance_value['display'] as $context => $settings) {
$new_context = isset($mapping[$context]) ? $mapping[$context] : $context;
$new_displays[$new_context] = $settings;
}
// Additionally, set 'default' view mode to the settings used by
// 'full'. Set to array() if 'full' doesn't exist.
$new_displays['default'] = isset($new_displays['full']) ? $new_displays['full'] : array();
$instance_value['display'] = $new_displays;
// Warn about missing or invalid widgets.
if (!array_key_exists($instance_value['widget']['type'], $allowed_widgets)) {
$instance_value['messages'][] = t("Missing widget: The '@widget' widget is not available for the @field field, it will be set to the default widget.", array(
'@widget' => $instance_value['widget']['type'],
'@field' => $instance_value['field_name'],
));
}
// Warn about missing or invalid formatters, and the deprecated 'exclude'
// setting.
foreach ($instance_value['display'] as $context => &$settings) {
if ($settings['type'] != 'default' && !array_key_exists($settings['type'], $allowed_formatters)) {
$missing_formatters[$settings['type']][] = $context;
}
if (!empty($settings['exclude'])) {
$excluded_display[] = $context;
}
unset($settings['exclude']);
}
foreach ($missing_formatters as $formatter => $contexts) {
$instance_value['messages'][] = t("Missing formatter: The '@formatter' formatter used in @view_mode view modes for the @field field is not available, these displays will be reset to the default formatter.", array(
'@formatter' => $formatter,
'@view_mode' => count($contexts),
'@field' => $instance_value['field_name'],
));
}
if ($excluded_display) {
$instance_value['messages'][] = t("Deprecated 'exclude' option: The @field field uses the deprecated 'exclude' option in @view_mode view modes. This option will be ignored, and the field will be displayed with the selected formatters.", array(
'@view_mode' => count($excluded_display),
'@field' => $instance_value['field_name'],
));
}
// Add instance information to instance array.
$instance_values['instances'][$instance_value['bundle']][$instance_value['field_name']] = $instance_value;
$instance_values['fields'][$instance_value['field_name']][$instance_value['bundle']] = $instance_value;
}
}
if (!empty($bundle)) {
if (!empty($field_name)) {
return $instance_values['instances'][$bundle][$field_name];
}
else {
return $instance_values['instances'][$bundle];
}
}
elseif (!empty($field_name)) {
return $instance_values['fields'][$field_name];
}
return $instance_values;
}