放牧代码和思想
专注自然语言处理、机器学习算法

Chapter 03: Hooks, Actions, and Triggers 代码详解 drupal钩子 触发器 动作详解

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

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机