Answers:
简而言之,您无法更改计算机名称。从理论上讲,这显然是可能的,但将需要对数据库进行大量修改。如果您仅创建了该字段,则将其删除并创建一个新字段要容易得多。
基础将是重命名所有条目field_config
和field_config_instance
,但只要你开始使用领域,计算机名称获取存储在一百个不同的地方的。视图配置,面板配置,功能等,然后进行更改并不有趣。
可以在上完成删除字段:admin/structure/types/manage/[machine_name_of_content_type]/fields
,您可以通过任何内容类型上的“ 管理字段 ”标签来访问它们。
我的过程是先使用drush克隆字段,然后使用DB查询将字段数据复制到新的字段表中。验证克隆字段的内容后,删除原始字段。
我这样做是因为我认为克隆字段的drush方法将至少与我自己编写的任何克隆代码一样可靠,数据复制查询非常简单,在删除原始字段之前,我需要检查新字段。
drush field-clone field_my_field field_my_field_clone
field_my_field_clone
,例如INSERT field_my_field_clone SELECT * FROM field_my_field;
field_my_field_clone
。admin/structure/types/manage/my-content-type/fields
drush field-delete xxx
并且您也可以drush sql-query
按照neubreed的建议进行操作。@zkent,你将不得不重新链接TE在现有意见,面板上的新领域,等等
我编写了一个更新脚本,该脚本实际上使用新的计算机名称创建一个新的字段和实例,将所有旧的字段数据复制到新的字段中,最后删除旧的实例。
// Set variables
$old_name = 'field_old_name';
$new_name = 'field_new_name';
$entity_type = 'node';
$bundle = 'page';
// Get old field info
$old_field = field_info_field($old_name);
// Create new field
$new_field = $old_field;
$new_field['field_name'] = $new_name;
if (!field_info_field($new_name)) {
field_create_field($new_field);
}
else {
field_update_field($new_field);
}
// Get old field instance
$old_instance = field_info_instance($entity_type, $old_name, $bundle);
$new_instance = $old_instance;
$new_instance['field_name'] = $new_name;
if (!field_info_instance($entity_type, $new_name, $bundle)) {
field_create_instance($new_instance);
}
else {
field_update_instance($new_instance);
}
// Migrate old fields' data to the new ones
$field_data = db_select('field_data_' . $old_name, 'old')
->fields('old')
->condition('entity_type', $entity_type)
->condition('bundle', $bundle)
->execute();
while ($data = $field_data->fetchAssoc()) {
$data_new = array();
foreach ($data as $column => $value) {
$column = str_replace($old_name, $new_name, $column);
$data_new[$column] = $value;
}
db_insert('field_data_' . $new_name)
->fields($data_new)
->execute();
}
// Migrate old fields' revision data to the new ones
$field_revision = db_select('field_revision_' . $old_name, 'old')
->fields('old')
->condition('entity_type', $entity_type)
->condition('bundle', $bundle)
->execute();
while ($revision = $field_revision->fetchAssoc()) {
$revision_new = array();
foreach ($revision as $column => $value) {
$column = str_replace($old_name, $new_name, $column);
$revision_new[$column] = $value;
}
db_insert('field_revision_' . $new_name)
->fields($revision_new)
->execute();
}
// Delete old instance
field_delete_instance($old_instance);
// Purge fields
field_purge_batch(1000);
我只需要这样做,发现它并不太困难,但是我的网站相当简单。
尝试这个:
INSERT INTO field_data_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM `field_data_[OLD MACHINE NAME]` cf
INSERT INTO field_revision_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM `field_revision_[OLD MACHINE NAME]` cf
(用交换掉[NEW MACHNIE NAME]和[OLD MACHINE NAME] field_your_field_names
)
/admin/reports/fields/views-fields
//更改字段存储表名称。在这里,我们用新名称更改旧表的名称。
db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);
//更改field_config和field_instance_config表中的字段名称。
db_update('field_config')
->fields(
array(
'field_name' => $new_field_name,
)
)
->condition('field_name', $field_name, '=')
->execute();
db_update('field_config_instance')
->fields(
array(
'field_name' => $new_field_name,
)
)
->condition('field_name', $field_name, '=')
->execute();
该db_change_field()函数可以帮助你。
导出数据库的SQL文件,使用命令行sed
替换所有要更改的术语,然后重新导入数据库。