允许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
评论
form_id + _alter
我试着写这个函数去修改表单属性,不管是在表单所属的模块还是其他的模块中实现该函数,都无法达到修改表单属性的目的?
而使用hook_form_alter或者hook_form_formID_alter钩子都比较轻松容易的达到这一目的(推荐使用:hook_form_formID_alter钩子);
我在想:这是我的code的原因,还是drupal就没有这一机制呢?
楼上真细心,你说的是对的,只能查到下面这两个,没有....
楼上真细心,你说的是对的,只能查到下面这两个,没有hook_FORM_ID_alter存在,(如果有这种命名方式也不太好),这里可能是笔误吧:
http://api.drupal.org/api/function/hook_form_alter/6
http://api.drupal.org/api/function/hook_form_FORM_ID_alter/6
看下图中的搜索提示下拉框就明白了: