自定义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
相关产品推荐
相关产品推荐

