我最近更改了表单以使用Ajax提交数据。我的表单以(mm-dd-yyyy)格式接受用户的日期,在此更改之前,我的hook_submit在下面看到,因为在将它发送到数据库之前将代表我的格式转换为(yyyy-mm-dd)格式。更改后,它会跳过该步骤并按原样将日期值发送到DB。
我不介意找到或编写我自己的功能来进行转换,但我首先想在此之前了解其性质。也许我会学到一些能在以后帮助我的东西。
任何帮助将不胜感激。
我的问题是,为什么我的日期值是用$ form_data而不是用$ form_state转换的?
使用Drupal 7.
模块:Date API,CTools,
//Original submit handler
//Format sent to DB: yyyy-mm-dd <--This is what I want for the Ajax version
function fsa_roster_form_submit($form_id, &$form_data){
$dcc_table = 'dcc_'.$form_data['values']['sid'];
$insertDaycare = db_insert($dcc_table)
->fields(array(
'entered' => $form_data['values']['date_entered'],
'exited' => $form_data['values']['date_exited'],
))
->execute();
}
//Ajaxed submit handler:
//Format sent to DB: mm-dd-yyyy
function fsa_roster_form_ajax_submit($form, $form_state) {
$dcc_table = 'dcc_'.$form_state['input']['sid'];
$insertRoster = db_insert($dcc_table)
->fields(array(
'entered' => $form_state['input']['date_entered'],
'exited' => $form_state['input']['date_exited'],
))
->execute();
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save Entry'),
'#prefix' => '<div id="modalSubmit">',
'#ajax' => array(//Remove this from your imagination for original submit handler
'callback' => 'fsa_daycare_roster_form_ajax_submit',
'wrapper' => 'msgBox',
'method' => 'replace',
'effect' => 'fade',
),
'#suffix' => '</div><script>addValidationEvents();</script>'
);
答案 0 :(得分:1)
原因是您在AJAX提交回调中使用$form_state['input']
,在常规提交回调中使用$form_state['values']
。 input
数组在处理和验证之前始终包含表单数据,而values
数组包含处理和验证后的值。
因此,要在AJAX提交回调中实现相同的效果,请使用以下内容,就像在常规提交回调中一样:
function fsa_roster_form_ajax_submit($form, $form_state) {
$dcc_table = 'dcc_'.$form_state['values']['sid'];
$insertRoster = db_insert($dcc_table)
->fields(array(
'entered' => $form_state['values']['date_entered'],
'exited' => $form_state['values']['date_exited'],
))
->execute();
}
此外,对于它的价值,您的常规提交回调和AJAX提交回调都接受相同的参数:$form
和$form_state
。虽然你在两个函数中用不同的变量名称调用它们,但它们实际上(或多或少)相同。