【发布时间】:2017-01-08 23:53:16
【问题描述】:
我想将自己的验证(或提交)处理程序/函数添加到我现有的节点表单中。我尝试了乘法(以下),但它不能正常工作。
function MY_MODULE_form_alter(&$form, &$form_state, $form_id) {
$form['#validate'][] = 'MY_MODULE_handler';
//or
$form['actions']['submit']['#validate'][] = 'MY_MODULE_handler';
//or
$form['submit']['#submit'][] = 'MY_MODULE_handler';
//or
$form['#submit'][] = 'MY_MODULE_handler';
//or
array_unshift($form['#validate'], 'MY_MODULE_handler');
//or
$form['actions']['submit']['#submit'][]='MY_MODULE_handler';
}
但这些尝试似乎都不适用于我的处理程序:
function MY_MODULE_handler($form, &$form_state){
dsm($form);
dsm($form_state);
}
查看form_alter 中的$form 变量,我发现$form['actions']['submit']['#submit'] 和$form['#validate'] 已经有一个提交/验证处理程序。
但如果我使用上述示例之一,dsm 将不会打印任何内容。此外,它不再打印(提交)确认!但是如果我使用
function MY_MODULE_handler($form, &$form_state){
die('Handler was hit');
}
我看到处理程序被击中了。
可能是什么原因?我需要处理程序读取两个表单字段并将它们保存在一个节点属性中。
【问题讨论】:
-
$form['#validate'][] = 'MY_MODULE_handler';应该可以工作。仅仅因为 dsm 没有打印到页面,并不意味着您的函数没有被调用。尝试在验证函数中添加form_set_error('element', 'Handler was hit"');以查看它是否被调用。 -
@2pha,感谢您的回复。是的,这也是我调用处理程序的印象(因为
die('...')工作)。但我仍然需要输出(之前存在的确认打印输出和变量的打印输出)才能继续。有什么建议为什么它们不再起作用了吗? -
我不太明白你在做什么。
-
@2pha,好的,主要思想是我在我的
form_alter表单中添加了两个 tableselect 字段。在自定义验证函数中,我想将两个 tableselect 的值分配给我在后端创建的一个节点属性。此属性在表单中也有一个自己的字段(复选框,它是隐藏的)。如果您有其他想法,可能会有点迂回 - 我很开放。 ;) 不过,我希望它能够以这种方式工作...... -
只要在验证函数中验证数据,再找一个钩子来组合这些值。例如。 HOOK_node_presave