如何删除属于模块内容类型的字段的痕迹?

时间:2012-11-28 15:42:19

标签: drupal drupal-7 drupal-modules content-type

我正在尝试学习如何从我的模块中以编程方式创建自定义内容类型。

但是,卸载并重新安装我的模块后,我收到一条错误消息,指出我尝试创建的一个或多个字段因为已经存在而无法创建。

所以我去了我的数据库,删除了内容类型和所有属于它的表。

相同结果 - 字段已存在。

接下来,我访问了Drupal API网站,寻找删除字段和字段实例的方法,并且遇到了

field_delete_field()

field_delete_instance()

我创建了一个php页面,尝试删除我创建的字段,但只是出现错误,指出我尝试删除的表不存在。

所以我有点卡住 - 我无法创建字段,因为它们已经存在,我无法删除它们,因为它们不存在!

BTW我在模块中建模的代码是在Drupal examples module的“node_example”部分找到的代码。

1 个答案:

答案 0 :(得分:4)

哎呀,手动删除数据库表永远不是一个好主意 - Drupal并不宽容:)

只需解决安装/启用挂钩中的代码,将字段创建包装在:

if (!field_info_field('field_name')) {
  field_create_field(...
}

这将再次阻止问题的发生。或者,如果您不想这样做,请确保在卸载/禁用挂钩中删除该字段。显然,该方法可能会导致数据丢失。

要解决当前问题,请按以下步骤操作:

  • 完全卸载(不只是禁用)自定义模块。如果它处于不一致状态,只需删除system表中的行。
  • field_configfield_config_instance表中删除所有字段的痕迹。
  • 手动截断所有缓存表(任何以cache_开头的表)。
  • 并非绝对必要,但要清除任何遗留内容:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol();
    node_delete_multiple($nids);
    

应该这样做。

每次删除字段时,通过UI或编程方式,您都需要运行cron或调用field_purge_batch()以“硬”删除字段,因为它们仅在第一个实例中标记为删除。