You are here

使用hook_nodeapi()操纵其它类型的节点

老葛的Drupal培训班 Think in Drupal

前面的钩子只有在基于模块的hook_node_info()实现的“module”键时才调用。当Drupal看到一个blog节点类型时,那么将调用blog_load()。如果你想为每个节点都添加一些信息,不管它是什么类型,那该怎么办呢?我们到目前为止看到的钩子函数都做不到这一点;对于这一工作,我们需要一个更强大的钩子:hook_nodeapi()。
    这个钩子为模块提供了一个机会,来响应任意节点的生命周期期间的不同操作。node.module一般在调用完所有的特定节点类型的钩子函数以后,再调用钩子nodeapi()。下面是这个函数的签名:
 
hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)
 
    因为节点对象$node是通过引用传递的,所以对它的任何修改都将改变真正的节点。参数$op用来描述对节点所进行的当前操作,它可以有多种不同的值:
 
• prepare: 即将显示节点表单。它适用于节点的添加和编辑表单。
 
• validate:用户刚刚完成对节点的编辑并试图预览或者提交它。在这里,你的代码应该进行检查,以确保数据是你期望;如果有地方出错了,那么就调用form_set_error(),它将为用户返回一个错误消息。你可以使用该钩子来检查甚至修改数据,当然,在验证钩子中修改数据通常被认为是坏的实践。
 
• presave:节点通过了验证,即将被保存到数据库中。
 
• insert:新节点刚被插入到了数据库中。
 
• update:节点刚被更新到了数据库中。
 
• delete:节点已被删除。
 
• delete revision:一个节点的修订本已被删除。如果模块中保存了与该修订本有关的数据,那么它需要对此作出反应。使用$node->nid可得到节点ID,使用$node->vid可得到该修订本的ID。
 
• load: 从数据库中加载了基本的节点对象,再加上由节点类型设置的额外的节点属性(为了响应已经运行的hook_load();参看本章前面的“使用hook_load()来修改节点对象”一节)。此时你可以添加新的属性或者操作已有的节点属性。
 
• alter:节点的内容已经通过了drupal_render(),并被保存到了$node->body(如果节点以完整的形式显示)或者node->teaser(如果节点以摘要的形式显示)中,并且节点即将被传递给主题层。模块可以修改这个完整构建的节点。但是对$node->content中字段的修改,应该放到查看操作中,而不是这个操作中。
 
• view: 节点即将被显示给用户。这个动作将在钩子hook_view()之后调用,所以模块可以假定节点已被过滤并且现在包含了HTML。其它项目也可被添加到$node->content(示例可参看,前面我们是如何添加笑话妙语的)。
 
• search result:节点即将作为一个搜索结果项目显示出来。
 
• update index:节点正在被搜索模块索引化。有些额外信息,使用nodeapi的“view”操作不能将其显示出来,如果你想对其进行索引的话,你可以在这里将它返回(参看第12章)。
 
• prepare translation:翻译模块正在准备对节点进行翻译。模块可以添加自定义的翻译了的字段。
 
• rss item:节点正在被作为RSS种子的一部分而包含进来。
 
    函数hook_nodeapi()的最后两个参数,它们的值将根据当前操作的不同而改变。当一个节点被显示并且$op为alter或者view时,$a3 将为$teaser,而 $a4将为$page(参看node.module中的node_view())。参数的总结可参看表7-1 。
 
7-1. $op为alter或者 view时,hook_nodeapi()中参数$a3 和 $a4的含义
参数       含义
$teaser     是否要仅仅展示teaser,比如在http://example.com/?q=node上。
$page       如果一个节点自己作为一个页面显示时,$pageTRUE(比如,                                          http://example.com/?q=node/2))
 
    当节点正被验证时, 参数$a3为node_validate()中的参数$form(也就是,表单定义数组)。
    显示一个节点页面时,比如http://example.com/?q=node/3,钩子的调用次序,如图7-7所示:
7-7. 显示一个节点页面的执行路径
 

Drupal版本: