在看Drupal7专业开发指南 第三版 的时候给这堆零散的代码加了中文注释,这本书什么都好,就是没有随书附带光盘,里面的代码就有点乱了。
最后的效果:

/drupal/sites/all/modules/custom/beep/beep.info
name = Beep description = Simulates a system beep. package = Pro Drupal Development core = 7.x files[] = beep.module
/drupal/sites/all/modules/custom/beep/beep.module
<?php
/**
* @file
* Provide a simulated beep.模拟一个beep,不会自动被调用
*/
function beep_beep ()
{
watchdog('beep', 'Beep!');
}
/**
* Simulate a beep.
* A Drupal action.
*/
function beep_beep_action () // 这个名字不是随便取得,看下面的函数就知道了
{
beep_beep();
}
/**
* *Implementation of hook_action_info().这是对action_info()的hook,告诉drupal我们的beep是一个动作,钩子的实现,我们用模块名加上钩子名组成
*/
function beep_action_info ()
{
return array(
'beep_beep_action' => array( // 将执行的动作函数名称作为键:beep_beep_action,便于一看代码是知道那个函数是一个动作
'type' => 'system', // + type:这是你写的动作的分类
'label' => t('Beep annoyingly'), // + label:动作的用户友好名字,展示在在触发器关联用户接口的下拉列表里
'configurable' => FALSE, // + configurable:决定动作是否带任何参数
'triggers' => array( // + triggers:何时触发
'node_view',
'node_insert',
'node_update',
'node_delete'
)
),
'beep_multiple_beep_action' => array(
'type' => 'system',
'label' => t('Beep multiple times'),
'configurable' => TRUE, // //是否设置,如果true提供相应的form设置(form 可以自定定义)。具体的值会提交数据库actions表里parameters字段保存
'triggers' => array(
'node_view',
'node_insert',
'node_update',
'node_delete'
)
)
);
}
/**
* Form for configurable Drupal action to beep multiple times
* beep_multiple_beep_action的配置表
*/
function beep_multiple_beep_action_form ($context)
{
$form['beeps'] = array( // beeps这个名字也是随便
'#type' => 'textfield',
'#title' => t('Number of beeps'),
'#description' => t(
'Enter the number of times to beep when this action executes'),
'#default_value' => isset($context['beeps']) ? $context['beeps'] : '1',
'#required' => TRUE
);
// $form['test'] = array( // 试试这个form的构造过程
// '#type' => 'textarea',
// '#description' => t('The comment will be unpublished if it contains any of the phrases above. Use a case-sensitive, comma-separated list of phrases. Example: funny, bungee jumping, "Company, Inc."'),
// '#default_value' => isset( $context['keywords']) ? drupal_implode_tags($context['keywords']) : '',
// );
return $form;
}
function beep_multiple_beep_action_validate ($form, $form_state) // 检验表单合法性
{
$beeps = $form_state['values']['beeps'];
if (! is_numeric($beeps))
{
form_set_error('beeps',
t('Please enter a whole number between 0 and 10.'));
}
else
if ((int) $beeps > 10)
{
form_set_error('beeps',
t(
'That would be too annoying. Please choose fewer than 10 beeps.'));
}
else
if ((int) $beeps < 0)
{
form_set_error('beeps',
t(
'That would likely create a black hole! Beeps must be a positive integer.'));
}
}
function beep_multiple_beep_action_submit ($form, $form_state)
{
return array(
'beeps' => (int) $form_state['values']['beeps']
);
}
/**
* Configurable action. Beeps a specified number of times.
* beep_multiple_beep_action动作的实现
*/
function beep_multiple_beep_action ($object, $context)
// + $object: 许多动作作用与一个Drupal内建的对象之上:
// 节点、用户、taxonomy等等。当trigger.module执行一个动作时,
// 动作作用之上的对象也在参数$object中传递给动作。
// 例如如果一个动作设置成在一个新节点建立后执行,$object参数将包含节点对象。
// + $context: 一个动作能在不同的上下文中被调用。
// 动作通过在hook_action_info()中定义hooks键来声明支持哪个触发器,
// 但是,支持多触发器的动作需要知道是哪种上下文调用了它,
// 这样,动作依赖不同的上下文有不同的活动。
{
for ($i = 0; $i < $context['beeps']; $i ++)
{
beep_beep();
}
}
/**
* Implementation of hook_drupal_alter().
* Called by Drupal after
* hook_action_info() so modules may modify the action_info array.
* 利用drupal提供的修改动作信息函数来修改别的
*
* @param array $info
* The result of calling hook_action_info() on all modules.
*/
function beep_action_info_alter (&$info)
{
// Make the "Block current user" action available to the
// comment insert trigger.
// 使得Block current user可用于comment insert触发器
if (! in_array("comment_insert", $info['user_block_user_action']['triggers'])) // in_array(value,array,type)
// 函数在数组中搜索给定的值。
{
$info['user_block_user_action']['triggers'][] = 'comment_insert'; // After saving a new comment时触发这个动作
}
}
知识共享署名-非商业性使用-相同方式共享:码农场 » Chapter 03: Hooks, Actions, and Triggers 代码详解 drupal钩子 触发器 动作详解
码农场