Files
programming/submit.php
2026-02-07 09:46:32 +08:00

228 lines
8.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once('../../config.php');
require_once('lib.php');
require_once('submit_form.php');
$id = required_param('id', PARAM_INT); // programming ID
$cookiename = 'MDLPROGLANG_'.$CFG->sessioncookie;
$default_language = 0;
if (isset($_COOKIE[$cookiename])) {
$default_language = $_COOKIE[$cookiename];
}
if (!isset($language)) $language = $default_language;
$params = array('id' => $id);
$PAGE->set_url('/mod/programming/submit.php', $params);
$PAGE->requires->css('/mod/programming/codemirror/lib/codemirror.css');
// $PAGE->requires->css('/mod/programming/codemirror/doc/docs.css'); //把这个注释掉CSS就不会错位了。
$PAGE->requires->css('/mod/programming/codemirror/theme/eclipse.css');
// $PAGE->requires->js('/mod/programming/codemirror/lib/codemirror.js');
// $PAGE->requires->js('/mod/programming/codemirror/mode/clike/clike.js');
// $PAGE->requires->js('/mod/programming/codemirror/mode/pascal/pascal.js');
// $PAGE->requires->js('/mod/programming/codemirror/mode/python/python.js');
// $PAGE->requires->js('/mod/programming/codemirror/mode/shell/shell.js');
/* echo '
<script type="text/javascript"
src=
"codemirror/lib/codemirror.js"
>
</script>
<script type="text/javascript"
src=
"codemirror/mode/clike/clike.js"
>
</script>
<script type="text/javascript"
src=
"codemirror/mode/pascal/pascal.js"
>
</script>
<script type="text/javascript"
src=
"codemirror/mode/python/python.js"
>
</script>
<script type="text/javascript"
src=
"codemirror/mode/shell/shell.js"
>
</script>
';//*/
if (! $cm = get_coursemodule_from_id('programming', $id)) {
print_error('invalidcoursemodule');
}
if (! $course = $DB->get_record('course', array('id' => $cm->course))) {
print_error('coursemisconf');
}
if (! $programming = $DB->get_record('programming', array('id' => $cm->instance))) {
print_error('invalidprogrammingid', 'programming');
}
require_login($course->id, true, $cm);
$context = context_module::instance($cm->id);
$PAGE->set_context($context);
require_capability('mod/programming:submitprogram', $context);
$submitatanytime = has_capability('mod/programming:submitatanytime', $context);
$result = $DB->get_record('programming_result', array('programmingid' => $programming->id, 'userid' => $USER->id));
$submitcount = is_object($result) ? $result->submitcount : 0;
$time = time();
$isearly = $time < $programming->timeopen;
$islate = !$programming->allowlate && $time > $programming->timeclose;
$istoomore = $programming->attempts != 0 && $submitcount > $programming->attempts;
$allowpost = $submitatanytime || (!$isearly && !$islate && !$istoomore);
// Check if user has passed the practice
$haspassed = false;
if ($submitcount > 0) {
$latestsubmit = $DB->get_record('programming_submits', array('id' => $result->latestsubmitid));
$haspassed = is_object($latestsubmit) && $latestsubmit->passed;
}
$mform = new submit_form();
if ($mform->is_cancelled()) {
redirect(new moodle_url('view.php', array('id' => $cm->id)));
} else {
if ($allowpost && $submit = $mform->get_data()) {
$submits_count = $DB->count_records('programming_submits', array('programmingid' => $programming->id, 'userid' => $USER->id));
if (!$submitatanytime && ($programming->attempts != 0 && $programming->attempts <= $submits_count)) {
$error = get_string('submitfailednoattempts', 'programming');
$submit = False;
}
if ($submit) {
$submit->userid = $USER->id;
$submit->programmingid = $programming->id;
$code = $submit->code;
if ($sourcefile = $mform->get_file_content('sourcefile')) {
$code = $sourcefile;
}
if ($programming->presetcode) {
$code = programming_submit_remove_preset($code);
}
$submit->code = trim($code);
if($submit->language==6){
// $submit->code='import sys;import codecs;sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())'. PHP_EOL.$submit->code;
}
if ($submit->code == '') {
$error = get_string('submitfailedemptycode', 'programming');
$submit = False;
}
if ($submit) {
unset($submit->id);
programming_submit_add_instance($programming, $submit);
// Send events
$ue = new stdClass();
$ue->userid = $USER->id;
$ue->programmingid = $programming->id;
$ue->language = $submit->language;
$ue->timemodified = $submit->timemodified;
}
}
}
}
/// Print the page header
setcookie($cookiename, $language, time() + 3600 * 24 * 60, $CFG->sessioncookiepath);
if (!empty($action) && is_object($submit)) {
$PAGE->requires->css('/mod/programming/js/dp/SyntaxHighlighter.css');
$PAGE->requires->js('/mod/programming/js/dp/shCore.js');
$PAGE->requires->js('/mod/programming/js/dp/shBrushCSharp.js');
}
$PAGE->set_title($programming->name);
$PAGE->set_heading(format_string($course->fullname));
echo $OUTPUT->header();
/// Print tabs
$renderer = $PAGE->get_renderer('mod_programming');
$tabs = programming_navtab('submit', null, $course, $programming, $cm);
echo $renderer->render_navtab($tabs);
/// Print the main part of the page
echo html_writer::tag('h2', $programming->name);
echo html_writer::tag('h3', get_string('submit', 'programming').$OUTPUT->help_icon('submit', 'programming'));
if (is_object($submit)) {
echo html_writer::tag('h1', get_string('submitsuccess', 'programming'));
echo $OUTPUT->action_link(new moodle_url('result.php', array('id' => $cm->id)), get_string('viewresults', 'programming'));
} else {
print_submit();
//js code
echo '
<script src="codemirror/lib/codemirror.js"></script>
<script src="codemirror/lib/util/loadmode.js"></script>
<script src="codemirror/mode/clike/clike.js"></script>
<script src="codemirror/mode/pascal/pascal.js"></script>
<script src="codemirror/mode/python/python.js"></script>
<script src="codemirror/mode/shell/shell.js"></script>
<script>
CodeMirror.modeURL = "codemirror/mode/%N/%N.js";
var editor = CodeMirror.fromTextArea(document.getElementById("id_code"), {
lineNumbers: true,
tabSize: 4,
indentUnit: 4,
indentWithTabs: true,
theme:"eclipse",
mode: "text/x-csrc"
});
function change() {
var arr = '.json_encode(programming_get_language_options_js($programming)).'
editor.setOption("mode",arr[document.getElementById("id_language").value]);
editor.setOption("theme", "eclipse");
var mmode = arr[document.getElementById("id_language").value];
mmode = mmode.replace("text/x-csharp","clike");
mmode = mmode.replace("text/x-csrc","clike");
mmode = mmode.replace("text/x-c++src","clike");
mmode = mmode.replace("text/x-java","clike");
mmode = mmode.replace("text/x-pascal","pascal");
mmode = mmode.replace("text/x-python","python");
mmode = mmode.replace("text/x-sh","shell");
CodeMirror.autoLoadMode(editor, mmode);
}
</script>';
}
/// Finish the page
echo $OUTPUT->footer($course);
function print_submit() {
global $PAGE,$DB, $OUTPUT, $cm, $programming, $mform;
global $allowpost, $haspassed, $islate, $isearly;
if ($allowpost) {
if ($haspassed) {
echo html_writer::start_tag('div', array('id' => 'submitagainconfirm'));
echo html_writer::tag('p', get_string('youhavepassed', 'programming'));
echo html_writer::empty_tag('input', array('type' => 'button', 'id' => 'submitagain', 'name' => 'submitagain', 'value' => get_string('submitagain', 'programming')));
$PAGE->requires->js_init_call('M.mod_programming.init_submit');
echo html_writer::end_tag('div');
}
echo html_writer::start_tag('div', array('id' => 'submit'));
$mform->display();
echo html_writer::end_tag('div');
}
if ($isearly) {
echo html_writer::tag('p', get_string('programmingnotopen', 'programming'));
}
if ($islate) {
echo html_writer::tag('p', get_string('timeexceed', 'programming'));
}
}