Drupal 主题、验证、提交函数的调用次序:

对于一个主题函数,假定你使用基于PHPTemplate的名为bluemarine的主题,并且你正在调用drupal_get_form('formexample_nameform')。然而,这还取决于你的hook_theme()实现。

首先,如果在表单定义中将$form['#theme']设置为了'foo':

1. themes/bluemarine/foo.tpl.php // Template file provided by theme.

2. formexample/foo.tpl.php // Template file provided by module.

3. bluemarine_foo() // Function provided theme.

4. phptemplate_foo() // Theme function provided by theme engine.

5. theme_foo() // 'theme_' plus the value of $form['#theme'].


然而,如果在表单定义中没有设置$form['#theme']:

1. themes/bluemarine/formexample-nameform.tpl.php // Template provided by theme.

2. formexample/formexample-nameform.tpl.php // Template file provided by module.

3. bluemarine_formexample_nameform() // Theme function provided by theme.

4. phptemplate_formexample_nameform() // Theme function provided by theme engine.

5. theme_formexample_nameform() // 'theme_' plus the form ID.

在验证期间,表单验证器的设置次序如下:

1. A function defined by $form['#validate']

2. formexample_nameform_validate // Form ID plus 'validate'.

当需要查找处理表单提交的函数时,查找的次序如下:

1. A function defined by $form['#submit']

2. formexample_nameform_submit // Form ID plus 'submit'.

针对表单元素的验证:

一般情况下,一个表单使用一个验证函数。但是也可以为单个表单元素设置一个验证函数,这和整个表单的验证函数一样。为了实现这一点,我们需要将元素的属性#element_validate设置为一个数组,其中包含了验证函数的名字。表单数据结构中该元素分支的一份完整拷贝,将被作为验证函数的第一个参数。在调用完所有表单元素的验证函数以后,仍需调用表单验证函数。提示在你的表单元素未通过验证,你希望为它显示一条错误消息时,如果你知道表单元素的名字,那么使用form_set_error(),如果你拥有表单元素本身,那么使用form_error()。后者对前者做了简单封装。

表单重新构建:

在验证期间,你可能判定你没有从用户那里获取足够的信息。例如,你可能将表单数值放到一个文本分析引擎中进行检查,然后判定这一内容很有可能是垃圾信息。最后,你想重新显示表单(里面包含用户已输入的值),不过这次添加了一个CAPTCHA,用来证明这个用户不是一个机器人。通过在你的验证函数中设置$form_state['rebuild'],你就可以通知Drupal需要进行一次重构了.

 

编写提交函数:

提交函数是表单通过验证后负责实际的表单处理的函数。只有在表单验证完全通过,并且表单没有被标记为重新构建时,它才会执行。提交函数通常需要修改$form_state['redirect']。如果你有多个函数用来处理表单提交,只有最后一个设置$form_state['redirect']的函数返才拥有最后的发言权。可以通过在表单中定义#redirect属性来覆写提交函数的重定向。通常使用hook_form_alter()来实现这一点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值