View source
<?php
function date_tools_change_type_form() {
$form = array();
drupal_set_message(t('This operation does not yet work for the Drupal 7 version.'), 'error');
return $form;
$fields = content_fields();
$date_options = array();
$type_options = array();
$labels = array();
foreach (date_field_info() as $type => $info) {
$type_options[$type] = $info['label'] . ': ' . $info['description'];
$labels[$type] = $info['label'];
}
foreach ($fields as $field_name => $field) {
if ($field['type'] == 'date' || $field['type'] == 'datestamp' || $field['type'] == 'datetime') {
$date_options[$labels[$field['type']]][$field_name] = t('Field @label (@field_name)', array(
'@label' => $field['widget']['label'],
'@field_name' => $field_name,
'@type' => $labels[$field['type']],
));
}
}
if (sizeof($date_options) < 1) {
drupal_set_message(t('There are no date fields in this database.'));
return $form;
}
$form['date_field'] = array(
'#type' => 'select',
'#options' => $date_options,
'#title' => t('Date field'),
'#default_value' => '',
'#description' => t('The date field which whose type should be changed.'),
);
$form['type'] = array(
'#type' => 'radios',
'#options' => $type_options,
'#default_value' => '',
'#required' => TRUE,
'#description' => t('The type of date to change the field to.'),
'#prefix' => '<strong>' . t('New type:') . '</strong>',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Change'),
);
return $form;
}
function date_tools_change_type_form_validate($form, &$form_state) {
$field_name = $form_state['values']['date_field'];
$new_type = $form_state['values']['type'];
$field = content_fields($field_name);
$old_type = $field['type'];
if ($new_type == $old_type) {
form_set_error('type', t('The current type is the same as the chosen type. There is nothing to change.'));
}
}
function date_tools_change_type_form_submit($form, &$form_state) {
$field_name = $form_state['values']['date_field'];
$new_type = $form_state['values']['type'];
$field = content_fields($field_name);
$old_type = $field['type'];
if ($new_type == $old_type) {
return;
}
$db_info = content_database_info($field);
$table = $db_info['table'];
$columns = $db_info['columns'];
$labels = array();
foreach (date_field_info() as $type => $info) {
$labels[$type] = $info['label'];
}
$has_data = db_query("SELECT COUNT(*) FROM {" . $table . "}")
->fetchField();
if ($has_data) {
$temp_table = $table . '_temp';
db_query("CREATE TABLE {" . $temp_table . "} SELECT * FROM {" . $table . "}");
}
$field['type'] = $new_type;
require_once './' . drupal_get_path('module', 'content') . '/includes/content.crud.inc';
content_field_instance_update($field, FALSE);
content_clear_type_cache();
if (!$has_data) {
drupal_set_message(t('The field @field_name has been changed from @old_type to @new_type.', array(
'@field_name' => $field['widget']['label'],
'@old_type' => $labels[$old_type],
'@new_type' => $labels[$new_type],
)));
return;
}
require_once './' . drupal_get_path('module', 'date_api') . '/date_api_sql.inc';
$date_handler = new date_sql_handler();
$date_handler
->construct();
$date_handler->granularity = $field['granularity'];
$date_handler->date_type = $old_type;
$new_columns = array();
$old_columns = array(
'nid',
'vid',
);
$new_columns[] = $temp_table . '.nid AS nid';
$new_columns[] = $temp_table . '.vid AS vid';
if ($field->multiple) {
$new_columns[] = $temp_table . '.delta AS delta';
$old_columns[] = 'delta';
}
foreach ($columns as $column => $info) {
if ($column != 'value' && $column != 'value2') {
continue;
}
$old_columns[] = $info['column'];
$db_field = $date_handler
->sql_field($temp_table . '.' . $info['column'], 0);
switch ($old_type) {
case 'date':
switch ($new_type) {
case 'datestamp':
$new_columns[] = $date_handler
->sql_format('U', $db_field) . ' AS ' . $info['column'];
break;
case 'datetime':
$new_columns[] = $date_handler
->sql_format('Y-m-d H:i:s', $db_field) . ' AS ' . $info['column'];
break;
}
break;
case 'datestamp':
switch ($new_type) {
case 'date':
$new_columns[] = $date_handler
->sql_format('Y-m-d/TH:i:s', $db_field) . ' AS ' . $info['column'];
break;
case 'datetime':
$new_columns[] = $date_handler
->sql_format('Y-m-d H:i:s', $db_field) . ' AS ' . $info['column'];
break;
}
break;
case 'datetime':
switch ($new_type) {
case 'date':
$new_columns[] = $date_handler
->sql_format('Y-m-d/TH:i:s', $db_field) . ' AS ' . $info['column'];
break;
case 'datestamp':
$new_columns[] = $date_handler
->sql_format('U', $db_field) . ' AS ' . $info['column'];
break;
}
break;
}
}
$date_handler
->set_db_timezone();
$sql = 'REPLACE INTO {' . $table . '} (' . implode(', ', $old_columns) . ') ' . ' SELECT ' . implode(', ', $new_columns) . ' FROM {' . $temp_table . '}';
db_query($sql);
db_query("DROP TABLE {" . $temp_table . "}");
drupal_set_message(t('The field @field_name has been changed from @old_type to @new_type.', array(
'@field_name' => $field['widget']['label'],
'@old_type' => $labels[$old_type],
'@new_type' => $labels[$new_type],
)));
}