首頁  >  問答  >  主體

Moodle表單提交後無法進行驗證

<p>我正在嘗試建立表單,其結構取決於URL中的參數。如果URL中沒有指定參數,則應顯示錯誤訊息。根據id,執行資料庫查詢並填入表單資料。 </p> <p>範例網址: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 天前524

全部回覆(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_pa​​ram()或optional_param(),因為它們:

    • 將參數清理為宣告的型別
    • 自動從$_GET或$_POST中取得參數(在這種情況下很重要,因為當您提交表單時,'id'參數將成為POST資料的一部分)
    • 透過套用預設值(optional_param)或停止並顯示錯誤訊息(required_pa​​ram)來處理缺少的參數

    因此,您對$_GET['id']的存取應替換為:

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

    回覆
    0
  • 取消回覆