HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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)));
}