You are here

使用hook_forms()声明验证和提交函数

老葛的Drupal培训班 Think in Drupal

有时,你会遇到一种特殊的情况,你想让许多不同的表单共用一个验证或者提交函数。这叫做代码复用,在该种情况下,这是一个不错的想法。例如,在节点模块中,所有节点类型都共用该模块的验证和提交函数。那么我们就需要一种方式,将多个表单ID映射到验证和提交函数上。这就需要hook_forms()了。
Drupal取回表单时,它首先查找基于表单ID定义表单的函数(正因为这样,在我们的代码中,我们使用函数formexample_nameform())。如果找不到该函数,它将触发hook_forms(),该钩子函数在所有的模块中查找匹配的表单ID以进行回调。例如,在node.module中,使用下面的代码,将不同类型的节点表单ID映射到了同一个处理器上:
 
/**
 * Implementation of hook_forms(). All node forms share the same form handler.
 */
function node_forms() {
    $forms = array();
    if ($types = node_get_types()) {
        foreach (array_keys($types) as $type) {
            $forms[$type .'_node_form']['callback'] = 'node_form';
        }
    }
    return $forms;
}
 
在我们的例子中,我们也可以实现hook_forms(),以将其它表单ID映射到我们已有的代码上:
 
/**
 * Implementation of hook_forms().
 */
function formexample_forms($form_id, $args) {
    $forms['formexample_special'] = array(
        'callback' => 'formexample_nameform');
    return $forms;
}
 
    现在,如果我们调用drupal_get_form('formexample_special'),Drupal首先检查定义该表单的函数formexample_special()。如果它找不到这个函数,那么将会调用hook_forms(),这样Drupal就会看到我们将表单ID formexample_special映射到了formexample_nameform上,Drupal将调用formexample_nameform()来获得表单定义,接着,分别尝试调用formexample_special_validate()和formexample_special_submit()来进行验证和提交。

Drupal版本: