我正在尝试学习如何从我的模块中以编程方式创建自定义内容类型。
但是,卸载并重新安装我的模块后,我收到一条错误消息,指出我尝试创建的一个或多个字段因为已经存在而无法创建。
所以我去了我的数据库,删除了内容类型和所有属于它的表。
相同结果 - 字段已存在。
接下来,我访问了Drupal API网站,寻找删除字段和字段实例的方法,并且遇到了
field_delete_field()
和
field_delete_instance()
我创建了一个php页面,尝试删除我创建的字段,但只是出现错误,指出我尝试删除的表不存在。
所以我有点卡住 - 我无法创建字段,因为它们已经存在,我无法删除它们,因为它们不存在!
BTW我在模块中建模的代码是在Drupal examples module的“node_example”部分找到的代码。
答案 0 :(得分: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()
以“硬”删除字段,因为它们仅在第一个实例中标记为删除。