| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | <?php// This file is part of//// 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/>.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;        }      }    }  }}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, $USER;  // Prepare data to submit to gradeimporter_feedback table  $entry = feedback_exists($feedback, $submissionid);  $isnewentry = false;  if (!$entry) {    $entry = new stdClass();    $entry->id = null;    $entry->timecreated = time();    $entry->submissionid = $submissionid;    $entry->studentid = $feedback['id'];    $entry->contextid = $contextid;    $isnewentry = true;  } else {    // If already had a feedback    // Deletes its files and remove its entry on DB    delete_feedback_files($entry);    $DB->delete_records('gradeimporter_feedback',                          array('submissionid' => $submissionid,                                'studentid' => $feedback['id'])                        );  }  $entry->timemodified = time();  $entry->grade = $feedback['grade'];  $entry->comment = $feedback['comment'];  $entry->name = $feedback['file'];  $entry->fileid = 0; // To be removed fileid is now feedbackid  $entry->usermodified = $USER->id;  // If is not a new feedback update previous record and return id  return $DB->insert_record('gradeimporter_feedback', $entry);}function store_feedback_file ($feedback, $context, $submission, $filetostore, $feedbackid) {  // Prepare file  $fs = get_file_storage();  // Create file information needed  $fileinfo = array(    'contextid' => $context->id,    'component' => 'mod_gradeimporter',    'filearea' => 'submissionfiles',    'itemid' => $feedbackid,    'filepath' => "/",    'filename' => $filetostore->get_filename(),    'timecreated' => time(), 'timemodified' => time()  );  // store files in correct area  return $fs->create_file_from_storedfile($fileinfo, $filetostore);}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'));  }}function feedback_exists($feedback, $submissionid) {  global $DB;  $feedback = $DB->get_record('gradeimporter_feedback',                              array('submissionid' => $submissionid,                                      'studentid' => $feedback['id']),                              );  return $feedback;}/** * Searches if a feedback has a file when updating it * If already has file then delete it to open space for a new file * Or if updated feedback doesnt have associated file * @param $feedback - record of already submited feedback * @return void */function delete_feedback_files($feedback) {  $fs = get_file_storage();  $file = $fs->get_file($feedback->contextid, 'mod_gradeimporter', 'submissionfiles', $feedback->id, '/', $feedback->name);  if ($file) {    $file->delete();  }}
 |