You are here

允许drupal模块在表单构建以前修改表单

g089h515r806 的头像
Submitted by g089h515r806 on 星期一, 2009-08-17 09:04

 

允许drupal模块在表单构建以前修改表单
    在构建表单以前,模块有两个可以修改表单的机会。模块可以实现一个名字源于form_id + _alter的函数,或者可以简单的实现hook_form_alter()。任何模块,只要实现了这两个钩子中的任意一个,那么就可以修改表单中的任何东西。对于由第3方模块创建的表单,我们主要可以使用这种方式对其进行修改、覆写、混合。
 
构建表单
    现在表单被传递给了form_builder(),这个函数将对表单树进行递归处理,并为其添加标准的必须值。这个函数还将检查每个元素的#access键,如果该元素的#access为FALSE,那么将拒绝对该表单元素及其子元素的访问。
 
允许函数在表单构建后修改表单

函数form_builder()每次遇到$form树中的一个新分支时(例如,一个新的字段集或表单元素),它都寻找一个名为#after_build的可选属性。这是一个可选的数组,里面包含了当前表单元素被构建后会立即调用的函数。当整个表单被构建后,最后将调用可选属性$form[‘#after_build’]中定义的函数。$form和$form_state将作为参数传递给所有的#after_build函数。Drupal核心中有一个实际例子,那就是在“管理站点配置文件系统”中,文件系统路径的显示。这里使用了一个#after_build函数(在这里就是system_check_directory()),用来判定目录是否存在或者是否可写,如果不存在或不可写,那么将为该表单元素设置一个错误消息。

 

老葛的Drupal培训班 Think in Drupal

Drupal版本:

评论

pangjanne 的头像

我试着写这个函数去修改表单属性,不管是在表单所属的模块还是其他的模块中实现该函数,都无法达到修改表单属性的目的?

而使用hook_form_alter或者hook_form_formID_alter钩子都比较轻松容易的达到这一目的(推荐使用:hook_form_formID_alter钩子);

我在想:这是我的code的原因,还是drupal就没有这一机制呢?