6

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

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

所以我对我的数据库进行了黑客攻击,删除了内容类型和属于它的所有表。

同样的结果——字段已经存在。

接下来我去了 Drupal API 网站寻找删除字段和字段实例的方法,结果遇到了

field_delete_field()

field_delete_instance()

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

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

顺便说一句,我为我的模块建模的代码是在 Drupal示例模块的“node_example”部分中找到的代码。

4

1 回答 1

4

哎呀,手动删除数据库表从来都不是一个好主意 - Drupal 不是那么宽容:)

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

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

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

要解决当前问题,请遵循以下流程:

  • 完全卸载(不仅仅是禁用)您的自定义模块。如果它处于不一致的状态,只需删除它在system表中的行。
  • field_config从和field_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()“硬”删除字段,因为它们仅在第一个实例中被标记为删除。

于 2012-11-28T18:17:53.190 回答