如何在点击Moodle表单非提交按钮时修改表单数据
解决Moodle非提交按钮点击后修改表单元素值的问题
Moodle表单渲染时会优先读取提交的原始数据,直接修改$data后调用set_data()会被提交值覆盖,你可以用以下两种方法解决:
方法1:直接操作表单元素实例
通过getElement()获取对应元素,调用setValue()直接设置显示值,这个操作不受提交数据优先级影响:
if ($mform->no_submit_button_pressed()) { $data = $mform->get_submitted_data(); if ($data->preloadtest) { // 修改文本框值 $textElement = $mform->getElement('your_text_field'); $textElement->setValue('预加载的测试文本'); // 修改选择框值(传入选项的value) $selectElement = $mform->getElement('your_select_field'); $selectElement->setValue('option_2'); // 修改自动完成框值 $autoCompleteElement = $mform->getElement('your_autocomplete_field'); $autoCompleteElement->setValue('target_id'); } echo $OUTPUT->header(); $mform->display(); }
方法2:清除提交数据中的对应字段后再set_data
如果需要保留set_data()的逻辑,可以先删除$data中要修改的字段,这样Moodle就会使用你设置的新值,而不是提交的原始值:
if ($mform->no_submit_button_pressed()) { $data = $mform->get_submitted_data(); if ($data->preloadtest) { // 设置新值 $data->your_text_field = '预加载的测试文本'; // 移除提交的原始值,避免覆盖 unset($data->your_text_field); $mform->set_data($data); } echo $OUTPUT->header(); $mform->display(); }
核心原因
Moodle表单的取值优先级是:提交的POST数据 > set_data()设置的值 > 元素默认值,所以要么直接修改元素的显示值,要么清除提交数据中的对应字段,才能让新值生效。
内容的提问来源于stack exchange,提问作者johna
相关产品推荐
相关产品推荐

