老葛的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()为所有的表单元素收集所有的默认属性,并将其保存到一个本地缓存中。在进入下一步----为表单寻找一个验证器----以前,对于那些在表单定义中尚未出现的任何默认属性,都将在这里被添加进来。
评论
官方勘误:
官方勘误:http://www.drupalbook.com/errata2?page=4 Page 223/224
Next,
element_info()
is called.Next,
_element_info()
is called.Incorrect function name. See http://api.drupal.org/api/function/_element_info/6 for API documentation of this function.