File: //opt/engelbrain/submit.php
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Handles submission processing for mod_engelbrain.
*
* @package mod_engelbrain
* @copyright 2025 Panomity GmbH
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once('../../config.php');
require_once('lib.php');
// Course module id.
$id = required_param('id', PARAM_INT);
// Get the course module.
$cm = get_coursemodule_from_id('engelbrain', $id, 0, false, MUST_EXIST);
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
$engelbrain = $DB->get_record('engelbrain', array('id' => $cm->instance), '*', MUST_EXIST);
// Check if the user has access to the activity.
require_login($course, true, $cm);
// Set up the page.
$PAGE->set_url('/mod/engelbrain/submit.php', array('id' => $cm->id));
$PAGE->set_title(format_string($engelbrain->name));
$PAGE->set_heading(format_string($course->fullname));
$context = context_module::instance($cm->id);
$PAGE->set_context($context);
require_capability('mod/engelbrain:submit', $context);
// Check if submissions are closed.
$now = time();
$duedate = $engelbrain->duedate;
$isoverdue = $duedate && $duedate < $now;
if ($isoverdue && !has_capability('mod/engelbrain:grade', $context)) {
redirect(
new moodle_url('/mod/engelbrain/view.php', array('id' => $cm->id)),
get_string('submissionsclosed', 'mod_engelbrain', userdate($duedate)),
null,
\core\output\notification::NOTIFY_ERROR
);
}
// Get the current user's submission if it exists.
$submission = $DB->get_record('engelbrain_submissions', array(
'engelbrainid' => $engelbrain->id,
'userid' => $USER->id
));
// Create a new submission form.
$submissionform = new \mod_engelbrain\form\submission_form(null, array(
'cm' => $cm,
'engelbrain' => $engelbrain,
'submission' => $submission
));
// Handle form submission.
if ($data = $submissionform->get_data()) {
// Process the submission.
$now = time();
// Get the submission content.
$submissioncontent = $data->submission_content['text'];
// Optional: handle uploaded file (image/PDF) via API OCR using filepicker draft area
if (!empty($data->submission_file)) {
$draftitemid = $data->submission_file;
file_save_draft_area_files(
$draftitemid,
$context->id,
'mod_engelbrain',
'submissions',
0,
array('subdirs' => 0)
);
$fs = get_file_storage();
$files = $fs->get_area_files($context->id, 'mod_engelbrain', 'submissions', 0, 'id DESC', false);
if (!empty($files)) {
try {
$apikey = $engelbrain->teacher_api_key;
if (empty($apikey)) {
$apikey = get_config('mod_engelbrain', 'school_api_key');
}
if (!empty($apikey)) {
$client = new \mod_engelbrain\api\client($apikey);
foreach ($files as $file) {
$content = $file->get_content();
$tempdir = make_temp_directory('engelbrain');
$tmppath = tempnam($tempdir, 'ocr_');
file_put_contents($tmppath, $content);
$ocr = $client->ocr_file($tmppath, $file->get_filename());
@unlink($tmppath);
if (is_array($ocr) && isset($ocr['text']) && !empty($ocr['text'])) {
if (!empty($submissioncontent)) {
$submissioncontent .= "\n\n<p><em>OCR:</em></p>\n<p>" . format_text($ocr['text'], FORMAT_HTML) . "</p>";
} else {
$submissioncontent = format_text($ocr['text'], FORMAT_HTML);
}
}
}
}
} catch (\Throwable $e) {
// Ignore OCR errors; keep original content
}
}
}
// Prepare the submission data.
$submissiondata = new stdClass();
$submissiondata->engelbrainid = $engelbrain->id;
$submissiondata->userid = $USER->id;
$submissiondata->timecreated = $now;
$submissiondata->timemodified = $now;
$submissiondata->status = 'submitted';
$submissiondata->submission_content = $submissioncontent;
// Create or update the submission record.
if ($submission) {
// Update the existing submission.
$submissiondata->id = $submission->id;
$DB->update_record('engelbrain_submissions', $submissiondata);
} else {
// Create a new submission.
$submissionid = $DB->insert_record('engelbrain_submissions', $submissiondata);
$submissiondata->id = $submissionid;
}
// Asynchroner Modus: Nicht direkt senden, Cron übernimmt die Übermittlung.
// Optional: Hybrid-Fallback (hier bewusst deaktiviert gemäß Entscheidung 1)
redirect(
new moodle_url('/mod/engelbrain/view.php', array('id' => $cm->id)),
get_string('submission_successful', 'mod_engelbrain'),
null,
\core\output\notification::NOTIFY_SUCCESS
);
} else {
// Redirect back to the view page if the form wasn't submitted.
redirect(new moodle_url('/mod/engelbrain/view.php', array('id' => $cm->id)));
}