首页  >  问答  >  正文

Moodle表单提交后无法进行验证

<p>我正在尝试创建一个表单,其结构取决于URL中的参数。如果URL中没有指定参数,则应显示错误消息。根据id,执行数据库查询并填充表单数据。</p> <p>示例URL:http://127.0.0.1/local/group/signin.php?groupid=14</p> <p>不幸的是,当我通过点击操作按钮提交表单后,我的表单无法验证。它跳转到http://127.0.0.1/local/group/signin.php,因为URL中没有参数,所以显示错误消息“未找到组”。</p> <p>我在这里做错了什么?</p> <p>signinform.php:</p> <pre class="brush:php;toolbar:false;">class signinform extends moodleform { public function definition() { global $DB; global $USER; $mform = $this->_form; $urlid = $this->_customdata['id']; // 获取传递的组ID $message = '未找到组'; if(is_null($urlid)){ $mform->addElement('html', '<h3>'.\core\notification::error($message).'</h3>'); } else{ // 构建表单,执行SQL查询等 $this->add_action_buttons(true, '提交'); } } function validation($data, $files) { return array(); } }</pre> <p>登录.php:</p> <pre class="brush:php;toolbar:false;">$PAGE->set_url(new moodle_url('/local/schedule/signin.php?')); $PAGE->set_context(\context_system::instance()); $PAGE->set_pagelayout('base'); $PAGE->set_title("注册"); $PAGE->set_heading("注册一个组"); global $DB; global $USER; $urlid = $_GET["id"]; $to_form = array('id' => $urlid); // 将组ID传递给表单 $mform = new signinform(null, $to_form); $homeurl = new moodle_url('/'); if ($mform->is_cancelled()) { redirect($homeurl, '已取消。'); // 仅用于测试,永远不会进入此处 } else if ($fromform = $mform->get_data()) { redirect($homeurl, '正在进行验证'); // 仅用于测试,永远不会进入此处 } echo $OUTPUT->header(); $mform->display(); echo $OUTPUT->footer();</pre></p>
P粉287726308P粉287726308440 天前523

全部回复(1)我来回复

  • P粉680487967

    P粉6804879672023-08-29 17:01:00

    您需要在表单中添加一个隐藏字段,该字段包含必须传递到页面的'id',否则,当表单提交时,该id将不再存在于该页面的参数中。

    例如(在definition()中)

    $mform->addElement('hidden', 'id', $urlid);
    $mform->setType('id', PARAM_INT);

    此外,在Moodle中,您不应直接访问$_GET - 使用包装函数required_param()或optional_param(),因为它们:

    • 将参数清理为声明的类型
    • 自动从$_GET或$_POST中获取参数(在这种情况下很重要,因为当您提交表单时,'id'参数将成为POST数据的一部分)
    • 通过应用默认值(optional_param)或停止并显示错误消息(required_param)来处理缺少的参数

    因此,您对$_GET['id']的访问应替换为:

    $urlid = optional_param('id', null, PARAM_INT);

    回复
    0
  • 取消回复