在drupal形式api中使用“#process”回调有什么用?

时间:2010-10-13 21:07:22

标签: drupal

在drupal fapi中有一个属性“#process”。它到底是什么?为什么密码字段用它来进行字段复制而不是添加它们? 我想用它来定义一个带有hook_elements的新字段类型。

编辑:
这是我的hook_elements:

function test_elemets() {  
    return array(
        'test_field' => array(  
            '#input' => TRUE,  
            '#process' => array('test_field_process'),
        )
    );
}

并处理回调:

function test_field_process($element, $edit, &$form_state, $complete_form) {
    $element = array();    
    return $element;    
}

正如您在过程函数中看到的那样,我使用了$ element = array()来查看会发生什么。但是表单显示为之前。为什么?

2 个答案:

答案 0 :(得分:10)

阅读the Forms API documentation on the '#process' form element property

它是一个回调函数数组,每个函数都将通过传递给它的元素定义数组来调用。然后,回调函数可以作用于元素定义数组,以将其转换为不同的(通常更复杂的)定义,例如,在附加等同性检查JavaScript文件时复制密码字段,或将一个组合的“无线电”定义转换为特定单个“无线电”定义的数量等。

如果你想提供一个复杂的表单元素(比如组合多个'标准'元素,或者一个自动添加标准JavaScript助手的组合),你会想要使用它,但仍然保持简单,声明的方法Forms API。 ( Look Ma - 只有一个'#type' = 'myCrazyFormElement'数组,它将'自动'扩展为更复杂的;)

通过主题层执行此操作可能,具体取决于用例,但需要更多代码,每次都需要它。

答案 1 :(得分:4)

api.drupal.org documentation on #process说:

  

调用的函数数组   何时处理元素运用   这个回调,模块可以“注册”   进一步行动。比如说   “无线电”表单类型扩展为   多个单选按钮使用   处理功能。

处理与表单API保持不同。您无法更改主题图层中的表单数组(至少不在D6中)。具体来说,密码将form_expand_ahah添加到#process。你可能可以将大部分内容融入主题层,但不是这一行:

$element['#cache'] = TRUE;

因为缓存发生在主题图层之前,所以无法在主题图层中完成。更一般地说,虽然#process中发生的一些事情可能发生在主题层,但它不可能都发生在那里,因为表单不仅仅是前端显示;它们也是后端处理。