$PAGE->set_cm($cm); $PAGE->set_pagelayout('incourse'); $PAGE->set_title(get_string('emarking', 'mod_emarking')); $PAGE->navbar->add(get_string('uploadanswers', 'mod_emarking')); // Options for uploading the zip file within the form $options = array('subdirs' => 0, 'maxbytes' => get_max_upload_file_size($CFG->maxbytes, $course->maxbytes, $course->maxbytes), 'maxfiles' => 1, 'accepted_types' => '.zip', 'return_types' => FILE_INTERNAL); $mform = new mod_emarking_upload_form(null, array('coursemoduleid' => $cmid, 'emarkingid' => $emarking->id, 'options' => $options)); // If the user cancelled the form, redirect to activity if ($mform->is_cancelled()) { redirect($urlemarking); } else { if ($mform->get_data()) { // Save uploaded file in Moodle filesystem and check $fs = get_file_storage(); $fs->delete_area_files($context->id, 'mod_emarking', 'upload', $emarking->id); $file = $mform->save_stored_file('assignment_file', $context->id, 'mod_emarking', 'upload', $emarking->id, '/', emarking_clean_filename($mform->get_new_filename('assignment_file'))); // Validate that file was correctly uploaded if (!$file) { print_error("Could not upload file"); } // Check that the file is a zip if ($file->get_mimetype() !== 'application/zip') { echo $OUTPUT->header(); echo $OUTPUT->box_start('generalbox'); echo $OUTPUT->heading(get_string('error')); echo $OUTPUT->error_text(get_string('fileisnotzip', 'mod_emarking')); echo $OUTPUT->continue_button($urlemarking); echo $OUTPUT->box_end(); echo $OUTPUT->footer(); die; }
/** * Saves a new instance of the emarking into the database * * Given an object containing all the necessary data, * (defined by the form in mod_form.php) this function * will create a new instance and return the id number * of the new instance. * * @param object $emarking * An object from the form in mod_form.php * @param mod_emarking_mod_form $mform * @return int The id of the newly inserted emarking record */ function emarking_add_instance(stdClass $data, mod_emarking_mod_form $mform = null) { global $DB, $CFG, $COURSE, $USER; $data->timecreated = time(); $id = $DB->insert_record('emarking', $data); $data->id = $id; emarking_grade_item_update($data); if ($data->type == EMARKING_TYPE_MARKER_TRAINING) { return $id; } foreach ($data as $k => $v) { $parts = explode('-', $k); if (count($parts) > 1 && $parts[0] === 'marker') { $markerid = intval($parts[1]); $marker = new stdClass(); $marker->emarking = $id; $marker->marker = $markerid; $marker->qualitycontrol = 1; $DB->insert_record('emarking_markers', $marker); } } $context = context_course::instance($COURSE->id); $examid = 0; // If there's no previous exam to associate, and we are creating a new // e-marking, we need the PDF file if ($data->exam == 0) { // We get the draftid from the form $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } } else { $examid = $data->exam; } $studentsnumber = emarking_get_students_count_for_printing($COURSE->id); // A new exam object is created and its attributes filled from form data if ($examid == 0) { $exam = new stdClass(); $exam->course = $COURSE->id; $exam->courseshortname = $COURSE->shortname; $exam->name = $mform->get_data()->name; $exam->examdate = $mform->get_data()->examdate; $exam->emarking = $id; $exam->headerqr = isset($mform->get_data()->headerqr) ? 1 : 0; $exam->printrandom = isset($mform->get_data()->printrandom) ? 1 : 0; $exam->printlist = isset($mform->get_data()->printlist) ? 1 : 0; $exam->extrasheets = $mform->get_data()->extrasheets; $exam->extraexams = $mform->get_data()->extraexams; $exam->usebackside = isset($mform->get_data()->printdoublesided) ? 1 : 0; if ($examid == 0) { $exam->timecreated = time(); } $exam->timemodified = time(); $exam->requestedby = $USER->id; $exam->totalstudents = $studentsnumber; // Get the enrolments as a comma separated values $enrollist = array(); if (!empty($mform->get_data()->enrolments)) { $enrolments = $mform->get_data()->enrolments; foreach ($enrolments as $key => $enrolment) { if (!empty($enrolment)) { $enrollist[] = $key; } } } $exam->enrolments = implode(",", $enrollist); $exam->printdate = 0; $exam->status = EMARKING_EXAM_UPLOADED; // Calculate total pages for exam $exam->totalpages = $numpages; $exam->id = $DB->insert_record('emarking_exams', $exam); foreach ($exampdfs as $exampdf) { // Save the submitted file to check if it's a PDF $filerecord = array('component' => 'mod_emarking', 'filearea' => 'exams', 'contextid' => $context->id, 'itemid' => $exam->id, 'filepath' => '/', 'filename' => $exampdf['filename']); $file = $fs->create_file_from_pathname($filerecord, $exampdf['pathname']); } // Update exam object to store the PDF's file id $exam->file = $file->get_id(); if (!$DB->update_record('emarking_exams', $exam)) { $fs->delete_area_files($contextid, 'emarking', 'exams', $exam->id); print_error(get_string('errorsavingpdf', 'mod_emarking')); } // Send new print order notification emarking_send_newprintorder_notification($exam, $COURSE); // If it is a multi-course submission, insert several exams if (!empty($mform->get_data()->multicourse)) { $multicourse = $mform->get_data()->multicourse; foreach ($multicourse as $key => $mcourse) { if (!empty($key)) { if ($thiscourse = $DB->get_record('course', array('shortname' => $key))) { $studentsnumber = emarking_get_students_count_for_printing($thiscourse->id); $newexam = $exam; $newexam->id = null; $newexam->totalstudents = $studentsnumber; $newexam->course = $thiscourse->id; $newexam->courseshortname = $thiscourse->shortname; $newexam->emarking = 0; $newexam->id = $DB->insert_record('emarking_exams', $newexam); $thiscontext = context_course::instance($thiscourse->id); // Create file records for all new exams foreach ($exampdfs as $exampdf) { // Save the submitted file to check if it's a PDF $filerecord = array('component' => 'mod_emarking', 'filearea' => 'exams', 'contextid' => $thiscontext->id, 'itemid' => $newexam->id, 'filepath' => '/', 'filename' => $exampdf['filename']); $file = $fs->create_file_from_pathname($filerecord, $exampdf['pathname']); } // Send new print order notification emarking_send_newprintorder_notification($newexam, $thiscourse); } } } } } else { $exam = $DB->get_record("emarking_exams", array("id" => $examid)); $exam->emarking = $id; $exam->timemodified = time(); $DB->update_record('emarking_exams', $exam); } $headerqr = isset($mform->get_data()->headerqr) ? 1 : 0; setcookie("emarking_headerqr", $headerqr, time() + 3600 * 24 * 365 * 10, '/'); $defaultexam = new stdClass(); $defaultexam->headerqr = $exam->headerqr; $defaultexam->printrandom = $exam->printrandom; $defaultexam->printlist = $exam->printlist; $defaultexam->extrasheets = $exam->extrasheets; $defaultexam->extraexams = $exam->extraexams; $defaultexam->usebackside = $exam->usebackside; $defaultexam->enrolments = $exam->enrolments; setcookie("emarking_exam_defaults", json_encode($defaultexam), time() + 3600 * 24 * 365 * 10, '/'); return $id; }
/** * Validates the answer key file * @param unknown $data * @return multitype:Ambigous <string, lang_string> |multitype:string Ambigous <string, lang_string> */ private function get_answerkey_file_errors($data) { global $USER, $COURSE; $errors = array(); // We get the draftid from the form. $draftid = file_get_submitted_draft_itemid('answerkeyfile'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->is_directory()) { continue; } if ($uploadedfile->get_mimetype() !== 'application/pdf') { $errors['exam_files'] = get_string('invalidfilenotpdf', 'mod_emarking') . '_' . $uploadedfile->get_mimetype() . '_' . $uploadedfile->get_filename(); return $errors; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated. $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); if (!is_numeric($numpages) || $numpages < 1) { $errors['exam_files'] = get_string('invalidpdfnopages', 'mod_emarking'); return $errors; } if ($numpagesprevious >= 0 && $numpagesprevious != $numpages) { $errors['exam_files'] = get_string('invalidpdfnumpagesforms', 'mod_emarking'); return $errors; } $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } if (count($exampdfs) == 0 && $data['exam'] == 0) { $errors['exam_files'] = get_string('filerequiredtosendnewprintorder', 'mod_emarking'); return $errors; } return $errors; }
/** * Validates if the draft files uploaded by a user are valid PDF exams * * @return array list of valid PDF exam files */ function emarking_validate_exam_files_from_draft() { global $USER, $COURSE; // We get the draftid from the form. $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->is_directory() || $uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated. $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename, 'numpages' => $numpages); } return $exampdfs; }
/** * Creates a personalized exam file. * * @param unknown $examid * @return NULL */ function emarking_download_exam($examid, $multiplepdfs = false, $groupid = null, progress_bar $pbar = null, $sendprintorder = false, $idprinter = null, $printanswersheet = false, $debugprinting = false) { global $DB, $CFG, $USER, $OUTPUT; require_once $CFG->dirroot . '/mod/emarking/lib/openbub/ans_pdf_open.php'; // Validate emarking exam object if (!($downloadexam = $DB->get_record('emarking_exams', array('id' => $examid)))) { throw new Exception(get_string("invalidexamid", "mod_emarking")); } // Contexto del curso para verificar permisos $context = context_course::instance($downloadexam->course); if (!has_capability('mod/emarking:downloadexam', $context)) { throw new Exception(get_string("invalidaccess", "mod_emarking")); } // Verify that remote printing is enable, otherwise disable a printing order if ($sendprintorder && (!$CFG->emarking_enableprinting || $idprinter == null)) { throw new Exception('Printing is not enabled or printername was absent ' . $idprinter); } // Validate course if (!($course = $DB->get_record('course', array('id' => $downloadexam->course)))) { throw new Exception(get_string("invalidcourse", "mod_emarking")); } // Validate course category if (!($coursecat = $DB->get_record('course_categories', array('id' => $course->category)))) { throw new Exception(get_string("invalidcategoryid", "mod_emarking")); } // We tell the user we are setting up the printing if ($pbar) { $pbar->update(0, 1, get_string('settingupprinting', 'mod_emarking')); } // Default value for enrols that will be included if ($CFG->emarking_enrolincludes && strlen($CFG->emarking_enrolincludes) > 1) { $enrolincludes = $CFG->emarking_enrolincludes; } // If the exam sets enrolments, we use those if (isset($downloadexam->enrolments) && strlen($downloadexam->enrolments) > 1) { $enrolincludes = $downloadexam->enrolments; } // Convert enrolments to array $enrolincludes = explode(",", $enrolincludes); // Produce all PDFs first separatedly $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}"; $fileimg = $filedir . "/qr"; $userimgdir = $filedir . "/u"; $pdfdir = $filedir . "/pdf"; emarking_initialize_directory($filedir, true); emarking_initialize_directory($fileimg, true); emarking_initialize_directory($userimgdir, true); emarking_initialize_directory($pdfdir, true); // Get all the files uploaded as forms for this exam $fs = get_file_storage(); $files = $fs->get_area_files($context->id, 'mod_emarking', 'exams', $examid); // We filter only the PDFs $pdffileshash = array(); foreach ($files as $filepdf) { if ($filepdf->get_mimetype() === 'application/pdf') { $pdffileshash[] = array('hash' => $filepdf->get_pathnamehash(), 'filename' => $filepdf->get_filename(), 'path' => emarking_get_path_from_hash($filedir, $filepdf->get_pathnamehash())); } } // Verify that at least we have a PDF if (count($pdffileshash) < 1) { throw new Exception(get_string("examhasnopdf", "mod_emarking")); } $students = emarking_get_students_for_printing($downloadexam->course); $studentinfo = array(); $currenttemplate = 0; // Fill studentnames with student info (name, idnumber, id and picture) foreach ($students as $student) { $studentenrolments = explode(",", $student->enrol); // Verifies that the student is enrolled through a valid enrolment and that we haven't added her yet if (count(array_intersect($studentenrolments, $enrolincludes)) == 0 || isset($studentinfo[$student->id])) { continue; } // We create a student info object $studentobj = new stdClass(); $studentobj->name = substr("{$student->lastname}, {$student->firstname}", 0, 65); $studentobj->idnumber = $student->idnumber; $studentobj->id = $student->id; $studentobj->picture = emarking_get_student_picture($student, $userimgdir); // Store student info in hash so every student is stored once $studentinfo[$student->id] = $studentobj; } // We validate the number of students as we are filtering by enrolment // type after getting the data $numberstudents = count($studentinfo); if ($numberstudents == 0) { throw new Exception('No students to print/create the exam'); } // Add the extra students to the list for ($i = $numberstudents; $i < $numberstudents + $downloadexam->extraexams; $i++) { $studentobj = new stdClass(); $studentobj->name = '..............................................................................'; $studentobj->idnumber = 0; $studentobj->id = 0; $studentobj->picture = $CFG->dirroot . "/pix/u/f1.png"; $studentinfo[] = $studentobj; } // Check if there is a logo file $logofilepath = emarking_get_logo_file($filedir); // If asked to do so we create a PDF witht the students list if ($downloadexam->printlist == 1) { $pdf = new FPDI(); $pdf->SetPrintHeader(false); $pdf->SetPrintFooter(false); emarking_draw_student_list($pdf, $logofilepath, $downloadexam, $course, $studentinfo); $studentlistpdffile = $pdfdir . "/000-studentslist.pdf"; $pdf->Output($studentlistpdffile, "F"); // se genera el nuevo pdf $pdf = null; } // Here we produce a PDF file for each student $currentstudent = 0; foreach ($studentinfo as $stinfo) { // If we have a progress bar, we notify the new PDF being created if ($pbar) { $pbar->update($currentstudent + 1, count($studentinfo), $stinfo->name); } // We create the PDF file $pdf = new FPDI(); $pdf->SetPrintHeader(false); $pdf->SetPrintFooter(false); // We use the next form available from the list of PDF forms sent if ($currenttemplate >= count($pdffileshash) - 1) { $currenttemplate = 0; } else { $currenttemplate++; } // Load the PDF from the filesystem as template $path = $pdffileshash[$currenttemplate]['path']; $originalpdfpages = $pdf->setSourceFile($path); $pdf->SetAutoPageBreak(false); // Add all pages in the template, adding the header if it corresponds for ($pagenumber = 1; $pagenumber <= $originalpdfpages + $downloadexam->extrasheets; $pagenumber++) { // Adding a page $pdf->AddPage(); // If the page is not an extra page, we import the page from the template if ($pagenumber <= $originalpdfpages) { $template = $pdf->importPage($pagenumber); $pdf->useTemplate($template, 0, 0, 0, 0, true); } // If we have a personalized header, we add it if ($downloadexam->headerqr) { emarking_draw_header($pdf, $stinfo, $downloadexam->name, $pagenumber, $fileimg, $logofilepath, $course, $originalpdfpages + $downloadexam->extrasheets); } } // The filename will be the student id - course id - page number $qrstringtmp = $stinfo->id > 0 ? "{$stinfo->id}-{$course->id}-{$pagenumber}" : "NN{$currentstudent}+1-{$course->id}-{$pagenumber}"; // Create the PDF file for the student $pdffile = $pdfdir . "/" . $qrstringtmp . ".pdf"; $pdf->Output($pdffile, "F"); // Store the exam file for printing later $stinfo->examfile = $pdffile; $stinfo->number = $currentstudent + 1; $stinfo->pdffilename = $qrstringtmp; $currentstudent++; } $sqlprinter = "SELECT id, name, command\n\t\t\tFROM {emarking_printers}\n\t\t\tWHERE id = ?"; $printerinfo = $DB->get_record_sql($sqlprinter, array($idprinter)); // If we have to print directly $debugprintingmsg = ''; if ($sendprintorder) { // Check if we have to print the students list if ($downloadexam->printlist == 1) { $printresult = emarking_print_file($printerinfo->name, $printerinfo->command, $studentlistpdffile, $debugprinting); if (!$printresult) { $debugprintingmsg .= 'Problems printing ' . $studentlistpdffile . '<hr>'; } else { $debugprintingmsg .= $printresult . '<hr>'; } } // Print each student $currentstudent = 0; foreach ($studentinfo as $stinfo) { $currentstudent++; if ($pbar != null) { $pbar->update($currentstudent, count($studentinfo), get_string('printing', 'mod_emarking') . ' ' . $stinfo->name); } if (!isset($stinfo->examfile) || !file_exists($stinfo->examfile)) { continue; } $printresult = emarking_print_file($printerinfo->name, $printerinfo->command, $stinfo->examfile, $debugprinting); if (!$printresult) { $debugprintingmsg .= 'Problems printing ' . $stinfo->examfile . '<hr>'; } else { $debugprintingmsg .= $printresult . '<hr>'; } } if ($CFG->debug || $debugprinting) { echo $debugprintingmsg; } // Notify everyone that the exam was printed emarking_send_examprinted_notification($downloadexam, $course); $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT; $downloadexam->printdate = time(); $DB->update_record('emarking_exams', $downloadexam); return true; } $examfilename = emarking_clean_filename($course->shortname, true) . "_" . emarking_clean_filename($downloadexam->name, true); $zipdebugmsg = ''; if ($multiplepdfs) { $zip = new ZipArchive(); $zipfilename = $filedir . "/" . $examfilename . ".zip"; if ($zip->open($zipfilename, ZipArchive::CREATE) !== true) { throw new Exception('Could not create zip file'); } // Check if we have to print the students list if ($downloadexam->printlist == 1) { $zip->addFile($studentlistpdffile); } // Add every student PDF to zip file $currentstudent = 0; foreach ($studentinfo as $stinfo) { $currentstudent++; if ($pbar != null) { $pbar->update($currentstudent, count($studentinfo), get_string('printing', 'mod_emarking') . ' ' . $stinfo->name); } if (!isset($stinfo->examfile) || !file_exists($stinfo->examfile)) { continue; } if (!$zip->addFile($stinfo->examfile, $stinfo->pdffilename . '.pdf')) { $zipdebugmsg .= "Problems adding {$stinfo->examfile} to ZIP file using name {$stinfo->pdffilename} <hr>"; } } $zip->close(); if ($CFG->debug || $debugprinting) { echo $zipdebugmsg; } // Notify everyone that the exam was downloaded emarking_send_examdownloaded_notification($downloadexam, $course); $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT; $downloadexam->printdate = time(); $DB->update_record('emarking_exams', $downloadexam); // Read zip file from disk and send to the browser $file_name = basename($zipfilename); header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=" . $examfilename . ".zip"); header("Content-Length: " . filesize($zipfilename)); readfile($zipfilename); exit; } // We create the final big PDF file $pdf = new FPDI(); $pdf->SetPrintHeader(false); $pdf->SetPrintFooter(false); // We import the students list if required if ($downloadexam->printlist) { emarking_import_pdf_into_pdf($pdf, $studentlistpdffile); } // Add every student PDF to zip file $currentstudent = 0; foreach ($studentinfo as $stinfo) { $currentstudent++; if (!isset($stinfo->examfile) || !file_exists($stinfo->examfile)) { continue; } emarking_import_pdf_into_pdf($pdf, $stinfo->examfile); } // Notify everyone that the exam was downloaded emarking_send_examdownloaded_notification($downloadexam, $course); $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT; $downloadexam->printdate = time(); $DB->update_record('emarking_exams', $downloadexam); $pdf->Output($examfilename . '.pdf', 'D'); }
$PAGE->set_popup_notification_allowed(false); $PAGE->set_url($url); $PAGE->set_context($context); $PAGE->set_course($course); $PAGE->set_cm($cm); $PAGE->set_title($title); $PAGE->set_heading($course->fullname); echo $OUTPUT->header(); echo $OUTPUT->heading($title); if ($upload) { $answersform = new emarking_upload_answers_form(null, array('cmid' => $cm->id)); if ($answersform->get_data()) { // Save uploaded file in Moodle filesystem and check $fs = get_file_storage(); $fs->delete_area_files($context->id, 'mod_emarking', 'upload', $quiz->id); $file = $answersform->save_stored_file('answersfile', $context->id, 'mod_emarking', 'upload', $quiz->id, '/', emarking_clean_filename($answersform->get_new_filename('answersfile'))); // Validate that file was correctly uploaded if (!$file) { print_error("Could not upload file"); } // Check that the file is a zip if ($file->get_mimetype() !== 'text/csv') { echo $OUTPUT->error_text(get_string('fileisnotcsv', 'mod_emarking')); echo $OUTPUT->continue_button($urlquizzes); echo $OUTPUT->footer(); die; } $iid = csv_import_reader::get_new_iid('emarking'); $reader = new csv_import_reader($iid, 'emarking'); $reader->load_csv_content($file->get_content(), 'utf8', $answersform->get_data()->delimiter_name); if (count($reader->get_columns()) < 3 || $reader->get_columns()[0] !== 'userid' || $reader->get_columns()[1] !== 'attemptid') {
function validation($data, $files) { global $CFG, $COURSE, $USER, $DB; require_once $CFG->dirroot . "/mod/emarking/print/locallib.php"; if ($data["type"] < 0 || $data["type"] > 5) { return array("type" => get_string("markingtypemandatory", "mod_emarking")); } // Calculates context for validating permissions // If we have the module available, we use it, otherwise we fallback to course $ctx = context_course::instance($COURSE->id); if ($this->current && $this->current->coursemodule) { $cm = get_coursemodule_from_id('emarking', $this->current->module, $COURSE->id); if ($cm) { $ctx = context_module::instance($cm->id); } } $errors = array(); // Verify that we have enough markers if ($data['type'] == EMARKING_TYPE_MARKER_TRAINING) { // Get all users with permission to grade in emarking $markers = get_enrolled_users($ctx, 'mod/emarking:grade'); $totalmarkers = 0; foreach ($markers as $marker) { if (has_capability('mod/emarking:supervisegrading', $ctx, $marker)) { continue; } $totalmarkers++; } if ($totalmarkers < 2) { $errors['type'] = get_string('notenoughmarkersfortraining', 'mod_emarking'); return $errors; } return $errors; } // Get the exam if we are updating an emarking activity $exam = null; if (isset($data['exam']) && $data['exam'] > 0) { if (!($exam = $DB->get_record("emarking_exams", array("id" => $data["exam"])))) { $errors["exam"] = "Invalid data from form"; } } // If there is no associated exam yet if (!$exam) { // The exam date comes from the date selector $examdate = new DateTime(); $examdate->setTimestamp(usertime($data['examdate'])); // Day of week from 0 Sunday to 6 Saturday $examw = date("w", $examdate->getTimestamp()); // Hour of the day un 00 to 23 format $examh = date("H", $examdate->getTimestamp()); // If minimum days for printing is enabled if (isset($CFG->emarking_minimumdaysbeforeprinting) && $CFG->emarking_minimumdaysbeforeprinting > 0) { // Sundays are forbidden, saturdays from 6am to 4pm TODO: Move this settings to eMarking settings if ($examw == 0 || $examw == 6 && ($examh < 6 || $examh > 16)) { $errors['examdate'] = get_string('examdateinvaliddayofweek', 'mod_emarking'); } // User date. Important because the user sees a date selector based on her timezone settings, not the server's $date = usertime(time()); // Today is the date according to the user's timezone $today = new DateTime(); $today->setTimestamp($date); // We have a minimum difference otherwise we wouldn't be in this part of the code $mindiff = intval($CFG->emarking_minimumdaysbeforeprinting); // If today is saturday or sunday, demand for a bigger difference $todayw = date("w", $today->getTimestamp()); $todayw = $todayw ? $todayw : 7; if ($todayw > 5) { $mindiff += $todayw - 5; } // DateInterval calculated with diff $diff = $today->diff($examdate, false); // The difference using the invert from DateInterval so we know it is in the past $realdiff = $diff->days * ($diff->invert ? -1 : 1); // If the difference is not enough, show an error if ($realdiff < $mindiff) { $a = new stdClass(); $a->mindays = $mindiff; $errors['examdate'] = get_string('examdateinvalid', 'mod_emarking', $a); } } } // If there's no previous exam to associate, and we are creating a new // e-marking, we need the PDF file if ($data["exam"] == 0 && !$this->_instance) { // We get the draftid from the form $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($COURSE->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); if (!is_numeric($numpages) || $numpages < 1) { $errors["exam_files"] = get_string('invalidpdfnopages', 'mod_emarking'); return $errors; } if ($numpagesprevious >= 0 && $numpagesprevious != $numpages) { $errors["exam_files"] = get_string('invalidpdfnumpagesforms', 'mod_emarking'); return $errors; } $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } if (count($exampdfs) == 0) { $errors["exam_files"] = get_string('invalidpdfnopages', 'mod_emarking'); return $errors; } } // Validate the adjusted slope $adjustslope = isset($data['adjustslope']) ? $data['adjustslope'] : false; $adjustslopescore = isset($data['adjustslopescore']) ? $data['adjustslopescore'] : 0; $adjustslopegrade = isset($data['adjustslopegrade']) ? $data['adjustslopegrade'] : 0; $grademin = $data['grademin']; $grademax = $data['grade']; $regradesopendate = $data['regradesopendate']; $regradesclosedate = $data['regradesclosedate']; // Make sure the minimum score is not greater than the maximum score if ($grademin >= $grademax) { $errors['grademin'] = get_string('gradescheck', 'mod_emarking'); $errors['grade'] = get_string('gradescheck', 'mod_emarking'); } // If we are adjusting the slope if ($adjustslope) { // Make sure the grade is greater than the minimum grade if ($adjustslopegrade <= $grademin) { $errors['adjustslopegrade'] = get_string('adjustslopegrademustbegreaterthanmin', 'mod_emarking'); } // Make sure the grade is lower than the maximum grade if ($adjustslopegrade > $grademax) { $errors['adjustslopegrade'] = get_string('adjustslopegrademustbelowerthanmax', 'mod_emarking'); } // And that the score for adjusting is greater than 0 if ($adjustslopescore <= 0) { $errors['adjustslopescore'] = get_string('adjustslopescoregreaterthanzero', 'mod_emarking'); } } // Validate regrade dates if ($regradesopendate > $regradesclosedate) { $errors['regradesopendate'] = get_string('verifyregradedate', 'mod_emarking'); $errors['regradesclosedate'] = get_string('verifyregradedate', 'mod_emarking'); } // Validate custom marks $custommarks = isset($data['custommarks']) ? $data['custommarks'] : ''; $custommarks = str_replace('\\r\\n', '\\n', $custommarks); if (strlen($custommarks) > 0) { $parts = explode("\n", $custommarks); $linenumber = 0; foreach ($parts as $line) { $linenumber++; if (strlen(trim($line)) == 0) { continue; } $subparts = explode("#", $line); if (count($subparts) != 2) { if (!isset($errors['custommarks'])) { $errors['custommarks'] = get_string('invalidcustommarks', 'mod_emarking'); } $errors['custommarks'] .= "{$linenumber} "; } } } $qualitycontrol = isset($data['enablequalitycontrol']) ? $data['enablequalitycontrol'] : false; if ($data['type'] == EMARKING_TYPE_NORMAL && $qualitycontrol) { // Get all users with permission to grade in emarking // Get all users with permission to grade in emarking $markers = get_enrolled_users($ctx, 'mod/emarking:grade'); $totalmarkers = 0; foreach ($markers as $marker) { if (isset($data['marker-' . $marker->id])) { $totalmarkers++; } } if ($totalmarkers == 0) { $errors['markers'] = get_string('notenoughmarkersforqualitycontrol', 'mod_emarking'); } } if ($data["exam"] > 0 && $this->_instance) { $previousexam = $DB->get_record("emarking_exams", array("emarking" => $this->_instance)); if ($previousexam && $previousexam->id != $data["exam"]) { $errors["exam"] = "An exam is already assigned for this emarking activity"; } } return $errors; }
} // We get the draftid from the form $draftid = file_get_submitted_draft_itemid('exam_files'); $usercontext = context_user::instance($USER->id); $fs = get_file_storage(); $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftid); $tempdir = emarking_get_temp_dir_path($course->id); emarking_initialize_directory($tempdir, true); $numpagesprevious = -1; $exampdfs = array(); foreach ($files as $uploadedfile) { if ($uploadedfile->get_mimetype() !== 'application/pdf') { continue; } $filename = $uploadedfile->get_filename(); $filename = emarking_clean_filename($filename); $newfilename = $tempdir . '/' . $filename; $pdffile = emarking_get_path_from_hash($tempdir, $uploadedfile->get_pathnamehash()); // Executes pdftk burst to get all pages separated $numpages = emarking_pdf_count_pages($newfilename, $tempdir, false); if (!is_numeric($numpages) || $numpages < 1 || $numpagesprevious >= 0 && $numpagesprevious != $numpages) { echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('error')); echo $OUTPUT->error_text(get_string('invalidpdfnopages', 'mod_emarking')); echo $OUTPUT->continue_button($cancelurl); die; } $exampdfs[] = array('pathname' => $pdffile, 'filename' => $filename); } $studentsnumber = emarking_get_students_count_for_printing($course->id); // A new exam object is created and its attributes filled from form data
/** * Esta funcion copia el archivo solicitado mediante el Hash (lo busca en la base de datos) en la carpeta temporal especificada. * * @param String $tempdir * Carpeta a la cual queremos copiar el archivo * @param String $hash * hash del archivo en base de datos * @param String $prefix * ??? * @return mixed */ function emarking_get_path_from_hash($tempdir, $hash, $prefix = '', $create = true) { global $CFG; // Obtiene filesystem. $fs = get_file_storage(); // Obtiene archivo gracias al hash. if (!($file = $fs->get_file_by_hash($hash))) { return false; } // Se copia archivo desde Moodle a temporal. $newfile = emarking_clean_filename($tempdir . '/' . $prefix . $file->get_filename()); $file->copy_content_to($newfile); return $newfile; }
/** * Creates a personalized exam file. * * @param unknown $examid * @return NULL */ function emarking_download_exam($examid, $multiplepdfs = false, $groupid = null, $pbar = null, $sendprintorder = false, $printername = null) { global $DB, $CFG, $USER, $OUTPUT; // Se obtiene el examen if (!($downloadexam = $DB->get_record('emarking_exams', array('id' => $examid)))) { return null; } // Contexto del curso para verificar permisos $context = context_course::instance($downloadexam->course); if (!has_capability('mod/emarking:downloadexam', $context)) { return null; } // Verify that remote printing is enable, otherwise disable a printing order if ($sendprintorder && (!$CFG->emarking_enableprinting || $printername == null)) { return null; } $course = $DB->get_record('course', array('id' => $downloadexam->course)); $coursecat = $DB->get_record('course_categories', array('id' => $course->category)); if ($downloadexam->printrandom == 1) { $enrolincludes = 'manual,self,meta'; } else { $enrolincludes = 'manual,self'; } if ($CFG->emarking_enrolincludes && strlen($CFG->emarking_enrolincludes) > 1) { $enrolincludes = $CFG->emarking_enrolincludes; } if (isset($downloadexam->enrolments) && strlen($downloadexam->enrolments) > 1) { $enrolincludes = $downloadexam->enrolments; } $enrolincludes = explode(",", $enrolincludes); // Get all the files uploaded as forms for this exam $fs = get_file_storage(); $files = $fs->get_area_files($context->id, 'mod_emarking', 'exams', $examid); // We filter only the PDFs $pdffileshash = array(); foreach ($files as $filepdf) { if ($filepdf->get_mimetype() === 'application/pdf') { $pdffileshash[] = array('hash' => $filepdf->get_pathnamehash(), 'filename' => $filepdf->get_filename()); } } // Verify that at least we have a PDF if (count($pdffileshash) < 1) { return null; } if ($downloadexam->headerqr == 1) { if ($groupid != null) { $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}" . "/group_" . $groupid; } else { $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}"; } $fileimg = $CFG->dataroot . "/temp/emarking/{$context->id}/qr"; $userimgdir = $CFG->dataroot . "/temp/emarking/{$context->id}/u"; emarking_initialize_directory($filedir, true); emarking_initialize_directory($fileimg, true); emarking_initialize_directory($userimgdir, true); if ($groupid != null) { // Se toman los resultados del query dentro de una variable. $students = emarking_get_students_of_groups($downloadexam->course, $groupid); } else { // Se toman los resultados del query dentro de una variable. $students = emarking_get_students_for_printing($downloadexam->course); } $nombre = array(); $current = 0; // Los resultados del query se recorren mediante un foreach loop. foreach ($students as $student) { if (array_search($student->enrol, $enrolincludes) === false) { continue; } $nombre[] = substr("{$student->lastname}, {$student->firstname}", 0, 65); $rut[] = $student->idnumber; $moodleid[] = $student->id; // Get the image file for student $imgfound = false; if ($CFG->emarking_pathuserpicture && is_dir($CFG->emarking_pathuserpicture)) { $idstring = "" . $student->idnumber; $revid = strrev($idstring); $idpath = $CFG->emarking_pathuserpicture; $idpath .= "/" . substr($revid, 0, 1); $idpath .= "/" . substr($revid, 1, 1); if (file_exists($idpath . "/user{$idstring}.png")) { $userimg[] = $idpath . "/user{$idstring}.png"; $imgfound = true; } } if (!$imgfound) { $usercontext = context_user::instance($student->id); $imgfile = $DB->get_record('files', array('contextid' => $usercontext->id, 'component' => 'user', 'filearea' => 'icon', 'filename' => 'f1.png')); if ($imgfile) { $userimg[] = emarking_get_path_from_hash($userimgdir, $imgfile->pathnamehash, "u" . $student->id, true); } else { $userimg[] = $CFG->dirroot . "/pix/u/f1.png"; } } } $numberstudents = count($nombre); for ($i = $numberstudents; $i < $numberstudents + $downloadexam->extraexams; $i++) { $nombre[$i] = '..............................................................................'; $rut[$i] = '0'; $moodleid[$i] = '0'; $userimg[$i] = $CFG->dirroot . "/pix/u/f1.png"; } $newfile = emarking_get_path_from_hash($filedir, $pdffileshash[$current]['hash']); $path = $filedir . "/" . str_replace(' ', '-', $pdffileshash[$current]['filename']); $hash = hash_file('md5', $path); $logoisconfigured = false; if ($logofile = emarking_get_logo_file()) { $logofilepath = emarking_get_path_from_hash($filedir, $logofile->get_pathnamehash()); $logoisconfigured = true; } $file1 = $filedir . "/" . emarking_clean_filename($course->shortname, true) . "_" . emarking_clean_filename($downloadexam->name, true) . ".pdf"; $pdf = new FPDI(); $cp = $pdf->setSourceFile($path); if ($cp > 99) { print_error(get_string('page', 'mod_emarking')); } if ($multiplepdfs || $groupid != null) { $zip = new ZipArchive(); if ($groupid != null) { $file1 = $filedir . "/" . emarking_clean_filename($course->shortname, true) . "_" . "GRUPO_" . $groupid . "_" . emarking_clean_filename($downloadexam->name, true) . ".zip"; } else { $file1 = $filedir . "/" . emarking_clean_filename($course->shortname, true) . "_" . emarking_clean_filename($downloadexam->name, true) . ".zip"; } if ($zip->open($file1, ZipArchive::CREATE) !== true) { return null; } } if ($sendprintorder) { if ($pbar != null) { $pbar->update(0, count($nombre), ''); } } $jobs[] = array(); if ($downloadexam->printlist == 1) { $flag = 0; // lista de alumnos if ($flag == 0) { $pdf->SetAutoPageBreak(false); $pdf->AddPage(); $left = 85; $top = 8; $pdf->SetFont('Helvetica', 'B', 12); $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper("LISTA DE ALUMNOS")); $left = 15; $top = 16; $pdf->SetFont('Helvetica', '', 8); $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper("Asignatura: " . $course->fullname)); $left = 15; $top = 22; $pdf->SetFont('Helvetica', '', 8); $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper("N° Inscritos: " . count($nombre))); // $year = date("Y"); // $month= date("F"); // $day= date("m"); setlocale(LC_ALL, "es_ES"); $left = 15; $top = 28; $pdf->SetFont('Helvetica', '', 8); $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper("Fecha: " . strftime("%A %d de %B del %Y"))); $left = 15; $top = 36; $pdf->SetXY($left, $top); $pdf->Cell(10, 10, "N°", 1, 0, 'L'); $pdf->Cell(120, 10, "Nombres", 1, 0, 'L'); $pdf->Cell(50, 10, "Firmas", 1, 0, 'L'); $t = 0; $t2 = 46; for ($a = 0; $a <= count($nombre) - 1; $a++) { if ($n == 24 || $n == 48 || $n == 72 || $n == 96 || $n == 120) { $pdf->AddPage(); $t = 0; $t2 = 8; } $top = $t2 + $t; $n = $a + 1; $pdf->SetFont('Helvetica', '', 8); $pdf->SetXY($left, $top); $pdf->Cell(10, 10, $n . ")", 1, 0, 'L'); $pdf->Cell(120, 10, core_text::strtoupper($nombre[$a]), 1, 0, 'L'); $pdf->Cell(50, 10, "", 1, 0, 'L'); // $pdf->Write ( 1, core_text::strtoupper ( $nombre [$a] ) ); $t = $t + 10; } $flag = 1; if ($multiplepdfs || $groupid != null) { if ($groupid != null) { $pdffile = $filedir . "/Lista_de_alumnos_" . "GRUPO_" . $groupid . ".pdf"; $pdf->Output($pdffile, "F"); // se genera el nuevo pdf $zip->addFile($pdffile, "GRUPO_" . $groupid . ".pdf"); } else { $pdffile = $filedir . "/Lista_de_alumnos_" . emarking_clean_filename($course->shortname, true) . ".pdf"; $pdf->Output($pdffile, "F"); // se genera el nuevo pdf $zip->addFile($pdffile, "Lista_de_alumnos_" . emarking_clean_filename($course->shortname, true) . ".pdf"); } } $printername = explode(',', $CFG->emarking_printername); if ($sendprintorder) { if ($printername[$_POST["printername"]] != "Edificio-C-mesonSecretaria") { $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=UpperLeft -o fit-to-page -o media=Letter " . $pdffile; } else { $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=SinglePortrait -o PageSize=Letter -o Duplex=none " . $pdffile; } $printresult = exec($command); if ($CFG->debug) { echo "{$command} <br>"; echo "{$printresult} <hr>"; } } } } // Here we produce a PDF file for each student for ($k = 0; $k <= count($nombre) - 1; $k++) { // If there are multiplepdfs we have to produce one per student if ($multiplepdfs || $sendprintorder || $groupid != null) { $pdf = new FPDI(); } if ($multiplepdfs || $sendprintorder || $groupid != null || count($pdffileshash) > 1) { $current++; if ($current > count($pdffileshash) - 1) { $current = 0; } $newfile = emarking_get_path_from_hash($filedir, $pdffileshash[$current]['hash']); $path = $filedir . "/" . str_replace(' ', '-', $pdffileshash[$current]['filename']); $cp = $pdf->setSourceFile($path); } $pdf->SetAutoPageBreak(false); for ($i = 1; $i <= $cp + $downloadexam->extrasheets; $i = $i + 1) { $h = rand(1, 999999); $img = $fileimg . "/qr" . $h . "_" . $rut[$k] . "_" . $i . "_" . $hash . ".png"; $imgrotated = $fileimg . "/qr" . $h . "_" . $rut[$k] . "_" . $i . "_" . $hash . "r.png"; // Se genera QR con id, curso y número de página $qrstring = "{$moodleid[$k]} - {$downloadexam->course} - {$i}"; QRcode::png($qrstring, $img); // se inserta QR QRcode::png($qrstring . " - R", $imgrotated); // se inserta QR $gdimg = imagecreatefrompng($imgrotated); $rotated = imagerotate($gdimg, 180, 0); imagepng($rotated, $imgrotated); $pdf->AddPage(); // Agrega una nueva página if ($i <= $cp) { $tplIdx = $pdf->importPage($i); // Se importan las páginas del documento pdf. $pdf->useTemplate($tplIdx, 0, 0, 0, 0, $adjustPageSize = true); // se inserta como template el archivo pdf subido } /* * Ahora se escribe texto sobre las páginas ya importadas. Se fija la fuente, el tipo y el tamaño de la letra. Se señala el título. Se da el nombre, apellido y rut del alumno al cual pertenece la prueba. Se indica el curso correspondiente a la evaluación. Se introduce una imagen. Esta corresponde al QR que se genera con los datos */ if ($CFG->emarking_includelogo && $logoisconfigured) { $pdf->Image($logofilepath, 2, 8, 30); } $left = 58; $top = 8; $pdf->SetFont('Helvetica', '', 12); $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper($downloadexam->name)); $pdf->SetFont('Helvetica', '', 9); $top += 5; $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper(get_string('name') . ": " . $nombre[$k])); $top += 4; if ($rut[$k] && strlen($rut[$k]) > 0) { $pdf->SetXY($left, $top); $pdf->Write(1, get_string('idnumber', 'mod_emarking') . ": " . $rut[$k]); $top += 4; } $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper(get_string('course') . ": " . $course->fullname)); $top += 4; if (file_exists($userimg[$k])) { $pdf->Image($userimg[$k], 35, 8, 15, 15, "PNG", null, "T", true); } $totals = new stdClass(); $totals->identified = $i; $totals->total = $cp + $downloadexam->extrasheets; $pdf->SetXY($left, $top); $pdf->Write(1, core_text::strtoupper(get_string('page') . ": " . get_string('aofb', 'mod_emarking', $totals))); $pdf->Image($img, 176, 3, 34); // y antes era -2 $pdf->Image($imgrotated, 0, $pdf->getPageHeight() - 35, 34); unlink($img); unlink($imgrotated); } if ($multiplepdfs || $sendprintorder || $groupid != null) { $pdffile = $filedir . "/" . emarking_clean_filename($qrstring) . ".pdf"; if (file_exists($pdffile)) { $pdffile = $filedir . "/" . emarking_clean_filename($qrstring) . "_" . $k . ".pdf"; $pdf->Output($pdffile, "F"); // se genera el nuevo pdf $zip->addFile($pdffile, emarking_clean_filename($qrstring) . "_" . $k . ".pdf"); } else { $pdffile = $filedir . "/" . emarking_clean_filename($qrstring) . ".pdf"; $pdf->Output($pdffile, "F"); // se genera el nuevo pdf $zip->addFile($pdffile, emarking_clean_filename($qrstring) . ".pdf"); } $jobs[$k]["param_1_pbar"] = $k + 1; $jobs[$k]["param_2_pbar"] = count($nombre); $jobs[$k]["param_3_pbar"] = 'Imprimiendo pruebas de ' . core_text::strtoupper($nombre[$k]); $jobs[$k]["name_job"] = $pdffile; } } $printername = explode(',', $CFG->emarking_printername); if ($sendprintorder) { foreach ($jobs as &$valor) { if (!empty($valor)) { if ($pbar != null) { $pbar->update($valor["param_1_pbar"], $valor["param_2_pbar"], $valor["param_3_pbar"]); } if ($printername[$_POST["printername"]] != "Edificio-C-mesonSecretaria") { $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=UpperLeft -o fit-to-page -o media=Letter " . $valor["name_job"]; } else { $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=SinglePortrait -o PageSize=Letter -o Duplex=none " . $valor["name_job"]; } $printresult = exec($command); if ($CFG->debug) { echo "{$command} <br>"; echo "{$printresult} <hr>"; } } } } if ($multiplepdfs || $groupid != null) { // Generate Bat File $printerarray = array(); foreach (explode(',', $CFG->emarking_printername) as $printer) { $printerarray[] = $printer; } $contenido = "@echo off\r\n"; $contenido .= "TITLE Sistema de impresion\r\n"; $contenido .= "color ff\r\n"; $contenido .= "cls\r\n"; $contenido .= ":MENUPPL\r\n"; $contenido .= "cls\r\n"; $contenido .= "echo #######################################################################\r\n"; $contenido .= "echo # Sistema de impresion #\r\n"; $contenido .= "echo # #\r\n"; $contenido .= "echo # @copyright 2014 Eduardo Miranda #\r\n"; $contenido .= "echo # Fecha Modificacion 23-04-2014 #\r\n"; $contenido .= "echo # #\r\n"; $contenido .= "echo # Para realizar la impresion debe seleccionar una de las impresoras #\r\n"; $contenido .= "echo # configuradas. #\r\n"; $contenido .= "echo # #\r\n"; $contenido .= "echo # #\r\n"; $contenido .= "echo #######################################################################\r\n"; $contenido .= "echo # Seleccione una impresora: #\r\n"; $i = 0; while ($i < count($printerarray)) { $contenido .= "echo # " . $i . " - " . $printerarray[$i] . " #\r\n"; $i++; } $contenido .= "echo # " . $i++ . " - Cancelar #\r\n"; $contenido .= "echo # #\r\n"; $contenido .= "echo #######################################################################\r\n"; $contenido .= "set /p preg01= Que desea hacer? ["; $i = 0; while ($i <= count($printerarray)) { if ($i == count($printerarray)) { $contenido .= $i; } else { $contenido .= $i . ","; } $i++; } $contenido .= "]\r\n"; $i = 0; while ($i < count($printerarray)) { $contenido .= "if %preg01%==" . $i . " goto MENU" . $i . "\r\n"; $i++; } $contenido .= "if %preg01%==" . $i++ . " goto SALIR\r\n"; $contenido .= "goto MENU\r\n"; $contenido .= "pause\r\n"; $i = 0; while ($i < count($printerarray)) { $contenido .= ":MENU" . $i . "\r\n"; $contenido .= "cls\r\n"; $contenido .= "set N=%Random%%random%\r\n"; $contenido .= "plink central.apuntes mkdir -m 0777 ~/pruebas/%N%\r\n"; $contenido .= "pscp *.pdf central.apuntes:pruebas/%N%\r\n"; $contenido .= "plink central.apuntes cp ~/pruebas/script_pruebas.sh ~/pruebas/%N%\r\n"; $contenido .= "plink central.apuntes cd pruebas/%N%;./script_pruebas.sh " . $printerarray[$i] . "\r\n"; $contenido .= "plink central.apuntes rm -dfr ~/pruebas/%N%\r\n"; $contenido .= "EXIT\r\n"; $i++; } $contenido .= ":SALIR\r\n"; $contenido .= "CLS\r\n"; $contenido .= "ECHO Cancelando...\r\n"; $contenido .= "EXIT\r\n"; $random = rand(); mkdir($CFG->dataroot . '/temp/emarking/' . $random . '_bat/', 0777); // chmod($random."_bat/", 0777); $fp = fopen($CFG->dataroot . "/temp/emarking/" . $random . "_bat/imprimir.bat", "x"); fwrite($fp, $contenido); fclose($fp); // Generate zip file $zip->addFile($CFG->dataroot . "/temp/emarking/" . $random . "_bat/imprimir.bat", "imprimir.bat"); $zip->close(); unlink($CFG->dataroot . "/temp/emarking/" . $random . "_bat/imprimir.bat"); rmdir($CFG->dataroot . "/temp/emarking/" . $random . "_bat"); } else { if (!$sendprintorder) { $pdf->Output($file1, "F"); // se genera el nuevo pdf } } $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT; $downloadexam->printdate = time(); $DB->update_record('emarking_exams', $downloadexam); if ($sendprintorder) { $pbar->update_full(100, 'Impresión completada exitosamente'); return $filedir; } if ($groupid != null) { unlink($file1); return $filedir; } else { ob_start(); // modificación: ingreso de esta linea, ya que anterior revisión mostraba error en el archivo header('Content-Description: File Transfer'); header('Content-Type: application/x-download'); header('Content-Disposition: attachment; filename=' . basename($file1)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); ob_clean(); flush(); readfile($file1); unlink($file1); // borra archivo temporal en moodledata exit; } return false; } else { $students = emarking_get_students_for_printing($downloadexam->course); $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}"; emarking_initialize_directory($filedir, true); $printername = explode(',', $CFG->emarking_printername); $totalAlumn = 0; $pdffiles = array(); for ($current = 0; $current < count($pdffileshash); $current++) { $newfile = emarking_get_path_from_hash($filedir, $pdffileshash[$current]['hash']); $path = $filedir . "/" . str_replace(' ', '-', $pdffileshash[$current]['filename']); $pdf = new FPDI(); $cp = $pdf->setSourceFile($path); if ($cp > 99) { print_error(get_string('page', 'mod_emarking')); } $pdf->SetAutoPageBreak(false); $s = 1; while ($s <= $cp + $downloadexam->extrasheets) { $pdf->AddPage(); if ($s <= $cp) { $tplIdx = $pdf->importPage($s); // Se importan las páginas del documento pdf. $pdf->useTemplate($tplIdx, 0, 0, 0, 0, $adjustPageSize = true); // se inserta como template el archivo pdf subido } $s++; } $pdffile = $filedir . "/" . $current . emarking_clean_filename($file->filename); $pdf->Output($pdffile, "F"); $pdffiles[] = $pdffile; } $totalAlumn = count($students); if ($pbar != null) { $pbar->update(0, $totalAlumn, ''); } for ($k = 0; $k <= $totalAlumn + $downloadexam->extraexams - 1; $k++) { $pdffile = $pdffiles[$k % count($pdffileshash)]; if ($printername[$_POST["printername"]] != "Edificio-C-mesonSecretaria") { $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=UpperLeft -o fit-to-page -o media=Letter " . $pdffile; } else { $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=SinglePortrait -o PageSize=Letter -o Duplex=none " . $pdffile; } // $printresult = exec ( $command ); if ($CFG->debug) { echo "{$command} <br>"; echo "{$printresult} <hr>"; } if ($pbar != null) { $pbar->update($k, $totalAlumn, ''); } } $pbar->update_full(100, 'Impresión completada exitosamente'); return true; /* * $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT; $downloadexam->printdate = time (); $DB->update_record ( 'emarking_exams', $downloadexam ); $downloadURL = $CFG->wwwroot . '/pluginfile.php/' . $file->contextid . '/mod_emarking/' . $file->filearea . '/' . $file->itemid . '/' . $file->filename; $startdownload = true; echo '<meta http-equiv="refresh" content="2;url=' . $downloadURL . '">'; return true; */ } }