PHP表单提交前无法打印日期值问题求助
嘿,我看了你写的代码,问题主要出在三个地方:钩子时机理解错了、代码条件判断写错了,还有调试方法不对,咱们一个个说:
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

