|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 require_once($CFG->libdir.'/formslib.php'); 00003 require_once($CFG->libdir . '/portfoliolib.php'); 00004 require_once($CFG->dirroot . '/mod/assignment/lib.php'); 00005 require_once($CFG->libdir . '/filelib.php'); 00006 00011 class assignment_online extends assignment_base { 00012 00013 var $filearea = 'submission'; 00014 00015 function assignment_online($cmid='staticonly', $assignment=NULL, $cm=NULL, $course=NULL) { 00016 parent::assignment_base($cmid, $assignment, $cm, $course); 00017 $this->type = 'online'; 00018 } 00019 00020 function view() { 00021 global $OUTPUT, $CFG, $USER, $PAGE; 00022 00023 $edit = optional_param('edit', 0, PARAM_BOOL); 00024 $saved = optional_param('saved', 0, PARAM_BOOL); 00025 00026 $context = get_context_instance(CONTEXT_MODULE, $this->cm->id); 00027 require_capability('mod/assignment:view', $context); 00028 00029 $submission = $this->get_submission($USER->id, false); 00030 00031 //Guest can not submit nor edit an assignment (bug: 4604) 00032 if (!is_enrolled($this->context, $USER, 'mod/assignment:submit')) { 00033 $editable = false; 00034 } else { 00035 $editable = $this->isopen() && (!$submission || $this->assignment->resubmit || !$submission->timemarked); 00036 } 00037 $editmode = ($editable and $edit); 00038 00039 if ($editmode) { 00040 // prepare form and process submitted data 00041 $editoroptions = array( 00042 'noclean' => false, 00043 'maxfiles' => EDITOR_UNLIMITED_FILES, 00044 'maxbytes' => $this->course->maxbytes, 00045 'context' => $this->context 00046 ); 00047 00048 $data = new stdClass(); 00049 $data->id = $this->cm->id; 00050 $data->edit = 1; 00051 if ($submission) { 00052 $data->sid = $submission->id; 00053 $data->text = $submission->data1; 00054 $data->textformat = $submission->data2; 00055 } else { 00056 $data->sid = NULL; 00057 $data->text = ''; 00058 $data->textformat = NULL; 00059 } 00060 00061 $data = file_prepare_standard_editor($data, 'text', $editoroptions, $this->context, 'mod_assignment', $this->filearea, $data->sid); 00062 00063 $mform = new mod_assignment_online_edit_form(null, array($data, $editoroptions)); 00064 00065 if ($mform->is_cancelled()) { 00066 redirect($PAGE->url); 00067 } 00068 00069 if ($data = $mform->get_data()) { 00070 $submission = $this->get_submission($USER->id, true); //create the submission if needed & its id 00071 00072 $data = file_postupdate_standard_editor($data, 'text', $editoroptions, $this->context, 'mod_assignment', $this->filearea, $submission->id); 00073 00074 $submission = $this->update_submission($data); 00075 00076 //TODO fix log actions - needs db upgrade 00077 add_to_log($this->course->id, 'assignment', 'upload', 'view.php?a='.$this->assignment->id, $this->assignment->id, $this->cm->id); 00078 $this->email_teachers($submission); 00079 00080 //redirect to get updated submission date and word count 00081 redirect(new moodle_url($PAGE->url, array('saved'=>1))); 00082 } 00083 } 00084 00085 add_to_log($this->course->id, "assignment", "view", "view.php?id={$this->cm->id}", $this->assignment->id, $this->cm->id); 00086 00088 if ($editmode) { 00089 $this->view_header(get_string('editmysubmission', 'assignment')); 00090 } else { 00091 $this->view_header(); 00092 } 00093 00094 $this->view_intro(); 00095 00096 $this->view_dates(); 00097 00098 if ($saved) { 00099 echo $OUTPUT->notification(get_string('submissionsaved', 'assignment'), 'notifysuccess'); 00100 } 00101 00102 if (is_enrolled($this->context, $USER)) { 00103 if ($editmode) { 00104 echo $OUTPUT->box_start('generalbox', 'onlineenter'); 00105 $mform->display(); 00106 } else { 00107 echo $OUTPUT->box_start('generalbox boxwidthwide boxaligncenter', 'online'); 00108 if ($submission && has_capability('mod/assignment:exportownsubmission', $this->context)) { 00109 $text = file_rewrite_pluginfile_urls($submission->data1, 'pluginfile.php', $this->context->id, 'mod_assignment', $this->filearea, $submission->id); 00110 echo format_text($text, $submission->data2, array('overflowdiv'=>true)); 00111 if ($CFG->enableportfolios) { 00112 require_once($CFG->libdir . '/portfoliolib.php'); 00113 $button = new portfolio_add_button(); 00114 $button->set_callback_options('assignment_portfolio_caller', array('id' => $this->cm->id), '/mod/assignment/locallib.php'); 00115 $fs = get_file_storage(); 00116 if ($files = $fs->get_area_files($this->context->id, 'mod_assignment', $this->filearea, $submission->id, "timemodified", false)) { 00117 $button->set_formats(PORTFOLIO_FORMAT_RICHHTML); 00118 } else { 00119 $button->set_formats(PORTFOLIO_FORMAT_PLAINHTML); 00120 } 00121 $button->render(); 00122 } 00123 } else if ($this->isopen()){ //fix for #4206 00124 echo '<div style="text-align:center">'.get_string('emptysubmission', 'assignment').'</div>'; 00125 } 00126 } 00127 echo $OUTPUT->box_end(); 00128 if (!$editmode && $editable) { 00129 if (!empty($submission)) { 00130 $submitbutton = "editmysubmission"; 00131 } else { 00132 $submitbutton = "addsubmission"; 00133 } 00134 echo "<div style='text-align:center'>"; 00135 echo $OUTPUT->single_button(new moodle_url('view.php', array('id'=>$this->cm->id, 'edit'=>'1')), get_string($submitbutton, 'assignment')); 00136 echo "</div>"; 00137 } 00138 00139 } 00140 00141 $this->view_feedback(); 00142 00143 $this->view_footer(); 00144 } 00145 00146 /* 00147 * Display the assignment dates 00148 */ 00149 function view_dates() { 00150 global $USER, $CFG, $OUTPUT; 00151 00152 if (!$this->assignment->timeavailable && !$this->assignment->timedue) { 00153 return; 00154 } 00155 00156 echo $OUTPUT->box_start('generalbox boxaligncenter', 'dates'); 00157 echo '<table>'; 00158 if ($this->assignment->timeavailable) { 00159 echo '<tr><td class="c0">'.get_string('availabledate','assignment').':</td>'; 00160 echo ' <td class="c1">'.userdate($this->assignment->timeavailable).'</td></tr>'; 00161 } 00162 if ($this->assignment->timedue) { 00163 echo '<tr><td class="c0">'.get_string('duedate','assignment').':</td>'; 00164 echo ' <td class="c1">'.userdate($this->assignment->timedue).'</td></tr>'; 00165 } 00166 $submission = $this->get_submission($USER->id); 00167 if ($submission) { 00168 echo '<tr><td class="c0">'.get_string('lastedited').':</td>'; 00169 echo ' <td class="c1">'.userdate($submission->timemodified); 00171 if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_WORDS) { 00172 echo ' ('.get_string('numwords', '', count_words(format_text($submission->data1, $submission->data2))).')</td></tr>'; 00173 } else if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_LETTERS) { 00174 echo ' ('.get_string('numletters', '', count_letters(format_text($submission->data1, $submission->data2))).')</td></tr>'; 00175 } 00176 } 00177 echo '</table>'; 00178 echo $OUTPUT->box_end(); 00179 } 00180 00181 function update_submission($data) { 00182 global $CFG, $USER, $DB; 00183 00184 $submission = $this->get_submission($USER->id, true); 00185 00186 $update = new stdClass(); 00187 $update->id = $submission->id; 00188 $update->data1 = $data->text; 00189 $update->data2 = $data->textformat; 00190 $update->timemodified = time(); 00191 00192 $DB->update_record('assignment_submissions', $update); 00193 00194 $submission = $this->get_submission($USER->id); 00195 $this->update_grade($submission); 00196 return $submission; 00197 } 00198 00199 00200 function print_student_answer($userid, $return=false){ 00201 global $OUTPUT; 00202 if (!$submission = $this->get_submission($userid)) { 00203 return ''; 00204 } 00205 00206 $link = new moodle_url("/mod/assignment/type/online/file.php?id={$this->cm->id}&userid={$submission->userid}"); 00207 $action = new popup_action('click', $link, 'file'.$userid, array('height' => 450, 'width' => 580)); 00208 $popup = $OUTPUT->action_link($link, shorten_text(trim(strip_tags(format_text($submission->data1,$submission->data2))), 15), $action, array('title'=>get_string('submission', 'assignment'))); 00209 00210 $output = '<div class="files">'. 00211 '<img src="'.$OUTPUT->pix_url('f/html') . '" class="icon" alt="html" />'. 00212 $popup . 00213 '</div>'; 00214 return $output; 00215 } 00216 00217 function print_user_files($userid, $return=false) { 00218 global $OUTPUT, $CFG; 00219 00220 if (!$submission = $this->get_submission($userid)) { 00221 return ''; 00222 } 00223 00224 $link = new moodle_url("/mod/assignment/type/online/file.php?id={$this->cm->id}&userid={$submission->userid}"); 00225 $action = new popup_action('click', $link, 'file'.$userid, array('height' => 450, 'width' => 580)); 00226 $popup = $OUTPUT->action_link($link, get_string('popupinnewwindow','assignment'), $action, array('title'=>get_string('submission', 'assignment'))); 00227 00228 $output = '<div class="files">'. 00229 '<img align="middle" src="'.$OUTPUT->pix_url('f/html') . '" height="16" width="16" alt="html" />'. 00230 $popup . 00231 '</div>'; 00232 00233 $wordcount = '<p id="wordcount">'. $popup . ' '; 00235 if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_WORDS) { 00236 $wordcount .= '('.get_string('numwords', '', count_words(format_text($submission->data1, $submission->data2))).')'; 00237 } else if ($CFG->assignment_itemstocount == ASSIGNMENT_COUNT_LETTERS) { 00238 $wordcount .= '('.get_string('numletters', '', count_letters(format_text($submission->data1, $submission->data2))).')'; 00239 } 00240 $wordcount .= '</p>'; 00241 00242 $text = file_rewrite_pluginfile_urls($submission->data1, 'pluginfile.php', $this->context->id, 'mod_assignment', $this->filearea, $submission->id); 00243 return $wordcount . format_text($text, $submission->data2, array('overflowdiv'=>true)); 00244 00245 00246 } 00247 00248 function preprocess_submission(&$submission) { 00249 if ($this->assignment->var1 && empty($submission->submissioncomment)) { // comment inline 00250 if ($this->usehtmleditor) { 00251 // Convert to html, clean & copy student data to teacher 00252 $submission->submissioncomment = format_text($submission->data1, $submission->data2); 00253 $submission->format = FORMAT_HTML; 00254 } else { 00255 // Copy student data to teacher 00256 $submission->submissioncomment = $submission->data1; 00257 $submission->format = $submission->data2; 00258 } 00259 } 00260 } 00261 00262 function setup_elements(&$mform) { 00263 global $CFG, $COURSE; 00264 00265 $ynoptions = array( 0 => get_string('no'), 1 => get_string('yes')); 00266 00267 $mform->addElement('select', 'resubmit', get_string('allowresubmit', 'assignment'), $ynoptions); 00268 $mform->addHelpButton('resubmit', 'allowresubmit', 'assignment'); 00269 $mform->setDefault('resubmit', 0); 00270 00271 $mform->addElement('select', 'emailteachers', get_string('emailteachers', 'assignment'), $ynoptions); 00272 $mform->addHelpButton('emailteachers', 'emailteachers', 'assignment'); 00273 $mform->setDefault('emailteachers', 0); 00274 00275 $mform->addElement('select', 'var1', get_string('commentinline', 'assignment'), $ynoptions); 00276 $mform->addHelpButton('var1', 'commentinline', 'assignment'); 00277 $mform->setDefault('var1', 0); 00278 00279 } 00280 00281 function portfolio_exportable() { 00282 return true; 00283 } 00284 00285 function portfolio_load_data($caller) { 00286 $submission = $this->get_submission(); 00287 $fs = get_file_storage(); 00288 if ($files = $fs->get_area_files($this->context->id, 'mod_assignment', $this->filearea, $submission->id, "timemodified", false)) { 00289 $caller->set('multifiles', $files); 00290 } 00291 } 00292 00293 function portfolio_get_sha1($caller) { 00294 $submission = $this->get_submission(); 00295 $textsha1 = sha1(format_text($submission->data1, $submission->data2)); 00296 $filesha1 = ''; 00297 try { 00298 $filesha1 = $caller->get_sha1_file(); 00299 } catch (portfolio_caller_exception $e) {} // no files 00300 return sha1($textsha1 . $filesha1); 00301 } 00302 00303 function portfolio_prepare_package($exporter, $user) { 00304 $submission = $this->get_submission($user->id); 00305 $options = portfolio_format_text_options(); 00306 $html = format_text($submission->data1, $submission->data2, $options); 00307 $html = portfolio_rewrite_pluginfile_urls($html, $this->context->id, 'mod_assignment', $this->filearea, $submission->id, $exporter->get('format')); 00308 if (in_array($exporter->get('formatclass'), array(PORTFOLIO_FORMAT_PLAINHTML, PORTFOLIO_FORMAT_RICHHTML))) { 00309 if ($files = $exporter->get('caller')->get('multifiles')) { 00310 foreach ($files as $f) { 00311 $exporter->copy_existing_file($f); 00312 } 00313 } 00314 return $exporter->write_new_file($html, 'assignment.html', !empty($files)); 00315 } else if ($exporter->get('formatclass') == PORTFOLIO_FORMAT_LEAP2A) { 00316 $leapwriter = $exporter->get('format')->leap2a_writer(); 00317 $entry = new portfolio_format_leap2a_entry('assignmentonline' . $this->assignment->id, $this->assignment->name, 'resource', $html); 00318 $entry->add_category('web', 'resource_type'); 00319 $entry->published = $submission->timecreated; 00320 $entry->updated = $submission->timemodified; 00321 $entry->author = $user; 00322 $leapwriter->add_entry($entry); 00323 if ($files = $exporter->get('caller')->get('multifiles')) { 00324 $leapwriter->link_files($entry, $files, 'assignmentonline' . $this->assignment->id . 'file'); 00325 foreach ($files as $f) { 00326 $exporter->copy_existing_file($f); 00327 } 00328 } 00329 $exporter->write_new_file($leapwriter->to_xml(), $exporter->get('format')->manifest_name(), true); 00330 } else { 00331 debugging('invalid format class: ' . $exporter->get('formatclass')); 00332 } 00333 } 00334 00335 function extend_settings_navigation($node) { 00336 global $PAGE, $CFG, $USER; 00337 00338 // get users submission if there is one 00339 $submission = $this->get_submission(); 00340 if (is_enrolled($PAGE->cm->context, $USER, 'mod/assignment:submit')) { 00341 $editable = $this->isopen() && (!$submission || $this->assignment->resubmit || !$submission->timemarked); 00342 } else { 00343 $editable = false; 00344 } 00345 00346 // If the user has submitted something add a bit more stuff 00347 if ($submission) { 00348 // Add a view link to the settings nav 00349 $link = new moodle_url('/mod/assignment/view.php', array('id'=>$PAGE->cm->id)); 00350 $node->add(get_string('viewmysubmission', 'assignment'), $link, navigation_node::TYPE_SETTING); 00351 00352 if (!empty($submission->timemodified)) { 00353 $submittednode = $node->add(get_string('submitted', 'assignment') . ' ' . userdate($submission->timemodified)); 00354 $submittednode->text = preg_replace('#([^,])\s#', '$1 ', $submittednode->text); 00355 $submittednode->add_class('note'); 00356 if ($submission->timemodified <= $this->assignment->timedue || empty($this->assignment->timedue)) { 00357 $submittednode->add_class('early'); 00358 } else { 00359 $submittednode->add_class('late'); 00360 } 00361 } 00362 } 00363 00364 if (!$submission || $editable) { 00365 // If this assignment is editable once submitted add an edit link to the settings nav 00366 $link = new moodle_url('/mod/assignment/view.php', array('id'=>$PAGE->cm->id, 'edit'=>1, 'sesskey'=>sesskey())); 00367 $node->add(get_string('editmysubmission', 'assignment'), $link, navigation_node::TYPE_SETTING); 00368 } 00369 } 00370 00371 public function send_file($filearea, $args) { 00372 global $USER; 00373 require_capability('mod/assignment:view', $this->context); 00374 00375 $fullpath = "/{$this->context->id}/mod_assignment/$filearea/".implode('/', $args); 00376 00377 $fs = get_file_storage(); 00378 if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) { 00379 send_file_not_found(); 00380 } 00381 00382 if (($USER->id != $file->get_userid()) && !has_capability('mod/assignment:grade', $this->context)) { 00383 send_file_not_found(); 00384 } 00385 00386 session_get_instance()->write_close(); // unlock session during fileserving 00387 send_stored_file($file, 60*60, 0, true); 00388 } 00389 00393 public function download_submissions() { 00394 global $CFG, $DB; 00395 00396 raise_memory_limit(MEMORY_EXTRA); 00397 00398 $submissions = $this->get_submissions('',''); 00399 if (empty($submissions)) { 00400 print_error('errornosubmissions', 'assignment'); 00401 } 00402 $filesforzipping = array(); 00403 00404 //NOTE: do not create any stuff in temp directories, we now support unicode file names and that would not work, sorry 00405 00406 //online assignment can use html 00407 $filextn=".html"; 00408 00409 $groupmode = groups_get_activity_groupmode($this->cm); 00410 $groupid = 0; // All users 00411 $groupname = ''; 00412 if ($groupmode) { 00413 $groupid = groups_get_activity_group($this->cm, true); 00414 $groupname = groups_get_group_name($groupid).'-'; 00415 } 00416 $filename = str_replace(' ', '_', clean_filename($this->course->shortname.'-'.$this->assignment->name.'-'.$groupname.$this->assignment->id.".zip")); //name of new zip file. 00417 foreach ($submissions as $submission) { 00418 $a_userid = $submission->userid; //get userid 00419 if ((groups_is_member($groupid,$a_userid)or !$groupmode or !$groupid)) { 00420 $a_assignid = $submission->assignment; //get name of this assignment for use in the file names. 00421 $a_user = $DB->get_record("user", array("id"=>$a_userid),'id,username,firstname,lastname'); //get user firstname/lastname 00422 $submissioncontent = "<html><body>". format_text($submission->data1, $submission->data2). "</body></html>"; //fetched from database 00423 //get file name.html 00424 $fileforzipname = clean_filename(fullname($a_user) . "_" .$a_userid.$filextn); 00425 $filesforzipping[$fileforzipname] = array($submissioncontent); 00426 } 00427 } //end of foreach 00428 00429 if ($zipfile = assignment_pack_files($filesforzipping)) { 00430 send_temp_file($zipfile, $filename); //send file and delete after sending. 00431 } 00432 } 00433 } 00434 00435 class mod_assignment_online_edit_form extends moodleform { 00436 function definition() { 00437 $mform = $this->_form; 00438 00439 list($data, $editoroptions) = $this->_customdata; 00440 00441 // visible elements 00442 $mform->addElement('editor', 'text_editor', get_string('submission', 'assignment'), null, $editoroptions); 00443 $mform->setType('text_editor', PARAM_RAW); // to be cleaned before display 00444 $mform->addRule('text_editor', get_string('required'), 'required', null, 'client'); 00445 00446 // hidden params 00447 $mform->addElement('hidden', 'id'); 00448 $mform->setType('id', PARAM_INT); 00449 00450 $mform->addElement('hidden', 'edit'); 00451 $mform->setType('edit', PARAM_INT); 00452 00453 // buttons 00454 $this->add_action_buttons(); 00455 00456 $this->set_data($data); 00457 } 00458 } 00459 00460