我想对以下内容大致类似(但不完全相同):我想创建一个具有SSN字段的Person内容类型。我想将SSN字段存储为整数,但允许用户输入数字123-45-6789。这意味着在验证触发之前,声明“123-45-6789”是无效输入,我想删除破折号并将其视为整数。
我尝试使用#value_callback函数以及非默认验证函数。那么问题是虽然我可以强制验证值,但是未更改的值是传递给db以进行插入的值,但是失败了。例如,这意味着虽然我可以强制“123-45-6789”被Drupal识别为“123456789”,但数据库仍然被传递“123-45-6789”,这当然失败了。
一个明显的解决方案是通过客户端javascript改变这一点,然后将值提交给网络服务器。我强烈希望避开这条路线。
答案 0 :(得分:3)
道歉,如果我误解了你,你应该能够做这样的事情:
function my_validation_handler(&$form, &$form_state) {
if (passes_ssn_validation($form_state['values']['SSN'])) {
// Changing the value in $form_state here will carry on over to the submission function
$form_state['values']['SSN'] = convert_to_db_format($form_state['values']['SSN']);
}
else {
form_set_error('SSN', 'The SSN was invalid');
}
}
然后,您将在表单构建或form_alter函数中使用$form['#validate'][] = 'my_validation_handler'
附加该验证函数。
希望有所帮助
答案 1 :(得分:1)
你应该使用hook_node_presave()
。它允许您在将不同字段的值插入数据库之前更改它们。这是官方文档:
http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_node_presave/7
希望这有助于:)