. function create_submission ($data, $gradeimporterid, $userid) { global $DB; $timenow = time(); if (empty($data->id)) { // If is new db entry; $data->gradeimporterid = $gradeimporterid; $data->usermodified = $userid; $data->timecreated = $timenow; $isnewentry = true; } else { $isnewentry = false; } $data->descriptionformat = $data->description["format"]; $data->description = $data->description["text"]; $data->timemodified = $timenow; $data->position = -1; // Do later if ($isnewentry) { // If is new entry insert data into DB and gets id $data->id = $DB->insert_record('gradeimporter_submission', $data); } // If not new entry updates information // If new entry inserts id into DB $DB->update_record('gradeimporter_submission', $data); return $data; } function store_files ($context, $cm, $data) { global $CFG; $fs = get_file_storage(); $files = $fs->get_area_files($context->id, 'mod_gradeimporter', 'submissionfiles', $data->id ); foreach ($files as $file) { if ($file->get_mimetype() == 'text/csv') { read_csv($file->get_content(), $context, $data); return; } if ($file->get_mimetype() == 'application/zip') { // If it is a .zip file, extract files from the zip $zipfiles = read_zip($file, $context, $fs); // Search a .csv file foreach ($zipfiles as $file) { if ($file->get_mimetype() == 'text/csv') { // If csv is found, pass it to read_csv() read_csv($file->get_content(), $context, $data, $zipfiles); // Only expects one csv so doesn't look for another } } // Finished processing files from zip, so delete temp copies $fs->delete_area_files($context->id, 'mod_gradeimporter', 'unpacktemp', 0); } } } function read_csv ($content, $context, $data, $zipfiles = null) { $csv = prepare_csv($content); foreach ($csv as $feedback) { $feedbackid = store_feedback($feedback, $context->id, $data->id); if ($feedback['file'] != "") { // If feedback has associated file, insert it into pluginfile foreach ($zipfiles as $file) { // Search in zipfiles to find same name then feedback['file'] if ($feedback['file'] == $file->get_filename()) { $feedbackfileinfo = store_feedback_file($feedback, $context, $data, $file, $feedbackid); break; } } // Already used all files, so delete extra copies } } } function prepare_csv ($content) { $csvlines = explode(PHP_EOL, $content); $csv = array(); foreach ($csvlines as $line) { $csv[] = str_getcsv($line); } $header = array_shift($csv); $outputcsv = array(); $outputcsv = array_map( function($v)use($header){ return array_combine($header, $v); }, $csv ); return $outputcsv; } function store_feedback ($feedback, $contextid, $submissionid) { global $DB; // Prepare data to submit to gradeimporter_feedback table $entry = new stdClass(); $entry->id = null; $entry->timecreated = time(); $entry->timemodified = time(); $entry->submissionid = $submissionid; $entry->studentid = $feedback['id']; $entry->grade = $feedback['grade']; $entry->comment = $feedback['comment']; $entry->name = $feedback['file']; $entry->fileid = 0; $entry->usermodified = 1; $entry->contextid = $contextid; // Insert data into gradeimporter_feedback table and gets ID $entry->id = $DB->insert_record('gradeimporter_feedback', $entry); return $entry->id; } function store_feedback_file ($feedback, $context, $submission, $filetostore, $feedbackid) { // Prepare file $fs = get_file_storage(); $fileinfo = array( 'contextid' => $context->id, 'component' => 'mod_gradeimporter', 'filearea' => 'submissionfiles', 'itemid' => $feedbackid, 'filepath' => "/", 'filename' => $filetostore->get_filename(), 'timecreated' => time(), 'timemodified' => time() ); $fileinfo = $fs->create_file_from_storedfile($fileinfo, $filetostore); return $fileinfo; } function read_zip ($file, $context, $fs) { global $CFG; // Get file packer to unpack zip $packer = get_file_packer('application/zip'); // Clear area_files if it has been used before $fs->delete_area_files($context->id, 'mod_gradeimporter', 'unpacktemp' ); // Extract to temp areafiles $file->extract_to_storage($packer, $context->id, 'mod_gradeimporter', 'unpacktemp', 0, $CFG->tempdir, false ); // Get extracted files from unpacktemp area file $tempfiles = $fs->get_area_files($context->id, 'mod_gradeimporter', 'unpacktemp' ); // Returns an array of files object return $tempfiles; } function get_types_array($gradeimporterid) { global $DB, $CFG; // Gets moodle table prefix, usually mdl_ $tp = $CFG->prefix; $query = "select id, name from {$tp}gradeimporter_submissiontype where gradeimporterid = $gradeimporterid"; return $DB->get_records_sql($query); } function validate_formdata($data) { if ($data->type == -1) { throw new moodle_exception(get_string('invalidtype', 'gradeimporter')); } }