Created
March 27, 2018 20:42
-
-
Save quicksketch/754329cd7d2b860357b7094ff29ef815 to your computer and use it in GitHub Desktop.
Rename a Drupal 7 field machine name while maintaining field data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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