You are here

理解事件和触发器

老葛的Drupal培训班 Think in Drupal

Drupal在运行自己的业务时,需要处理一系列的事件。而这些内部事件实际就是一些时机,模块在此时能够与Drupal的处理流程进行交互。表3-1给出了一些Drupal事件。
 
3-1. Drupal事件示例
事件                  类型
创建一个节点            节点
删除一个节点            节点
查看一个节点            节点
创建一个用户帐号        用户
更新用户个人资料        用户
登录                    用户
登出                    用户
 
    Drupal开发者将这些内部事件称为钩子,这是因为当一个事件发生时,Drupal允许模块从该点钩进Drupal的执行路径。我们在前面的章节中,应该也见到了一些钩子。在模块开发中,一般都会涉及到这种情况----判定对哪个Drupal事件做出反应,也就是说,你需要在你的模块中实现哪些钩子。
 
    假定你有一个刚刚起步的网站,而网站所在的主机则被你放到了你的地下室中,开始都有点简陋。一旦你的网站有了人气,你可能就会打算把它卖给一个大公司,继而一夜暴富。在网站迈向成功的期间,你可能想监督用户的每次登录,用户的每次登录,都能给你带来一点希望。你决定,当有一个用户登录时,你的计算机就会发出嘟嘟嘟嘟的声音。不过你的小猫也住在地下室,为了避免嘟嘟声打扰了小猫的美梦,你决定使用一个简单的日志条目来模拟嘟嘟声。你快速的编写了一个.info文件,并将其放在了sites/all/modules/custom/beep/beep.info:
 
; $Id$
name = Beep
description = Simulates a system beep.
package = Pro Drupal Development
core = 6.x
 
    接着,该编写sites/all/modules/custom/beep/beep.module了:
<?php
// $Id$
/**
* @file
* Provide a simulated beep.
*/
function beep_beep() {
    watchdog('beep', 'Beep!');
}
 
    这将向Drupal的日志中写入一条消息“Beep!”(“嘟嘟!”)。现在已经不错了。接着,我们需要告诉Drupal当用户登录时发出嘟嘟声。通过在我们的模块中实现hook_user(),并将逻辑添加到login操作中,我们就可以完成目标了:
 
/**
* Implementation of hook_user().
*/
function beep_user($op, &$edit, &$account, $category = NULL) {
    if ($op == 'login') {
        beep_beep();
    }
}
    简单吧!如果添加了新内容时,也要发出嘟嘟声,那该怎么办呢?通过在我们的模块中实现hook_nodeapi(),并将逻辑添加到insert操作中,这样也就完成目标了:
/**
* Implementation of hook_nodeapi().
*/
function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
    if ($op == 'insert') {
        beep_beep();
    }
}
 
    如果我们想在添加评论时,也让Drupal发出嘟嘟声,那又该怎么办呢?好的,我们可以实现hook_comment(),并将逻辑添加到insert操作中,但是让我们暂停一下,并好好的思考一下。其实我们在重复的做着同样的一件事情。如果有那么一个图形化的用户界面,在那里我们可以将嘟嘟这个动作关联到我们想要的钩子和操作上,那该多好啊?这就是Drupal内置的触发器模块所要实现的功能。它允许你将一些动作与特定事件关联起来。在代码中,事件就是一个唯一的钩子操作联合体,比如“用户钩子, 登录操作”或者“nodeapi钩子, 插入操作”。当这些操作发生时,trigger.module就会让你触发一个动作。
 
    为了避免概念的混淆,让我们明确给出我们所用的术语:
事件:一个一般的编程概念,这个术语一般理解为:从系统的一个构件向其它构件发送一个消息。
钩子:这个编程技术,用在Drupal中,就是允许模块“钩进”执行流程。
操作:它指的是在钩子内部运行的一个具体的流程。例如,登录操作就是用户钩子中的一个操作。

触发器:它指的是,一个具体的钩子操作联合体与一个或多个动作的关联。例如,嘟嘟这个动作可以与用户钩子的登录操作关联起来。

评论

/**
* Implementation of hook_nodeapi().
*/
function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
    if ($op == 'insert') {
        beep_beep();
    }
}
 
修改为
 
/**
* Implementation of hook_nodeapi().
*/
function beep_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
    if ($op == 'insert') {
        beep_beep();
    }
}