Moodle表单提交后验证失败,跳转至无参数URL问题求助
问题分析与修复方案
核心问题总结
你的代码存在4个关键问题,导致提交表单后丢失URL参数并显示错误:
- URL参数名称不匹配:访问URL用的是
groupid=14,但代码里尝试获取$_GET["id"],参数名不一致导致无法正确读取ID。 - 页面URL设置错误:
set_url的写法不符合Moodle规范,且未携带参数,导致表单默认提交地址丢失groupid。 - 直接使用$_GET不安全:未采用Moodle官方的参数处理方法,存在安全风险且不符合框架规范。
- 表单提交未保留参数:表单中没有隐藏字段传递groupid,提交后参数直接丢失。
修正后的代码
signin.php
// 使用Moodle官方方法获取URL参数,安全且规范 $groupid = optional_param('groupid', null, PARAM_INT); // 正确设置页面URL,包含groupid参数 $PAGE->set_url(new moodle_url('/local/schedule/signin.php', ['groupid' => $groupid])); $PAGE->set_context(\context_system::instance()); $PAGE->set_pagelayout('base'); $PAGE->set_title("Sign up"); $PAGE->set_heading("Sign up for a group"); global $DB, $USER; $to_form = array('groupid' => $groupid); // 传递正确的参数名 $mform = new signinform(null, $to_form); $homeurl = new moodle_url('/'); if ($mform->is_cancelled()) { redirect($homeurl, 'Cancelled.'); } else if ($fromform = $mform->get_data()) { // 可通过$fromform->groupid获取提交时的参数 redirect($homeurl, 'Validation in process'); } echo $OUTPUT->header(); $mform->display(); echo $OUTPUT->footer();
signinform.php
class signinform extends moodleform { public function definition() { global $DB, $USER; $mform = $this->_form; $groupid = $this->_customdata['groupid']; $message = 'No group found'; if (is_null($groupid)) { $mform->addElement('html', '<h3>'.\core\notification::error($message).'</h3>'); } else { // 添加隐藏字段,确保提交表单时groupid不会丢失 $mform->addElement('hidden', 'groupid', $groupid); $mform->setType('groupid', PARAM_INT); // 此处添加你的业务表单字段,示例: // $mform->addElement('text', 'fullname', 'Your Full Name'); // $mform->setType('fullname', PARAM_TEXT); $this->add_action_buttons(true, 'Submit'); } } function validation($data, $files) { return array(); } }
修正说明
- 统一参数名称:将所有参数名改为
groupid,与访问URL中的参数保持一致。 - 安全获取参数:使用
optional_param方法处理URL参数,指定类型为PARAM_INT,避免注入风险。 - 保留提交参数:在表单中添加隐藏字段
groupid,确保提交表单时参数被携带到后台。 - 规范URL设置:
set_url方法传递参数数组,保证页面URL始终包含groupid,表单默认提交地址正确。
内容的提问来源于stack exchange,提问作者Scorch
相关产品推荐
相关产品推荐

