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

自定义Gapselect题型:get_expected_data仅接收数字问题排查求助

排查Gapselect题型文本输入仅能接收数字的问题

我来帮你拆解这个问题,从你提供的代码来看,PARAM_TEXT本身是支持字母等文本输入的,所以问题大概率出在前端限制或者后端其他处理环节,咱们一步步排查:

1. 先排查前端输入框的限制

你给出的HTML代码省略了部分属性,先检查输入框是否有强制数字输入的属性:

  • 有没有添加 pattern="[0-9]*" 或 pattern="[0-9]+"?这个属性会让浏览器只允许输入数字,甚至提交时拦截非数字内容
  • 有没有设置 inputmode="numeric"?这个会唤起数字键盘,部分设备会限制字母输入
  • 有没有绑定JS事件(比如onkeydown、oninput)来过滤字母?比如类似if(!event.key.match(/[0-9]/)) event.preventDefault()的代码

如果存在以上任意一种情况,前端就会阻止用户输入字母,后端自然接收不到。你可以用浏览器开发者工具查看输入框的实际渲染代码,确认完整属性。

2. 检查后端提交处理逻辑

如果前端确实能输入字母,但后端接收不到,那要看看process_submission()方法(或者其他处理用户提交的代码)是否做了强制转换或过滤:

  • 有没有类似 $value = (int)$data->{$this->field($place)}; 的代码?强制转成整数会直接丢弃字母内容
  • 有没有用clean_param时错误地用了PARAM_INT而不是PARAM_TEXT?比如在处理输入时手动覆盖了验证规则

你可以临时加调试代码验证:

// 在process_submission方法开头添加
debugging('Raw submitted data: ' . print_r($data, true), DEBUG_DEVELOPER);

提交包含字母的输入后,查看调试信息里是否有字母内容。如果原始数据里有字母,但后续处理后丢失了,就是这里的问题。

3. 确认field()方法的返回值

检查$this->field($place)返回的字段名是否正确,有没有在其他地方被绑定了数字验证规则。比如某些题型会对特定字段名做默认验证,如果你用的字段名刚好和数字输入的字段重名,可能会被错误地应用验证规则。

4. 排除插件/主题干扰

有时候第三方插件或自定义主题会全局修改表单输入的行为,比如自动给text输入框添加数字限制。你可以临时切换到Moodle默认主题(比如Boost),或者禁用非核心插件,再测试是否能输入字母。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:27:33