【问题标题】:Format of Date value changes when using &$form_data or $form_state in hook_submit在 hook_submit 中使用 &$form_data 或 $form_state 时日期值的格式发生变化
【发布时间】:2012-07-26 05:13:27
【问题描述】:

我最近更改了我的表单以使用 Ajax 提交数据。我的表单接受来自用户的 (mm-dd-yyyy) 格式的日期,在此更改之前,我的 hook_submit 会在下面将其转换为 (yyyy-mm-dd) 格式,然后再将其发送到数据库.更改后,它会跳过该步骤并将日期值按原样发送到数据库。

我不介意找到或编写自己的函数来进行转换,但在我做之前我首先想了解它的本质。也许我以后会学到一些对我有帮助的东西。

任何帮助将不胜感激。

我的问题是,为什么我的日期值是用 $form_data 而不是 $form_state 转换的?

使用 Drupal 7。

模块:日期 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>'
);

【问题讨论】:

  • 您是否尝试过更改drupal配置中的“日期格式”而不是编码?所以所有日期都以这种格式输出..

标签: php ajax drupal date drupal-7


【解决方案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。尽管您在两个函数中使用不同的变量名来调用它们,但它们实际上(或多或少)相同。

【讨论】:

  • 谢谢!您的回答非常有帮助,我对 $form_state 的输入和值有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多