创建字段后,如何更改其机器名称


18

我在输入字段名称时间隔了一下,现在机器名称不是我想要的名称。我知道这很烦人。但是我想知道创建字段后是否可以通过某种方式更改字段的机器名称。

我想这使我进入了问题的第二部分。如果我创建了一个字段,并且不再使用它,该如何删除它,是否必须从数据库中完成,或者可以在UI中的某个位置完成?

Answers:


15

简而言之,您无法更改计算机名称。从理论上讲,这显然是可能的,但将需要对数据库进行大量修改。如果您仅创建了该字段,则将其删除并创建一个新字段要容易得多。

基础将是重命名所有条目field_configfield_config_instance,但只要你开始使用领域,计算机名称获取存储在一百个不同的地方的。视图配置,面板配置,功能等,然后进行更改并不有趣。

可以在上完成删除字段:admin/structure/types/manage/[machine_name_of_content_type]/fields,您可以通过任何内容类型上的“ 管理字段 ”标签来访问它们。


但是这些字段仍不保留在数据库中,例如,我用popper名称创建了一个新字段,但是当我将一个新字段添加到内容类型时,旧的字段名称仍会显示为选项。也许我不完全了解字段如何工作。
user379468

1
我没有研究很多功能,随着时间的推移会删除字段及其内容。原因是为了防止站点在删除具有数千个条目的字段时停顿下来。如果该字段未在任何地方使用,我希望它在下一次cron运行时消失。
Letharion 2012年

我试图对站点代码和数据库转储执行sed -i -es / old_field / new_field /。不幸的是,出了故障,转储恢复站点出现故障之后。任何想法如何正确地做到这一点?
德米特里·维亚

1
@Dmitry Vyal:字段名称存储在序列化数组中的几个位置–用另一个长度不同的字符串替换一个字符串会破坏数组的unserialize()并可能会破坏下一个引导程序或Drupal。
Charlie Schliesser 2012

@Charlie S:谢谢,以后会照顾它的。
德米特里·维亚

16

我的过程是先使用drush克隆字段,然后使用DB查询将字段数据复制到新的字段表中。验证克隆字段的内容后,删除原始字段。

我这样做是因为我认为克隆字段的drush方法将至少与我自己编写的任何克隆代码一样可靠,数据复制查询非常简单,在删除原始字段之前,我需要检查新字段。

  1. drush field-clone field_my_field field_my_field_clone
  2. 将行插入field_my_field_clone,例如INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. 验证的内容field_my_field_clone
  4. 使用UI删除字段,例如 admin/structure/types/manage/my-content-type/fields

1
这很棒!对于D7:INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field; INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field;
joelpittet 2014年

我不知道有一个“ drush field-clone”命令!真棒:)
Lovau 2015年

那么视图,面板等呢?手动修复?
zkent

如果您使用的是drush,则可以直接删除字段, drush field-delete xxx并且您也可以drush sql-query按照neubreed的建议进行操作。@zkent,你将不得不重新链接TE在现有意见,面板上的新领域,等等
的Xaa


6

我编写了一个更新脚本,该脚本实际上使用新的计算机名称创建一个新的字段和实例,将所有旧的字段数据复制到新的字段中,最后删除旧的实例。

// 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);

2

我只需要这样做,发现它并不太困难,但是我的网站相当简单。

尝试这个:

  1. 用正确的名称创建一个新字段。
  2. 在MySQL中运行以下查询:
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

  1. 更新涉及到的所有视图以使用新字段,以及指向该特定字段的任何其他模块(如果您的站点很复杂,在这里情况可能会很难看)。您可以在此处查看使用您的旧字段的任何视图:/admin/reports/fields/views-fields
  2. 清除网站缓存

2

//更改字段存储表名称。在这里,我们用新名称更改旧表的名称。

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();

1

使用上面的drush字段克隆答案,您还可以使用Drush进行MySQL的最后一步(D7示例):

drush sql-query "INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field"

drush sql-query "INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field"

0

如果您不想在mysql中摆弄,可以尝试我写的一个名为Field value copy 的草稿脚本

您将需要先设置新字段,然后致电

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

完成删除旧字段后,这会将现有数据移动到新字段。



-3

导出数据库的SQL文件,使用命令行sed替换所有要更改的术语,然后重新导入数据库。


1
否决了您的评论,因为这种方法会对您的Drupal安装造成严重破坏,因为数据库中有几个地方的字段名已被PHP序列化。有关此的更多信息,请参见上面接受的答案下来自@CharlieS(及其他)的评论。
hargobind 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.