收集所有可能的表单元素定义

老葛的Drupal培训班 Think in Drupal

接着,调用element_info()。它将调用所有实现了hook_elements()的模块上的这个钩子函数。在Drupal核心中,标准的元素,比如单选按钮和复选框,都定义在modules/system/system.module中的hook_elements()实现中(参看system_elements())。如果模块需要定义它们自己的元素类型,那么就需要实现这个钩子。在以下几种情况中,你可能需要在你的模块中实现hook_elements():你想要一个特殊类型的表单元素时,比如一个图像上传按钮,在节点预览期间可用来显示缩略图;或者,你想通过定义更多的属性来扩展已有的表单元素时。
    例如,第3方的fivestar模块定义了它自己的元素类型:
 
/**
 * Implementation of hook_elements().
 *
 * Defines 'fivestar' form element type.
 */
function fivestar_elements() {
    $type['fivestar'] = array(
        '#input' => TRUE,
        '#stars' => 5,
        '#widget' => 'stars',
        '#allow_clear' => FALSE,
        '#auto_submit' => FALSE,
        '#auto_submit_path' => '',
        '#labels_enable' => TRUE,
        '#process' => array('fivestar_expand'),
    );
    return $type;
}
    TinyMCE模块使用hook_elements(),来潜在地修改已有类型的默认属性。TinyMCE向textarea元素类型添加了一个#process属性,这样当表单正被构建时,它将调用tinymce_process_textarea(),这样就能够修改表单元素了。#process属性是一个数组,里面包含了所要调用的函数名字。
 
/**
 * Implementation of hook_elements().
 */
function tinymce_elements() {
    $type = array();
 
    if (user_access('access tinymce')) {
        // Let TinyMCE potentially process each textarea.
        $type['textarea'] = array(
            '#process' => array('tinymce_process_textarea'),
        );
    }
 
    return $type;
}
 
    钩子element_info()为所有的表单元素收集所有的默认属性,并将其保存到一个本地缓存中。在进入下一步----为表单寻找一个验证器----以前,对于那些在表单定义中尚未出现的任何默认属性,都将在这里被添加进来。

Drupal版本: