【问题标题】:Drupal 6 hook: "field in a node-type has been added, modified or deleted"?Drupal 6钩子:“节点类型中的字段已添加,修改或删除”?
【发布时间】:2011-11-26 03:29:39
【问题描述】:

我看到 hook_node_type() 允许我拦截和修改新创建或新修改的节点类型。但显然,在创建或修改节点的 field-definitions 时,不会触发 hook_node_type()。

例如,当我创建节点类型“my_bio”时,会触发 hook_node_type()。但是,如果我随后将字段“my_photo”添加到“my_bio”节点类型,则不会触发 hook_node_type()。

在 Drupal 6 中,有没有办法编写一个有效扩展 hook_node_type() 的钩子,以便在添加或更改节点类型中的字段时调用该钩子?

或者,当添加或更改任何字段定义时,是否会调用一个挂钩?

更具体地说,这是我想要完成的: 我有两个自定义格式化程序,它们是“伙伴”:formatter_1 和 formatter_2。当添加或修改节点类型中的某些字段时,我检查该字段的格式化程序是否为 formatter_1。如果是这样,然后我检查节点类型是否包含该字段的“伙伴”,即格式化程序为 formatter_2 的第二个字段。如果没有,我会在这个节点类型中添加一个 field-mate。

【问题讨论】:

    标签: php drupal drupal-6 cck


    【解决方案1】:

    已编辑

    为了解决您的问题的更新...

    CCK 有一个钩子,只要字段的实例附加到节点类型,或者更新已经附加到节点类型的实例,就会触发该钩子。它被称为hook_content_fieldapi();文档似乎很粗略,但在content.crud.inc file 中提到它具有以下操作:

    1. 创建实例
    2. 读取实例
    3. 更新实例
    4. 删除实例

    钩子实现看起来像:

    function mymodule_content_fieldapi($op, $field) {
      if ($op == 'create instance') {
        if ($field->foo == 'bar') {
          // Do something
        }
      }
    }
    

    由于“实例”本质上定义了节点类型和字段之间的关系,因此这应该是开始您尝试做的事情的好地方。我建议在挂钩中转储 $field 的值,以查看您必须使用哪些变量。

    【讨论】:

    • 非常感谢您提供此参考。我现在看到 hook_field() 不是我需要的。显然,hook_field() 在提交节点时被调用(“内容将变量从 hook_nodeapi 调用传递到 hook_field”),而不是在提交字段定义时调用。谢谢你帮我澄清我的想法。我现在将修改问题...
    • @user606696:我已经更新了答案以反映您的新问题,希望对您有所帮助:)
    • 非常感谢。我会试一试并报告。
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-02-11
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多