从内容类型中删除字段的最佳方法


21

从GUI定义的内容类型中删除Drupal 7字段的最佳方法是什么?我想使用hook_update_N,以便在运行update.php时可以将更改传播到多个服务器。但是我似乎找不到解决办法。对于自定义定义的模式,db_drop_table()对我而言有意义,但对于通过GUI定义的内容类型/字段而言,则不可行。


您创建了一个自定义模块来定义内容类型?
iStryker

iStryker:通过管理界面创建内容类型,添加一些字段,然后通过功能导出。但是现在我想以编程方式删除这些字段之一。
业余咖啡师,

请注意,D5提供了content_field_instance_delete()函数(在此处此处记录),但该函数不适用于D7。也很好奇D7核心中的field.install用于删除字段:_update_7000_field_delete_instance()-一个自定义的“内部”函数,其他人无法使用。对于诸如字段之类的重要信息,在我看来,应该在某个地方提供“公共”功能,这就是我正在寻找的功能。
业余咖啡师,

目前,我的“候选”公共功能是field_delete_instance()。
业余咖啡师,

Answers:


18

有两个api函数可删除字段:

如果您不想重复使用该字段,则删除整个字段而不是仅删除有关内容类型的实例可能会更干净一些。只有你才能成为法官。


2
像魅力一样工作。该函数不返回任何参数,因此当与hook_update_N()结合使用时,我建议您执行watchdog()来记录更新更改。
业余咖啡师,

9

是的,field_delete_instance()是删除字段实例的函数。

请注意,如果没有剩余实例,则将field_delete_instance()自动调用field_delete_field(),因此field_delete_instance()很可能会满足您的所有需求。

_update_7000_field_delete_instance()设计用于核心更新功能。示例:在更新功能中x_update_7000(),您正在使用field_delete_instance()。然后在中x_update_7001(),您{field_config}将以不一致的方式更改表,并且field_delete_instance()显然也需要进行更改。

但是,现在x_update_7000()调用to field_delete_instance()会导致错误,因为表仍处于旧结构中。但是,贡献模块的情况有所不同,因为它们应始终所有核心更新之后执行,因此需要使用最新的核心版本。

但是,这是您可能要用于自己的API函数(在更新函数中使用)的模式。

此外,这些_update函数不会执行挂接,因为结果是不可预测的(例如,因为可能禁用了运行更新的模块)。

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.