在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()来查看会发生什么。但是表单显示为之前。为什么?
答案 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中发生的一些事情可能发生在主题层,但它不可能都发生在那里,因为表单不仅仅是前端显示;它们也是后端处理。