You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP表单提交前无法打印日期值问题求助

为啥你在Drupal表单里的打印内容看不到?

嘿,我看了你写的代码,问题主要出在三个地方:钩子时机理解错了、代码条件判断写错了,还有调试方法不对,咱们一个个说:

1. 钩子的执行时机搞反了

你用的webforms_save_submission_alter(正确钩子名应该是hook_webforms_save_submission_alter)是表单提交完成后、数据存到数据库之前才触发的,不是你以为的“提交前”!这时候用户已经点了提交,浏览器正在等着跳转,后端的print_r输出要么被Drupal的页面渲染覆盖,要么随着页面跳转直接没了,前端根本看不到。

2. 条件判断完全写错了

你看这段代码:

if ($fields[$key] == 'Date_Production__c') {

这里$fields[$key]是字段的值,而'Date_Production__c'是字段的名称,你拿值和字段名比,永远都不会匹配上啊!所以里面的print_r和die根本不会执行,代码跑完直接提交表单,自然啥都看不到。应该改成判断$key是不是这个字段名:

if ($key == 'Date_Production__c') {

3. 后端调试不能用print_r

Drupal的后端代码里直接用print_r,输出会被框架的响应流程吃掉,尤其是表单提交后会跳转页面,你根本抓不到这个输出。得用Drupal专门的调试方式:

方法一:用Devel模块的dpm(最方便)

如果你的站点装了Devel模块,直接用dpm()代替print_r,它会把输出放到页面顶部的消息区域,或者Devel的变量面板里,哪怕页面跳转也能看到(如果是提交后跳转,Drupal会把消息带到下一页):

dpm($fields, '当前处理的字段数据');

方法二:写日志

没装Devel的话,把输出写到Drupal的日志里,去sites/default/logs/drupal.log里找:

\Drupal::logger('webform_debug')->debug('处理字段 %key,值为 %value', [
    '%key' => $key,
    '%value' => $fields[$key]
]);

方法三:阻止提交看结果

如果非要在前端看到输出,可以手动阻止表单提交,比如加个错误消息:

\Drupal::messenger()->addError(print_r($fields, TRUE));
// 或者直接抛出异常中断流程
throw new \Exception('调试中断,查看输出');

修正后的完整代码示例

function webforms_save_submission_alter(&$fields, $context) {
    $target_fields = ["Date_Prototype__c", "Date_Production__c", "NBIOT_Date_of_Field_Trial__c", "NBIOT_Date_Lab_Trial__c"];
    
    foreach ($fields as $key => &$value) {
        if (in_array($key, $target_fields)){
            $fields[$key] = trim($value);
            
            // 用Devel调试
            dpm($fields, "处理{$key}后的字段数据");
            
            // 修正条件判断:匹配字段名
            if ($key == 'Date_Production__c') {
                // 注意:strtotime需要有效的日期字符串,否则会报错
                if (!empty($fields[$key])) {
                    $fields[$key] = format_date(strtotime($fields[$key]), 'medium', 'm-d-Y');
                    dpm($fields, "格式化后的Date_Production__c");
                }
                
                // 可选:阻止提交看结果
                // \Drupal::messenger()->addError('调试中,表单已阻止提交');
                // throw new \Exception('调试中断');
            }
        }
    }
}

要是真的想在「提交前」调试怎么办?

如果你是想在用户点击提交按钮后、后端开始处理前就查看值,那得用hook_form_alter给表单加个验证回调,比如:

function mymodule_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
    // 替换成你的webform的表单ID,比如webform_submission_[你的webform机器名]_add_form
    if (strpos($form_id, 'webform_submission_') !== FALSE) {
        $form['#validate'][] = 'mymodule_webform_debug_validate';
    }
}

function mymodule_webform_debug_validate(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
    $values = $form_state->getValues();
    // 查看所有提交前的表单值
    dpm($values, '提交前的完整表单数据');
    
    // 查看特定日期字段
    $date_fields = ["Date_Prototype__c", "Date_Production__c", "NBIOT_Date_of_Field_Trial__c", "NBIOT_Date_Lab_Trial__c"];
    foreach ($date_fields as $field) {
        if (isset($values[$field])) {
            dpm($values[$field], "提交前的{$field}值");
        }
    }
    
    // 可选:阻止提交
    // $form_state->setErrorByName('', '调试中,阻止提交');
}

按照上面的方法改,你就能看到想要的日期输出啦!

内容的提问来源于stack exchange,提问作者shahzad shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:47:35