老葛的Drupal培训班 Think in Drupal
动作就是在给定时间运行的函数。简单的动作不带有可配置的参数。例如,我们创建的动作“嘟嘟”只会简单的嘟嘟一下。它不需要任何其它的信息(当然,如果需要的话还是可以使用$object和$context。)将这个动作与我们创建的高级动作相比,那么动作“嘟嘟多次”就需要知道嘟嘟的次数了。而其它的高级动作,比如动作“发送电子邮件”,可能需要更多的信息:电子邮件的收件人,电子邮件的主题,等等。这些参数都需要存储在数据库中。
表actions
当管理员创建一个高级动作的实例时,在配置表单输入的信息将被序列化并保存到actions表的parameters字段中。简单动作“嘟嘟”的数据库记录应该是这样的:
aid: 'beep_beep_action'
type: 'system'
callback: 'beep_beep_action'
parameters:
description: Beep
相反,动作“嘟嘟多次”的一个实例对应的数据库记录应该是这样的:
aid: 2
type: 'system'
callback: 'beep_beep_action'
parameters: (serialized array containing the beeps parameter with its value, i.e.,
the number of times to beep)
description: Beep three times
在一个高级动作被执行前,parameters字段中的内容将被反序列化,并被包含在$context参数中,从而传递给该动作。所以,在我们的动作“嘟嘟多次”的实例中,在beep_multiple_beep_action()中通过$context['beeps'] 就可以取得嘟嘟的次数了。
动作ID
注意,在前面的部分中,两条记录的动作ID之间的不同。简单动作的动作ID就是实际的函数名字。但是,很明显,对于高级动作,因为可能会存储一个动作的多个实例,所以我们在这里不能为其使用函数名作为标识。因此在这里使用了一个数字动作ID(存放在数据库表actions_aid中的)。
动作执行引擎,会基于动作ID是不是数字,来判定是否需要为其取出存储的参数。如果它不是数字,那么动作就被简单的执行了,这样就不需要再查询数据库了。这是一个非常迅速的判定;Drupal在index.php中就使用了同样的方式,来区分内容和菜单常量。
评论
嗯嗯,看明白了,感谢楼主分享。
嗯嗯,看明白了,感谢楼主分享。
纠错