在看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钩子 触发器 动作详解