Skip to content

Instantly share code, notes, and snippets.

@quicksketch
Created March 27, 2018 20:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quicksketch/754329cd7d2b860357b7094ff29ef815 to your computer and use it in GitHub Desktop.
Save quicksketch/754329cd7d2b860357b7094ff29ef815 to your computer and use it in GitHub Desktop.
Rename a Drupal 7 field machine name while maintaining field data
<?php
/**
* Rename field_resource_thumbnail to field_reference_thumbnail.
*/
function example_update_7001() {
_example_update_rename_field('field_resource_thumbnail', 'field_reference_thumbnail');
_example_update_rename_field('field_resource_short_description', 'field_reference_description');
}
function _example_update_rename_field($old_field_name, $new_field_name) {
// Rename the data and revision tables and all interior column names.
foreach (array('data', 'revision') as $table_type) {
db_query("RENAME TABLE {field_{$table_type}_{$old_field_name}} TO {field_{$table_type}_{$new_field_name}}");
$columns = db_query("DESCRIBE field_{$table_type}_{$new_field_name}");
foreach ($columns as $column_info) {
$old_column_name = $column_info->Field;
if (strpos($old_column_name, $old_field_name) !== FALSE) {
$new_column_name = str_replace($old_field_name, $new_field_name, $old_column_name);
$data_type = $column_info->Type;
$not_null = $column_info->NULL === 'NO' ? 'NOT NULL' : '';
db_query("ALTER TABLE {field_{$table_type}_{$new_field_name}} CHANGE $old_column_name $new_column_name $data_type $not_null");
}
}
}
// Modify the global field configuration data.
$result = db_query("SELECT * FROM {field_config} WHERE field_name = :old_field_name", array(':old_field_name' => $old_field_name));
foreach ($result as $row) {
$data = json_encode(unserialize($row->data));
$data = str_replace($old_field_name, $new_field_name, $data);
$data = serialize(json_decode($data, TRUE));
db_query("UPDATE {field_config} SET field_name = :new_field_name, data = :data WHERE field_name = :old_field_name", array(
':new_field_name' => $new_field_name,
':data' => $data,
':old_field_name' => $old_field_name,
));
}
// Modify the instance configuration data.
$result = db_query("SELECT * FROM {field_config_instance} WHERE field_name = :old_field_name", array(':old_field_name' => $old_field_name));
foreach ($result as $row) {
$data = json_encode(unserialize($row->data));
$data = str_replace($old_field_name, $new_field_name, $data);
$data = serialize(json_decode($data, TRUE));
db_query("UPDATE {field_config_instance} SET field_name = :new_field_name, data = :data WHERE field_name = :old_field_name AND entity_type = :entity_type AND bundle = :bundle", array(
':new_field_name' => $new_field_name,
':data' => $data,
':old_field_name' => $old_field_name,
':entity_type' => $row->entity_type,
':bundle' => $row->bundle,
));
}
// Rename usages in groups.
$all_group_data = db_query("SELECT * FROM {field_group}");
foreach ($all_group_data as $row) {
if (strpos($row->data, $old_field_name) !== FALSE) {
$data = json_encode(unserialize($row->data));
$data = str_replace($old_field_name, $new_field_name, $data);
$data = serialize(json_decode($data, TRUE));
db_query("UPDATE {field_group} SET data = :data WHERE id = :id", array(
':data' => $data,
':id' => $row->id,
));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment