|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 // This file is part of Moodle - http://moodle.org/ 00003 // 00004 // Moodle is free software: you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation, either version 3 of the License, or 00007 // (at your option) any later version. 00008 // 00009 // Moodle is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU General Public License 00015 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00016 00027 require_once($CFG->libdir.'/eventslib.php'); 00029 require_once($CFG->dirroot.'/calendar/lib.php'); 00030 00031 define('FEEDBACK_ANONYMOUS_YES', 1); 00032 define('FEEDBACK_ANONYMOUS_NO', 2); 00033 define('FEEDBACK_MIN_ANONYMOUS_COUNT_IN_GROUP', 2); 00034 define('FEEDBACK_DECIMAL', '.'); 00035 define('FEEDBACK_THOUSAND', ','); 00036 define('FEEDBACK_RESETFORM_RESET', 'feedback_reset_data_'); 00037 define('FEEDBACK_RESETFORM_DROP', 'feedback_drop_feedback_'); 00038 define('FEEDBACK_MAX_PIX_LENGTH', '400'); //max. Breite des grafischen Balkens in der Auswertung 00039 define('FEEDBACK_DEFAULT_PAGE_COUNT', 20); 00040 00052 function feedback_supports($feature) { 00053 switch($feature) { 00054 case FEATURE_GROUPS: return true; 00055 case FEATURE_GROUPINGS: return true; 00056 case FEATURE_GROUPMEMBERSONLY: return true; 00057 case FEATURE_MOD_INTRO: return true; 00058 case FEATURE_COMPLETION_TRACKS_VIEWS: return true; 00059 case FEATURE_COMPLETION_HAS_RULES: return true; 00060 case FEATURE_GRADE_HAS_GRADE: return false; 00061 case FEATURE_GRADE_OUTCOMES: return false; 00062 case FEATURE_BACKUP_MOODLE2: return true; 00063 case FEATURE_SHOW_DESCRIPTION: return true; 00064 00065 default: return null; 00066 } 00067 } 00068 00077 function feedback_add_instance($feedback) { 00078 global $DB; 00079 00080 $feedback->timemodified = time(); 00081 $feedback->id = ''; 00082 00083 //check if openenable and/or closeenable is set and set correctly to save in db 00084 if (empty($feedback->openenable)) { 00085 $feedback->timeopen = 0; 00086 } 00087 if (empty($feedback->closeenable)) { 00088 $feedback->timeclose = 0; 00089 } 00090 if (empty($feedback->site_after_submit)) { 00091 $feedback->site_after_submit = ''; 00092 } 00093 00094 //saving the feedback in db 00095 $feedbackid = $DB->insert_record("feedback", $feedback); 00096 00097 $feedback->id = $feedbackid; 00098 00099 feedback_set_events($feedback); 00100 00101 return $feedbackid; 00102 } 00103 00111 function feedback_update_instance($feedback) { 00112 global $DB; 00113 00114 $feedback->timemodified = time(); 00115 $feedback->id = $feedback->instance; 00116 00117 //check if openenable and/or closeenable is set and set correctly to save in db 00118 if (empty($feedback->openenable)) { 00119 $feedback->timeopen = 0; 00120 } 00121 if (empty($feedback->closeenable)) { 00122 $feedback->timeclose = 0; 00123 } 00124 if (empty($feedback->site_after_submit)) { 00125 $feedback->site_after_submit = ''; 00126 } 00127 00128 //save the feedback into the db 00129 $DB->update_record("feedback", $feedback); 00130 00131 //create or update the new events 00132 feedback_set_events($feedback); 00133 00134 return true; 00135 } 00136 00151 function feedback_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload) { 00152 global $CFG, $DB; 00153 00154 $itemid = (int)array_shift($args); 00155 00156 //get the item what includes the file 00157 if (!$item = $DB->get_record('feedback_item', array('id'=>$itemid))) { 00158 return false; 00159 } 00160 00161 //if the filearea is "item" so we check the permissions like view/complete the feedback 00162 if ($filearea === 'item') { 00163 //get the feedback 00164 if (!$feedback = $DB->get_record('feedback', array('id'=>$item->feedback))) { 00165 return false; 00166 } 00167 00168 $canload = false; 00169 //first check whether the user has the complete capability 00170 if (has_capability('mod/feedback:complete', $context)) { 00171 $canload = true; 00172 } 00173 00174 //now we check whether the user has the view capability 00175 if (has_capability('mod/feedback:view', $context)) { 00176 $canload = true; 00177 } 00178 00179 //if the feedback is on frontpage and anonymous and the fullanonymous is allowed 00180 //so the file can be loaded too. 00181 if (isset($CFG->feedback_allowfullanonymous) 00182 AND $CFG->feedback_allowfullanonymous 00183 AND $course->id == SITEID 00184 AND $feedback->anonymous == FEEDBACK_ANONYMOUS_YES ) { 00185 $canload = true; 00186 } 00187 00188 if (!$canload) { 00189 return false; 00190 } 00191 } else if ($filearea === 'template') { //now we check files in templates 00192 if (!$template = $DB->get_record('feedback_template', array('id'=>$item->template))) { 00193 return false; 00194 } 00195 00196 //if the file is not public so the capability edititems has to be there 00197 if (!$template->ispublic) { 00198 if (!has_capability('mod/feedback:edititems', $context)) { 00199 return false; 00200 } 00201 } else { //on public templates, at least the user has to be logged in 00202 if (!isloggedin()) { 00203 return false; 00204 } 00205 } 00206 } else { 00207 return false; 00208 } 00209 00210 if ($context->contextlevel == CONTEXT_MODULE) { 00211 if ($filearea !== 'item') { 00212 return false; 00213 } 00214 00215 if ($item->feedback == $cm->instance) { 00216 $filecontext = $context; 00217 } else { 00218 return false; 00219 } 00220 } 00221 00222 if ($context->contextlevel == CONTEXT_COURSE || $context->contextlevel == CONTEXT_SYSTEM) { 00223 if ($filearea !== 'template') { 00224 return false; 00225 } 00226 } 00227 00228 $relativepath = implode('/', $args); 00229 $fullpath = "/$context->id/mod_feedback/$filearea/$itemid/$relativepath"; 00230 00231 $fs = get_file_storage(); 00232 if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) { 00233 return false; 00234 } 00235 00236 // finally send the file 00237 send_stored_file($file, 0, 0, true); // download MUST be forced - security! 00238 00239 return false; 00240 } 00241 00250 function feedback_delete_instance($id) { 00251 global $DB; 00252 00253 //get all referenced items 00254 $feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$id)); 00255 00256 //deleting all referenced items and values 00257 if (is_array($feedbackitems)) { 00258 foreach ($feedbackitems as $feedbackitem) { 00259 $DB->delete_records("feedback_value", array("item"=>$feedbackitem->id)); 00260 $DB->delete_records("feedback_valuetmp", array("item"=>$feedbackitem->id)); 00261 } 00262 if ($delitems = $DB->get_records("feedback_item", array("feedback"=>$id))) { 00263 foreach ($delitems as $delitem) { 00264 feedback_delete_item($delitem->id, false); 00265 } 00266 } 00267 } 00268 00269 //deleting the referenced tracking data 00270 $DB->delete_records('feedback_tracking', array('feedback'=>$id)); 00271 00272 //deleting the completeds 00273 $DB->delete_records("feedback_completed", array("feedback"=>$id)); 00274 00275 //deleting the unfinished completeds 00276 $DB->delete_records("feedback_completedtmp", array("feedback"=>$id)); 00277 00278 //deleting old events 00279 $DB->delete_records('event', array('modulename'=>'feedback', 'instance'=>$id)); 00280 return $DB->delete_records("feedback", array("id"=>$id)); 00281 } 00282 00291 function feedback_delete_course($course) { 00292 global $DB; 00293 00294 //delete all templates of given course 00295 return $DB->delete_records('feedback_template', array('course'=>$course->id)); 00296 } 00297 00311 function feedback_user_outline($course, $user, $mod, $feedback) { 00312 return null; 00313 } 00314 00333 function feedback_get_recent_mod_activity(&$activities, &$index, 00334 $timemodified, $courseid, 00335 $cmid, $userid="", $groupid="") { 00336 00337 global $CFG, $COURSE, $USER, $DB; 00338 00339 if ($COURSE->id == $courseid) { 00340 $course = $COURSE; 00341 } else { 00342 $course = $DB->get_record('course', array('id'=>$courseid)); 00343 } 00344 00345 $modinfo =& get_fast_modinfo($course); 00346 00347 $cm = $modinfo->cms[$cmid]; 00348 00349 $sqlargs = array(); 00350 00351 //TODO: user user_picture::fields; 00352 $sql = " SELECT fk . * , fc . * , u.firstname, u.lastname, u.email, u.picture, u.email 00353 FROM {feedback_completed} fc 00354 JOIN {feedback} fk ON fk.id = fc.feedback 00355 JOIN {user} u ON u.id = fc.userid "; 00356 00357 if ($groupid) { 00358 $sql .= " JOIN {groups_members} gm ON gm.userid=u.id "; 00359 } 00360 00361 $sql .= " WHERE fc.timemodified > ? AND fk.id = ? "; 00362 $sqlargs[] = $timemodified; 00363 $sqlargs[] = $cm->instace; 00364 00365 if ($userid) { 00366 $sql .= " AND u.id = ? "; 00367 $sqlargs[] = $userid; 00368 } 00369 00370 if ($groupid) { 00371 $sql .= " AND gm.groupid = ? "; 00372 $sqlargs[] = $groupid; 00373 } 00374 00375 if (!$feedbackitems = $DB->get_records_sql($sql, $sqlargs)) { 00376 return; 00377 } 00378 00379 $cm_context = get_context_instance(CONTEXT_MODULE, $cm->id); 00380 $accessallgroups = has_capability('moodle/site:accessallgroups', $cm_context); 00381 $viewfullnames = has_capability('moodle/site:viewfullnames', $cm_context); 00382 $groupmode = groups_get_activity_groupmode($cm, $course); 00383 00384 if (is_null($modinfo->groups)) { 00385 // load all my groups and cache it in modinfo 00386 $modinfo->groups = groups_get_user_groups($course->id); 00387 } 00388 00389 $aname = format_string($cm->name, true); 00390 foreach ($feedbackitems as $feedbackitem) { 00391 if ($feedbackitem->userid != $USER->id) { 00392 00393 if ($groupmode == SEPARATEGROUPS and !$accessallgroups) { 00394 $usersgroups = groups_get_all_groups($course->id, 00395 $feedbackitem->userid, 00396 $cm->groupingid); 00397 if (!is_array($usersgroups)) { 00398 continue; 00399 } 00400 $usersgroups = array_keys($usersgroups); 00401 $intersect = array_intersect($usersgroups, $modinfo->groups[$cm->id]); 00402 if (empty($intersect)) { 00403 continue; 00404 } 00405 } 00406 } 00407 00408 $tmpactivity = new stdClass(); 00409 00410 $tmpactivity->type = 'feedback'; 00411 $tmpactivity->cmid = $cm->id; 00412 $tmpactivity->name = $aname; 00413 $tmpactivity->sectionnum= $cm->sectionnum; 00414 $tmpactivity->timestamp = $feedbackitem->timemodified; 00415 00416 $tmpactivity->content->feedbackid = $feedbackitem->id; 00417 $tmpactivity->content->feedbackuserid = $feedbackitem->userid; 00418 00419 //TODO: add all necessary user fields, this is not enough for user_picture 00420 $tmpactivity->user->userid = $feedbackitem->userid; 00421 $tmpactivity->user->fullname = fullname($feedbackitem, $viewfullnames); 00422 $tmpactivity->user->picture = $feedbackitem->picture; 00423 00424 $activities[$index++] = $tmpactivity; 00425 } 00426 00427 return; 00428 } 00429 00441 function feedback_print_recent_mod_activity($activity, $courseid, $detail, $modnames) { 00442 global $CFG, $OUTPUT; 00443 00444 echo '<table border="0" cellpadding="3" cellspacing="0" class="forum-recent">'; 00445 00446 echo "<tr><td class=\"userpicture\" valign=\"top\">"; 00447 echo $OUTPUT->user_picture($activity->user, array('courseid'=>$courseid)); 00448 echo "</td><td>"; 00449 00450 if ($detail) { 00451 $modname = $modnames[$activity->type]; 00452 echo '<div class="title">'; 00453 echo "<img src=\"" . $OUTPUT->pix_url('icon', $activity->type) . "\" ". 00454 "class=\"icon\" alt=\"$modname\" />"; 00455 echo "<a href=\"$CFG->wwwroot/mod/feedback/view.php?id={$activity->cmid}\">{$activity->name}</a>"; 00456 echo '</div>'; 00457 } 00458 00459 echo '<div class="title">'; 00460 echo '</div>'; 00461 00462 echo '<div class="user">'; 00463 echo "<a href=\"$CFG->wwwroot/user/view.php?id={$activity->user->userid}&course=$courseid\">" 00464 ."{$activity->user->fullname}</a> - ".userdate($activity->timestamp); 00465 echo '</div>'; 00466 00467 echo "</td></tr></table>"; 00468 00469 return; 00470 } 00471 00482 function feedback_get_completion_state($course, $cm, $userid, $type) { 00483 global $CFG, $DB; 00484 00485 // Get feedback details 00486 $feedback = $DB->get_record('feedback', array('id'=>$cm->instance), '*', MUST_EXIST); 00487 00488 // If completion option is enabled, evaluate it and return true/false 00489 if ($feedback->completionsubmit) { 00490 $params = array('userid'=>$userid, 'feedback'=>$feedback->id); 00491 return $DB->record_exists('feedback_tracking', $params); 00492 } else { 00493 // Completion option is not enabled so just return $type 00494 return $type; 00495 } 00496 } 00497 00498 00509 function feedback_user_complete($course, $user, $mod, $feedback) { 00510 return true; 00511 } 00512 00516 function feedback_cron () { 00517 return true; 00518 } 00519 00524 function feedback_get_participants($feedbackid) { 00525 return false; 00526 } 00527 00528 00532 function feedback_scale_used ($feedbackid, $scaleid) { 00533 return false; 00534 } 00535 00543 function feedback_scale_used_anywhere($scaleid) { 00544 return false; 00545 } 00546 00550 function feedback_get_view_actions() { 00551 return array('view', 'view all'); 00552 } 00553 00557 function feedback_get_post_actions() { 00558 return array('submit'); 00559 } 00560 00573 function feedback_reset_userdata($data) { 00574 global $CFG, $DB; 00575 00576 $resetfeedbacks = array(); 00577 $dropfeedbacks = array(); 00578 $status = array(); 00579 $componentstr = get_string('modulenameplural', 'feedback'); 00580 00581 //get the relevant entries from $data 00582 foreach ($data as $key => $value) { 00583 switch(true) { 00584 case substr($key, 0, strlen(FEEDBACK_RESETFORM_RESET)) == FEEDBACK_RESETFORM_RESET: 00585 if ($value == 1) { 00586 $templist = explode('_', $key); 00587 if (isset($templist[3])) { 00588 $resetfeedbacks[] = intval($templist[3]); 00589 } 00590 } 00591 break; 00592 case substr($key, 0, strlen(FEEDBACK_RESETFORM_DROP)) == FEEDBACK_RESETFORM_DROP: 00593 if ($value == 1) { 00594 $templist = explode('_', $key); 00595 if (isset($templist[3])) { 00596 $dropfeedbacks[] = intval($templist[3]); 00597 } 00598 } 00599 break; 00600 } 00601 } 00602 00603 //reset the selected feedbacks 00604 foreach ($resetfeedbacks as $id) { 00605 $feedback = $DB->get_record('feedback', array('id'=>$id)); 00606 feedback_delete_all_completeds($id); 00607 $status[] = array('component'=>$componentstr.':'.$feedback->name, 00608 'item'=>get_string('resetting_data', 'feedback'), 00609 'error'=>false); 00610 } 00611 00612 return $status; 00613 } 00614 00622 function feedback_reset_course_form_definition(&$mform) { 00623 global $COURSE, $DB; 00624 00625 $mform->addElement('header', 'feedbackheader', get_string('modulenameplural', 'feedback')); 00626 00627 if (!$feedbacks = $DB->get_records('feedback', array('course'=>$COURSE->id), 'name')) { 00628 return; 00629 } 00630 00631 $mform->addElement('static', 'hint', get_string('resetting_data', 'feedback')); 00632 foreach ($feedbacks as $feedback) { 00633 $mform->addElement('checkbox', FEEDBACK_RESETFORM_RESET.$feedback->id, $feedback->name); 00634 } 00635 } 00636 00644 function feedback_reset_course_form_defaults($course) { 00645 global $DB; 00646 00647 $return = array(); 00648 if (!$feedbacks = $DB->get_records('feedback', array('course'=>$course->id), 'name')) { 00649 return; 00650 } 00651 foreach ($feedbacks as $feedback) { 00652 $return[FEEDBACK_RESETFORM_RESET.$feedback->id] = true; 00653 } 00654 return $return; 00655 } 00656 00670 function feedback_reset_course_form($course) { 00671 global $DB, $OUTPUT; 00672 00673 echo get_string('resetting_feedbacks', 'feedback'); echo ':<br />'; 00674 if (!$feedbacks = $DB->get_records('feedback', array('course'=>$course->id), 'name')) { 00675 return; 00676 } 00677 00678 foreach ($feedbacks as $feedback) { 00679 echo '<p>'; 00680 echo get_string('name', 'feedback').': '.$feedback->name.'<br />'; 00681 echo html_writer::checkbox(FEEDBACK_RESETFORM_RESET.$feedback->id, 00682 1, true, 00683 get_string('resetting_data', 'feedback')); 00684 echo '<br />'; 00685 echo html_writer::checkbox(FEEDBACK_RESETFORM_DROP.$feedback->id, 00686 1, false, 00687 get_string('drop_feedback', 'feedback')); 00688 echo '</p>'; 00689 } 00690 } 00691 00699 function feedback_set_events($feedback) { 00700 global $DB; 00701 00702 // adding the feedback to the eventtable (I have seen this at quiz-module) 00703 $DB->delete_records('event', array('modulename'=>'feedback', 'instance'=>$feedback->id)); 00704 00705 if (!isset($feedback->coursemodule)) { 00706 $cm = get_coursemodule_from_id('feedback', $feedback->id); 00707 $feedback->coursemodule = $cm->id; 00708 } 00709 00710 // the open-event 00711 if ($feedback->timeopen > 0) { 00712 $event = new stdClass(); 00713 $event->name = get_string('start', 'feedback').' '.$feedback->name; 00714 $event->description = format_module_intro('feedback', $feedback, $feedback->coursemodule); 00715 $event->courseid = $feedback->course; 00716 $event->groupid = 0; 00717 $event->userid = 0; 00718 $event->modulename = 'feedback'; 00719 $event->instance = $feedback->id; 00720 $event->eventtype = 'open'; 00721 $event->timestart = $feedback->timeopen; 00722 $event->visible = instance_is_visible('feedback', $feedback); 00723 if ($feedback->timeclose > 0) { 00724 $event->timeduration = ($feedback->timeclose - $feedback->timeopen); 00725 } else { 00726 $event->timeduration = 0; 00727 } 00728 00729 calendar_event::create($event); 00730 } 00731 00732 // the close-event 00733 if ($feedback->timeclose > 0) { 00734 $event = new stdClass(); 00735 $event->name = get_string('stop', 'feedback').' '.$feedback->name; 00736 $event->description = format_module_intro('feedback', $feedback, $feedback->coursemodule); 00737 $event->courseid = $feedback->course; 00738 $event->groupid = 0; 00739 $event->userid = 0; 00740 $event->modulename = 'feedback'; 00741 $event->instance = $feedback->id; 00742 $event->eventtype = 'close'; 00743 $event->timestart = $feedback->timeclose; 00744 $event->visible = instance_is_visible('feedback', $feedback); 00745 $event->timeduration = 0; 00746 00747 calendar_event::create($event); 00748 } 00749 } 00750 00759 function feedback_delete_course_module($id) { 00760 global $DB; 00761 00762 if (!$cm = $DB->get_record('course_modules', array('id'=>$id))) { 00763 return true; 00764 } 00765 return $DB->delete_records('course_modules', array('id'=>$cm->id)); 00766 } 00767 00768 00769 00771 //functions to handle capabilities 00773 00781 function feedback_get_context($cmid) { 00782 static $context; 00783 00784 if (isset($context)) { 00785 return $context; 00786 } 00787 00788 if (!$context = get_context_instance(CONTEXT_MODULE, $cmid)) { 00789 print_error('badcontext'); 00790 } 00791 return $context; 00792 } 00793 00800 function feedback_check_is_switchrole() { 00801 global $USER; 00802 if (isset($USER->switchrole) AND 00803 is_array($USER->switchrole) AND 00804 count($USER->switchrole) > 0) { 00805 00806 return true; 00807 } 00808 return false; 00809 } 00810 00823 function feedback_get_incomplete_users($cm, 00824 $group = false, 00825 $sort = '', 00826 $startpage = false, 00827 $pagecount = false) { 00828 00829 global $DB; 00830 00831 $context = get_context_instance(CONTEXT_MODULE, $cm->id); 00832 00833 //first get all user who can complete this feedback 00834 $cap = 'mod/feedback:complete'; 00835 $fields = 'u.id, u.username'; 00836 if (!$allusers = get_users_by_capability($context, 00837 $cap, 00838 $fields, 00839 $sort, 00840 '', 00841 '', 00842 $group, 00843 '', 00844 true)) { 00845 return false; 00846 } 00847 $allusers = array_keys($allusers); 00848 00849 //now get all completeds 00850 $params = array('feedback'=>$cm->instance); 00851 if (!$completedusers = $DB->get_records_menu('feedback_completed', $params, '', 'userid,id')) { 00852 return $allusers; 00853 } 00854 $completedusers = array_keys($completedusers); 00855 00856 //now strike all completedusers from allusers 00857 $allusers = array_diff($allusers, $completedusers); 00858 00859 //for paging I use array_slice() 00860 if ($startpage !== false AND $pagecount !== false) { 00861 $allusers = array_slice($allusers, $startpage, $pagecount); 00862 } 00863 00864 return $allusers; 00865 } 00866 00875 function feedback_count_incomplete_users($cm, $group = false) { 00876 if ($allusers = feedback_get_incomplete_users($cm, $group)) { 00877 return count($allusers); 00878 } 00879 return 0; 00880 } 00881 00891 function feedback_count_complete_users($cm, $group = false) { 00892 global $DB; 00893 00894 $params = array(FEEDBACK_ANONYMOUS_NO, $cm->instance); 00895 00896 $fromgroup = ''; 00897 $wheregroup = ''; 00898 if ($group) { 00899 $fromgroup = ', {groups_members} g'; 00900 $wheregroup = ' AND g.groupid = ? AND g.userid = c.userid'; 00901 $params[] = $group; 00902 } 00903 00904 $sql = 'SELECT COUNT(u.id) FROM {user} u, {feedback_completed} c'.$fromgroup.' 00905 WHERE anonymous_response = ? AND u.id = c.userid AND c.feedback = ? 00906 '.$wheregroup; 00907 00908 return $DB->count_records_sql($sql, $params); 00909 00910 } 00911 00927 function feedback_get_complete_users($cm, 00928 $group = false, 00929 $where = '', 00930 array $params = null, 00931 $sort = '', 00932 $startpage = false, 00933 $pagecount = false) { 00934 00935 global $DB; 00936 00937 if (!$context = get_context_instance(CONTEXT_MODULE, $cm->id)) { 00938 print_error('badcontext'); 00939 } 00940 00941 $params = (array)$params; 00942 00943 $params['anon'] = FEEDBACK_ANONYMOUS_NO; 00944 $params['instance'] = $cm->instance; 00945 00946 $fromgroup = ''; 00947 $wheregroup = ''; 00948 if ($group) { 00949 $fromgroup = ', {groups_members} g'; 00950 $wheregroup = ' AND g.groupid = :group AND g.userid = c.userid'; 00951 $params['group'] = $group; 00952 } 00953 00954 if ($sort) { 00955 $sortsql = ' ORDER BY '.$sort; 00956 } else { 00957 $sortsql = ''; 00958 } 00959 00960 $ufields = user_picture::fields('u'); 00961 $sql = 'SELECT DISTINCT '.$ufields.', c.timemodified as completed_timemodified 00962 FROM {user} u, {feedback_completed} c '.$fromgroup.' 00963 WHERE '.$where.' anonymous_response = :anon 00964 AND u.id = c.userid 00965 AND c.feedback = :instance 00966 '.$wheregroup.$sortsql; 00967 00968 if ($startpage === false OR $pagecount === false) { 00969 $startpage = false; 00970 $pagecount = false; 00971 } 00972 return $DB->get_records_sql($sql, $params, $startpage, $pagecount); 00973 } 00974 00983 function feedback_get_viewreports_users($cmid, $groups = false) { 00984 00985 if (!$context = get_context_instance(CONTEXT_MODULE, $cmid)) { 00986 print_error('badcontext'); 00987 } 00988 00989 //description of the call below: 00990 //get_users_by_capability($context, $capability, $fields='', $sort='', $limitfrom='', 00991 // $limitnum='', $groups='', $exceptions='', $doanything=true) 00992 return get_users_by_capability($context, 00993 'mod/feedback:viewreports', 00994 '', 00995 'lastname', 00996 '', 00997 '', 00998 $groups, 00999 '', 01000 false); 01001 } 01002 01011 function feedback_get_receivemail_users($cmid, $groups = false) { 01012 01013 if (!$context = get_context_instance(CONTEXT_MODULE, $cmid)) { 01014 print_error('badcontext'); 01015 } 01016 01017 //description of the call below: 01018 //get_users_by_capability($context, $capability, $fields='', $sort='', $limitfrom='', 01019 // $limitnum='', $groups='', $exceptions='', $doanything=true) 01020 return get_users_by_capability($context, 01021 'mod/feedback:receivemail', 01022 '', 01023 'lastname', 01024 '', 01025 '', 01026 $groups, 01027 '', 01028 false); 01029 } 01030 01032 //functions to handle the templates 01035 01045 function feedback_create_template($courseid, $name, $ispublic = 0) { 01046 global $DB; 01047 01048 $templ = new stdClass(); 01049 $templ->course = ($ispublic ? 0 : $courseid); 01050 $templ->name = $name; 01051 $templ->ispublic = $ispublic; 01052 01053 $templid = $DB->insert_record('feedback_template', $templ); 01054 return $DB->get_record('feedback_template', array('id'=>$templid)); 01055 } 01056 01070 function feedback_save_as_template($feedback, $name, $ispublic = 0) { 01071 global $DB; 01072 $fs = get_file_storage(); 01073 01074 if (!$feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$feedback->id))) { 01075 return false; 01076 } 01077 01078 if (!$newtempl = feedback_create_template($feedback->course, $name, $ispublic)) { 01079 return false; 01080 } 01081 01082 //files in the template_item are in the context of the current course or 01083 //if the template is public the files are in the system context 01084 //files in the feedback_item are in the feedback_context of the feedback 01085 if ($ispublic) { 01086 $s_context = get_system_context(); 01087 } else { 01088 $s_context = get_context_instance(CONTEXT_COURSE, $newtempl->course); 01089 } 01090 $cm = get_coursemodule_from_instance('feedback', $feedback->id); 01091 $f_context = get_context_instance(CONTEXT_MODULE, $cm->id); 01092 01093 //create items of this new template 01094 //depend items we are storing temporary in an mapping list array(new id => dependitem) 01095 //we also store a mapping of all items array(oldid => newid) 01096 $dependitemsmap = array(); 01097 $itembackup = array(); 01098 foreach ($feedbackitems as $item) { 01099 01100 $t_item = clone($item); 01101 01102 unset($t_item->id); 01103 $t_item->feedback = 0; 01104 $t_item->template = $newtempl->id; 01105 $t_item->id = $DB->insert_record('feedback_item', $t_item); 01106 //copy all included files to the feedback_template filearea 01107 $itemfiles = $fs->get_area_files($f_context->id, 01108 'mod_feedback', 01109 'item', 01110 $item->id, 01111 "id", 01112 false); 01113 if ($itemfiles) { 01114 foreach ($itemfiles as $ifile) { 01115 $file_record = new stdClass(); 01116 $file_record->contextid = $s_context->id; 01117 $file_record->component = 'mod_feedback'; 01118 $file_record->filearea = 'template'; 01119 $file_record->itemid = $t_item->id; 01120 $fs->create_file_from_storedfile($file_record, $ifile); 01121 } 01122 } 01123 01124 $itembackup[$item->id] = $t_item->id; 01125 if ($t_item->dependitem) { 01126 $dependitemsmap[$t_item->id] = $t_item->dependitem; 01127 } 01128 01129 } 01130 01131 //remapping the dependency 01132 foreach ($dependitemsmap as $key => $dependitem) { 01133 $newitem = $DB->get_record('feedback_item', array('id'=>$key)); 01134 $newitem->dependitem = $itembackup[$newitem->dependitem]; 01135 $DB->update_record('feedback_item', $newitem); 01136 } 01137 01138 return true; 01139 } 01140 01149 function feedback_delete_template($template) { 01150 global $DB; 01151 01152 //deleting the files from the item is done by feedback_delete_item 01153 if ($t_items = $DB->get_records("feedback_item", array("template"=>$template->id))) { 01154 foreach ($t_items as $t_item) { 01155 feedback_delete_item($t_item->id, false, $template); 01156 } 01157 } 01158 $DB->delete_records("feedback_template", array("id"=>$template->id)); 01159 } 01160 01173 function feedback_items_from_template($feedback, $templateid, $deleteold = false) { 01174 global $DB, $CFG; 01175 01176 require_once($CFG->libdir.'/completionlib.php'); 01177 01178 $fs = get_file_storage(); 01179 01180 if (!$template = $DB->get_record('feedback_template', array('id'=>$templateid))) { 01181 return false; 01182 } 01183 //get all templateitems 01184 if (!$templitems = $DB->get_records('feedback_item', array('template'=>$templateid))) { 01185 return false; 01186 } 01187 01188 //files in the template_item are in the context of the current course 01189 //files in the feedback_item are in the feedback_context of the feedback 01190 if ($template->ispublic) { 01191 $s_context = get_system_context(); 01192 } else { 01193 $s_context = get_context_instance(CONTEXT_COURSE, $feedback->course); 01194 } 01195 $course = $DB->get_record('course', array('id'=>$feedback->course)); 01196 $cm = get_coursemodule_from_instance('feedback', $feedback->id); 01197 $f_context = get_context_instance(CONTEXT_MODULE, $cm->id); 01198 01199 //if deleteold then delete all old items before 01200 //get all items 01201 if ($deleteold) { 01202 if ($feedbackitems = $DB->get_records('feedback_item', array('feedback'=>$feedback->id))) { 01203 //delete all items of this feedback 01204 foreach ($feedbackitems as $item) { 01205 feedback_delete_item($item->id, false); 01206 } 01207 //delete tracking-data 01208 $DB->delete_records('feedback_tracking', array('feedback'=>$feedback->id)); 01209 01210 $params = array('feedback'=>$feedback->id); 01211 if ($completeds = $DB->get_records('feedback_completed', $params)) { 01212 $completion = new completion_info($course); 01213 foreach ($completeds as $completed) { 01214 // Update completion state 01215 if ($completion->is_enabled($cm) && $feedback->completionsubmit) { 01216 $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid); 01217 } 01218 $DB->delete_records('feedback_completed', array('id'=>$completed->id)); 01219 } 01220 } 01221 $DB->delete_records('feedback_completedtmp', array('feedback'=>$feedback->id)); 01222 } 01223 $positionoffset = 0; 01224 } else { 01225 //if the old items are kept the new items will be appended 01226 //therefor the new position has an offset 01227 $positionoffset = $DB->count_records('feedback_item', array('feedback'=>$feedback->id)); 01228 } 01229 01230 //create items of this new template 01231 //depend items we are storing temporary in an mapping list array(new id => dependitem) 01232 //we also store a mapping of all items array(oldid => newid) 01233 $dependitemsmap = array(); 01234 $itembackup = array(); 01235 foreach ($templitems as $t_item) { 01236 $item = clone($t_item); 01237 unset($item->id); 01238 $item->feedback = $feedback->id; 01239 $item->template = 0; 01240 $item->position = $item->position + $positionoffset; 01241 01242 $item->id = $DB->insert_record('feedback_item', $item); 01243 01244 //moving the files to the new item 01245 $templatefiles = $fs->get_area_files($s_context->id, 01246 'mod_feedback', 01247 'template', 01248 $t_item->id, 01249 "id", 01250 false); 01251 if ($templatefiles) { 01252 foreach ($templatefiles as $tfile) { 01253 $file_record = new stdClass(); 01254 $file_record->contextid = $f_context->id; 01255 $file_record->component = 'mod_feedback'; 01256 $file_record->filearea = 'item'; 01257 $file_record->itemid = $item->id; 01258 $fs->create_file_from_storedfile($file_record, $tfile); 01259 } 01260 } 01261 01262 $itembackup[$t_item->id] = $item->id; 01263 if ($item->dependitem) { 01264 $dependitemsmap[$item->id] = $item->dependitem; 01265 } 01266 } 01267 01268 //remapping the dependency 01269 foreach ($dependitemsmap as $key => $dependitem) { 01270 $newitem = $DB->get_record('feedback_item', array('id'=>$key)); 01271 $newitem->dependitem = $itembackup[$newitem->dependitem]; 01272 $DB->update_record('feedback_item', $newitem); 01273 } 01274 } 01275 01286 function feedback_get_template_list($course, $onlyownorpublic = '') { 01287 global $DB, $CFG; 01288 01289 switch($onlyownorpublic) { 01290 case '': 01291 $templates = $DB->get_records_select('feedback_template', 01292 'course = ? OR ispublic = 1', 01293 array($course->id), 01294 'name'); 01295 break; 01296 case 'own': 01297 $templates = $DB->get_records('feedback_template', 01298 array('course'=>$course->id), 01299 'name'); 01300 break; 01301 case 'public': 01302 $templates = $DB->get_records('feedback_template', array('ispublic'=>1), 'name'); 01303 break; 01304 } 01305 return $templates; 01306 } 01307 01309 //Handling der Items 01312 01320 function feedback_get_item_class($typ) { 01321 global $CFG; 01322 01323 //get the class of item-typ 01324 $itemclass = 'feedback_item_'.$typ; 01325 //get the instance of item-class 01326 if (!class_exists($itemclass)) { 01327 require_once($CFG->dirroot.'/mod/feedback/item/'.$typ.'/lib.php'); 01328 } 01329 return new $itemclass(); 01330 } 01331 01340 function feedback_load_feedback_items($dir = 'mod/feedback/item') { 01341 global $CFG; 01342 $names = get_list_of_plugins($dir); 01343 $ret_names = array(); 01344 01345 foreach ($names as $name) { 01346 require_once($CFG->dirroot.'/'.$dir.'/'.$name.'/lib.php'); 01347 if (class_exists('feedback_item_'.$name)) { 01348 $ret_names[] = $name; 01349 } 01350 } 01351 return $ret_names; 01352 } 01353 01360 function feedback_load_feedback_items_options() { 01361 global $CFG; 01362 01363 $feedback_options = array("pagebreak" => get_string('add_pagebreak', 'feedback')); 01364 01365 if (!$feedback_names = feedback_load_feedback_items('mod/feedback/item')) { 01366 return array(); 01367 } 01368 01369 foreach ($feedback_names as $fn) { 01370 $feedback_options[$fn] = get_string($fn, 'feedback'); 01371 } 01372 asort($feedback_options); 01373 $feedback_options = array_merge( array(' ' => get_string('select')), $feedback_options ); 01374 return $feedback_options; 01375 } 01376 01385 function feedback_get_depend_candidates_for_item($feedback, $item) { 01386 global $DB; 01387 //all items for dependitem 01388 $where = "feedback = ? AND typ != 'pagebreak' AND hasvalue = 1"; 01389 $params = array($feedback->id); 01390 if (isset($item->id) AND $item->id) { 01391 $where .= ' AND id != ?'; 01392 $params[] = $item->id; 01393 } 01394 $dependitems = array(0 => get_string('choose')); 01395 $feedbackitems = $DB->get_records_select_menu('feedback_item', 01396 $where, 01397 $params, 01398 'position', 01399 'id, label'); 01400 01401 if (!$feedbackitems) { 01402 return $dependitems; 01403 } 01404 //adding the choose-option 01405 foreach ($feedbackitems as $key => $val) { 01406 $dependitems[$key] = $val; 01407 } 01408 return $dependitems; 01409 } 01410 01418 function feedback_create_item($data) { 01419 global $DB; 01420 01421 $item = new stdClass(); 01422 $item->feedback = $data->feedbackid; 01423 01424 $item->template=0; 01425 if (isset($data->templateid)) { 01426 $item->template = intval($data->templateid); 01427 } 01428 01429 $itemname = trim($data->itemname); 01430 $item->name = ($itemname ? $data->itemname : get_string('no_itemname', 'feedback')); 01431 01432 if (!empty($data->itemlabel)) { 01433 $item->label = trim($data->itemlabel); 01434 } else { 01435 $item->label = get_string('no_itemlabel', 'feedback'); 01436 } 01437 01438 $itemobj = feedback_get_item_class($data->typ); 01439 $item->presentation = ''; //the date comes from postupdate() of the itemobj 01440 01441 $item->hasvalue = $itemobj->get_hasvalue(); 01442 01443 $item->typ = $data->typ; 01444 $item->position = $data->position; 01445 01446 $item->required=0; 01447 if (!empty($data->required)) { 01448 $item->required = $data->required; 01449 } 01450 01451 $item->id = $DB->insert_record('feedback_item', $item); 01452 01453 //move all itemdata to the data 01454 $data->id = $item->id; 01455 $data->feedback = $item->feedback; 01456 $data->name = $item->name; 01457 $data->label = $item->label; 01458 $data->required = $item->required; 01459 return $itemobj->postupdate($data); 01460 } 01461 01469 function feedback_update_item($item) { 01470 global $DB; 01471 return $DB->update_record("feedback_item", $item); 01472 } 01473 01484 function feedback_delete_item($itemid, $renumber = true, $template = false) { 01485 global $DB; 01486 01487 $item = $DB->get_record('feedback_item', array('id'=>$itemid)); 01488 01489 //deleting the files from the item 01490 $fs = get_file_storage(); 01491 01492 if ($template) { 01493 if ($template->ispublic) { 01494 $context = get_system_context(); 01495 } else { 01496 $context = get_context_instance(CONTEXT_COURSE, $template->course); 01497 } 01498 $templatefiles = $fs->get_area_files($context->id, 01499 'mod_feedback', 01500 'template', 01501 $item->id, 01502 "id", 01503 false); 01504 01505 if ($templatefiles) { 01506 $fs->delete_area_files($context->id, 'mod_feedback', 'template', $item->id); 01507 } 01508 } else { 01509 if (!$cm = get_coursemodule_from_instance('feedback', $item->feedback)) { 01510 return false; 01511 } 01512 $context = get_context_instance(CONTEXT_MODULE, $cm->id); 01513 01514 $itemfiles = $fs->get_area_files($context->id, 01515 'mod_feedback', 01516 'item', 01517 $item->id, 01518 "id", false); 01519 01520 if ($itemfiles) { 01521 $fs->delete_area_files($context->id, 'mod_feedback', 'item', $item->id); 01522 } 01523 } 01524 01525 $DB->delete_records("feedback_value", array("item"=>$itemid)); 01526 $DB->delete_records("feedback_valuetmp", array("item"=>$itemid)); 01527 01528 //remove all depends 01529 $DB->set_field('feedback_item', 'dependvalue', '', array('dependitem'=>$itemid)); 01530 $DB->set_field('feedback_item', 'dependitem', 0, array('dependitem'=>$itemid)); 01531 01532 $DB->delete_records("feedback_item", array("id"=>$itemid)); 01533 if ($renumber) { 01534 feedback_renumber_items($item->feedback); 01535 } 01536 } 01537 01545 function feedback_delete_all_items($feedbackid) { 01546 global $DB, $CFG; 01547 require_once($CFG->libdir.'/completionlib.php'); 01548 01549 if (!$feedback = $DB->get_record('feedback', array('id'=>$feedbackid))) { 01550 return false; 01551 } 01552 01553 if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) { 01554 return false; 01555 } 01556 01557 if (!$course = $DB->get_record('course', array('id'=>$feedback->course))) { 01558 return false; 01559 } 01560 01561 if (!$items = $DB->get_records('feedback_item', array('feedback'=>$feedbackid))) { 01562 return; 01563 } 01564 foreach ($items as $item) { 01565 feedback_delete_item($item->id, false); 01566 } 01567 if ($completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedback->id))) { 01568 $completion = new completion_info($course); 01569 foreach ($completeds as $completed) { 01570 // Update completion state 01571 if ($completion->is_enabled($cm) && $feedback->completionsubmit) { 01572 $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid); 01573 } 01574 $DB->delete_records('feedback_completed', array('id'=>$completed->id)); 01575 } 01576 } 01577 01578 $DB->delete_records('feedback_completedtmp', array('feedback'=>$feedbackid)); 01579 01580 } 01581 01589 function feedback_switch_item_required($item) { 01590 global $DB, $CFG; 01591 01592 $itemobj = feedback_get_item_class($item->typ); 01593 01594 if ($itemobj->can_switch_require()) { 01595 $new_require_val = (int)!(bool)$item->required; 01596 $params = array('id'=>$item->id); 01597 $DB->set_field('feedback_item', 'required', $new_require_val, $params); 01598 } 01599 return true; 01600 } 01601 01609 function feedback_renumber_items($feedbackid) { 01610 global $DB; 01611 01612 $items = $DB->get_records('feedback_item', array('feedback'=>$feedbackid), 'position'); 01613 $pos = 1; 01614 if ($items) { 01615 foreach ($items as $item) { 01616 $DB->set_field('feedback_item', 'position', $pos, array('id'=>$item->id)); 01617 $pos++; 01618 } 01619 } 01620 } 01621 01629 function feedback_moveup_item($item) { 01630 global $DB; 01631 01632 if ($item->position == 1) { 01633 return true; 01634 } 01635 01636 $params = array('feedback'=>$item->feedback); 01637 if (!$items = $DB->get_records('feedback_item', $params, 'position')) { 01638 return false; 01639 } 01640 01641 $itembefore = null; 01642 foreach ($items as $i) { 01643 if ($i->id == $item->id) { 01644 if (is_null($itembefore)) { 01645 return true; 01646 } 01647 $itembefore->position = $item->position; 01648 $item->position--; 01649 feedback_update_item($itembefore); 01650 feedback_update_item($item); 01651 feedback_renumber_items($item->feedback); 01652 return true; 01653 } 01654 $itembefore = $i; 01655 } 01656 return false; 01657 } 01658 01666 function feedback_movedown_item($item) { 01667 global $DB; 01668 01669 $params = array('feedback'=>$item->feedback); 01670 if (!$items = $DB->get_records('feedback_item', $params, 'position')) { 01671 return false; 01672 } 01673 01674 $movedownitem = null; 01675 foreach ($items as $i) { 01676 if (!is_null($movedownitem) AND $movedownitem->id == $item->id) { 01677 $movedownitem->position = $i->position; 01678 $i->position--; 01679 feedback_update_item($movedownitem); 01680 feedback_update_item($i); 01681 feedback_renumber_items($item->feedback); 01682 return true; 01683 } 01684 $movedownitem = $i; 01685 } 01686 return false; 01687 } 01688 01697 function feedback_move_item($moveitem, $pos) { 01698 global $DB; 01699 01700 $params = array('feedback'=>$moveitem->feedback); 01701 if (!$allitems = $DB->get_records('feedback_item', $params, 'position')) { 01702 return false; 01703 } 01704 if (is_array($allitems)) { 01705 $index = 1; 01706 foreach ($allitems as $item) { 01707 if ($index == $pos) { 01708 $index++; 01709 } 01710 if ($item->id == $moveitem->id) { 01711 $moveitem->position = $pos; 01712 feedback_update_item($moveitem); 01713 continue; 01714 } 01715 $item->position = $index; 01716 feedback_update_item($item); 01717 $index++; 01718 } 01719 return true; 01720 } 01721 return false; 01722 } 01723 01732 function feedback_print_item_preview($item) { 01733 global $CFG; 01734 if ($item->typ == 'pagebreak') { 01735 return; 01736 } 01737 //get the instance of the item-class 01738 $itemobj = feedback_get_item_class($item->typ); 01739 $itemobj->print_item_preview($item); 01740 } 01741 01751 function feedback_print_item_complete($item, $value = false, $highlightrequire = false) { 01752 global $CFG; 01753 if ($item->typ == 'pagebreak') { 01754 return; 01755 } 01756 01757 //get the instance of the item-class 01758 $itemobj = feedback_get_item_class($item->typ); 01759 $itemobj->print_item_complete($item, $value, $highlightrequire); 01760 } 01761 01770 function feedback_print_item_show_value($item, $value = false) { 01771 global $CFG; 01772 if ($item->typ == 'pagebreak') { 01773 return; 01774 } 01775 01776 //get the instance of the item-class 01777 $itemobj = feedback_get_item_class($item->typ); 01778 $itemobj->print_item_show_value($item, $value); 01779 } 01780 01789 function feedback_set_tmp_values($feedbackcompleted) { 01790 global $DB; 01791 01792 //first we create a completedtmp 01793 $tmpcpl = new stdClass(); 01794 foreach ($feedbackcompleted as $key => $value) { 01795 $tmpcpl->{$key} = $value; 01796 } 01797 unset($tmpcpl->id); 01798 $tmpcpl->timemodified = time(); 01799 $tmpcpl->id = $DB->insert_record('feedback_completedtmp', $tmpcpl); 01800 //get all values of original-completed 01801 if (!$values = $DB->get_records('feedback_value', array('completed'=>$feedbackcompleted->id))) { 01802 return; 01803 } 01804 foreach ($values as $value) { 01805 unset($value->id); 01806 $value->completed = $tmpcpl->id; 01807 $DB->insert_record('feedback_valuetmp', $value); 01808 } 01809 return $tmpcpl; 01810 } 01811 01821 function feedback_save_tmp_values($feedbackcompletedtmp, $feedbackcompleted, $userid) { 01822 global $DB; 01823 01824 $tmpcplid = $feedbackcompletedtmp->id; 01825 if ($feedbackcompleted) { 01826 //first drop all existing values 01827 $DB->delete_records('feedback_value', array('completed'=>$feedbackcompleted->id)); 01828 //update the current completed 01829 $feedbackcompleted->timemodified = time(); 01830 $DB->update_record('feedback_completed', $feedbackcompleted); 01831 } else { 01832 $feedbackcompleted = clone($feedbackcompletedtmp); 01833 $feedbackcompleted->id = ''; 01834 $feedbackcompleted->userid = $userid; 01835 $feedbackcompleted->timemodified = time(); 01836 $feedbackcompleted->id = $DB->insert_record('feedback_completed', $feedbackcompleted); 01837 } 01838 01839 //save all the new values from feedback_valuetmp 01840 //get all values of tmp-completed 01841 $params = array('completed'=>$feedbackcompletedtmp->id); 01842 if (!$values = $DB->get_records('feedback_valuetmp', $params)) { 01843 return false; 01844 } 01845 foreach ($values as $value) { 01846 //check if there are depend items 01847 $item = $DB->get_record('feedback_item', array('id'=>$value->item)); 01848 if ($item->dependitem > 0) { 01849 $check = feedback_compare_item_value($tmpcplid, 01850 $item->dependitem, 01851 $item->dependvalue, 01852 true); 01853 } else { 01854 $check = true; 01855 } 01856 if ($check) { 01857 unset($value->id); 01858 $value->completed = $feedbackcompleted->id; 01859 $DB->insert_record('feedback_value', $value); 01860 } 01861 } 01862 //drop all the tmpvalues 01863 $DB->delete_records('feedback_valuetmp', array('completed'=>$tmpcplid)); 01864 $DB->delete_records('feedback_completedtmp', array('id'=>$tmpcplid)); 01865 return $feedbackcompleted->id; 01866 01867 } 01868 01876 function feedback_delete_completedtmp($tmpcplid) { 01877 global $DB; 01878 01879 $DB->delete_records('feedback_valuetmp', array('completed'=>$tmpcplid)); 01880 $DB->delete_records('feedback_completedtmp', array('id'=>$tmpcplid)); 01881 } 01882 01886 //functions to handle the pagebreaks 01888 01897 function feedback_create_pagebreak($feedbackid) { 01898 global $DB; 01899 01900 //check if there already is a pagebreak on the last position 01901 $lastposition = $DB->count_records('feedback_item', array('feedback'=>$feedbackid)); 01902 if ($lastposition == feedback_get_last_break_position($feedbackid)) { 01903 return false; 01904 } 01905 01906 $item = new stdClass(); 01907 $item->feedback = $feedbackid; 01908 01909 $item->template=0; 01910 01911 $item->name = ''; 01912 01913 $item->presentation = ''; 01914 $item->hasvalue = 0; 01915 01916 $item->typ = 'pagebreak'; 01917 $item->position = $lastposition + 1; 01918 01919 $item->required=0; 01920 01921 return $DB->insert_record('feedback_item', $item); 01922 } 01923 01931 function feedback_get_all_break_positions($feedbackid) { 01932 global $DB; 01933 01934 $params = array('typ'=>'pagebreak', 'feedback'=>$feedbackid); 01935 $allbreaks = $DB->get_records_menu('feedback_item', $params, 'position', 'id, position'); 01936 if (!$allbreaks) { 01937 return false; 01938 } 01939 return array_values($allbreaks); 01940 } 01941 01948 function feedback_get_last_break_position($feedbackid) { 01949 if (!$allbreaks = feedback_get_all_break_positions($feedbackid)) { 01950 return false; 01951 } 01952 return $allbreaks[count($allbreaks) - 1]; 01953 } 01954 01966 function feedback_get_page_to_continue($feedbackid, $courseid = false, $guestid = false) { 01967 global $CFG, $USER, $DB; 01968 01969 //is there any break? 01970 01971 if (!$allbreaks = feedback_get_all_break_positions($feedbackid)) { 01972 return false; 01973 } 01974 01975 $params = array(); 01976 if ($courseid) { 01977 $courseselect = "AND fv.course_id = :courseid"; 01978 $params['courseid'] = $courseid; 01979 } else { 01980 $courseselect = ''; 01981 } 01982 01983 if ($guestid) { 01984 $userselect = "AND fc.guestid = :guestid"; 01985 $usergroup = "GROUP BY fc.guestid"; 01986 $params['guestid'] = $guestid; 01987 } else { 01988 $userselect = "AND fc.userid = :userid"; 01989 $usergroup = "GROUP BY fc.userid"; 01990 $params['userid'] = $USER->id; 01991 } 01992 01993 $sql = "SELECT MAX(fi.position) 01994 FROM {feedback_completedtmp} fc, {feedback_valuetmp} fv, {feedback_item} fi 01995 WHERE fc.id = fv.completed 01996 $userselect 01997 AND fc.feedback = :feedbackid 01998 $courseselect 01999 AND fi.id = fv.item 02000 $usergroup"; 02001 $params['feedbackid'] = $feedbackid; 02002 02003 $lastpos = $DB->get_field_sql($sql, $params); 02004 02005 //the index of found pagebreak is the searched pagenumber 02006 foreach ($allbreaks as $pagenr => $br) { 02007 if ($lastpos < $br) { 02008 return $pagenr; 02009 } 02010 } 02011 return count($allbreaks); 02012 } 02013 02017 //functions to handle the values 02019 02031 function feedback_save_values($usrid, $tmp = false) { 02032 global $DB; 02033 02034 $completedid = optional_param('completedid', 0, PARAM_INT); 02035 02036 $tmpstr = $tmp ? 'tmp' : ''; 02037 $time = time(); 02038 $timemodified = mktime(0, 0, 0, date('m', $time), date('d', $time), date('Y', $time)); 02039 02040 if ($usrid == 0) { 02041 return feedback_create_values($usrid, $timemodified, $tmp); 02042 } 02043 $completed = $DB->get_record('feedback_completed'.$tmpstr, array('id'=>$completedid)); 02044 if (!$completed) { 02045 return feedback_create_values($usrid, $timemodified, $tmp); 02046 } else { 02047 $completed->timemodified = $timemodified; 02048 return feedback_update_values($completed, $tmp); 02049 } 02050 } 02051 02059 function feedback_save_guest_values($guestid) { 02060 global $DB; 02061 02062 $completedid = optional_param('completedid', false, PARAM_INT); 02063 02064 $timemodified = time(); 02065 if (!$completed = $DB->get_record('feedback_completedtmp', array('id'=>$completedid))) { 02066 return feedback_create_values(0, $timemodified, true, $guestid); 02067 } else { 02068 $completed->timemodified = $timemodified; 02069 return feedback_update_values($completed, true); 02070 } 02071 } 02072 02083 function feedback_get_item_value($completedid, $itemid, $tmp = false) { 02084 global $DB; 02085 02086 $tmpstr = $tmp ? 'tmp' : ''; 02087 $params = array('completed'=>$completedid, 'item'=>$itemid); 02088 return $DB->get_field('feedback_value'.$tmpstr, 'value', $params); 02089 } 02090 02104 function feedback_compare_item_value($completedid, $itemid, $dependvalue, $tmp = false) { 02105 global $DB, $CFG; 02106 02107 $dbvalue = feedback_get_item_value($completedid, $itemid, $tmp); 02108 02109 //get the class of the given item-typ 02110 $item = $DB->get_record('feedback_item', array('id'=>$itemid)); 02111 02112 //get the instance of the item-class 02113 $itemobj = feedback_get_item_class($item->typ); 02114 return $itemobj->compare_value($item, $dbvalue, $dependvalue); //true or false 02115 } 02116 02128 function feedback_check_values($firstitem, $lastitem) { 02129 global $DB, $CFG; 02130 02131 $feedbackid = optional_param('feedbackid', 0, PARAM_INT); 02132 02133 //get all items between the first- and lastitem 02134 $select = "feedback = ? 02135 AND position >= ? 02136 AND position <= ? 02137 AND hasvalue = 1"; 02138 $params = array($feedbackid, $firstitem, $lastitem); 02139 if (!$feedbackitems = $DB->get_records_select('feedback_item', $select, $params)) { 02140 //if no values are given so no values can be wrong ;-) 02141 return true; 02142 } 02143 02144 foreach ($feedbackitems as $item) { 02145 //get the instance of the item-class 02146 $itemobj = feedback_get_item_class($item->typ); 02147 02148 //the name of the input field of the completeform is given in a special form: 02149 //<item-typ>_<item-id> eg. numeric_234 02150 //this is the key to get the value for the correct item 02151 $formvalname = $item->typ . '_' . $item->id; 02152 02153 if ($itemobj->value_is_array()) { 02154 $value = optional_param_array($formvalname, null, $itemobj->value_type()); 02155 } else { 02156 $value = optional_param($formvalname, null, $itemobj->value_type()); 02157 } 02158 02159 //check if the value is set 02160 if (is_null($value) AND $item->required == 1) { 02161 return false; 02162 } 02163 02164 //now we let check the value by the item-class 02165 if (!$itemobj->check_value($value, $item)) { 02166 return false; 02167 } 02168 } 02169 //if no wrong values so we can return true 02170 return true; 02171 } 02172 02184 function feedback_create_values($usrid, $timemodified, $tmp = false, $guestid = false) { 02185 global $DB; 02186 02187 $feedbackid = optional_param('feedbackid', false, PARAM_INT); 02188 $anonymous_response = optional_param('anonymous_response', false, PARAM_INT); 02189 $courseid = optional_param('courseid', false, PARAM_INT); 02190 02191 $tmpstr = $tmp ? 'tmp' : ''; 02192 //first we create a new completed record 02193 $completed = new stdClass(); 02194 $completed->feedback = $feedbackid; 02195 $completed->userid = $usrid; 02196 $completed->guestid = $guestid; 02197 $completed->timemodified = $timemodified; 02198 $completed->anonymous_response = $anonymous_response; 02199 02200 $completedid = $DB->insert_record('feedback_completed'.$tmpstr, $completed); 02201 02202 $completed = $DB->get_record('feedback_completed'.$tmpstr, array('id'=>$completedid)); 02203 02204 //the keys are in the form like abc_xxx 02205 //with explode we make an array with(abc, xxx) and (abc=typ und xxx=itemnr) 02206 02207 //get the items of the feedback 02208 if (!$allitems = $DB->get_records('feedback_item', array('feedback'=>$completed->feedback))) { 02209 return false; 02210 } 02211 foreach ($allitems as $item) { 02212 if (!$item->hasvalue) { 02213 continue; 02214 } 02215 //get the class of item-typ 02216 $itemobj = feedback_get_item_class($item->typ); 02217 02218 $keyname = $item->typ.'_'.$item->id; 02219 02220 if ($itemobj->value_is_array()) { 02221 $itemvalue = optional_param_array($keyname, null, $itemobj->value_type()); 02222 } else { 02223 $itemvalue = optional_param($keyname, null, $itemobj->value_type()); 02224 } 02225 02226 if (is_null($itemvalue)) { 02227 continue; 02228 } 02229 02230 $value = new stdClass(); 02231 $value->item = $item->id; 02232 $value->completed = $completed->id; 02233 $value->course_id = $courseid; 02234 02235 //the kind of values can be absolutely different 02236 //so we run create_value directly by the item-class 02237 $value->value = $itemobj->create_value($itemvalue); 02238 $DB->insert_record('feedback_value'.$tmpstr, $value); 02239 } 02240 return $completed->id; 02241 } 02242 02252 function feedback_update_values($completed, $tmp = false) { 02253 global $DB; 02254 02255 $courseid = optional_param('courseid', false, PARAM_INT); 02256 $tmpstr = $tmp ? 'tmp' : ''; 02257 02258 $DB->update_record('feedback_completed'.$tmpstr, $completed); 02259 //get the values of this completed 02260 $values = $DB->get_records('feedback_value'.$tmpstr, array('completed'=>$completed->id)); 02261 02262 //get the items of the feedback 02263 if (!$allitems = $DB->get_records('feedback_item', array('feedback'=>$completed->feedback))) { 02264 return false; 02265 } 02266 foreach ($allitems as $item) { 02267 if (!$item->hasvalue) { 02268 continue; 02269 } 02270 //get the class of item-typ 02271 $itemobj = feedback_get_item_class($item->typ); 02272 02273 $keyname = $item->typ.'_'.$item->id; 02274 02275 if ($itemobj->value_is_array()) { 02276 $itemvalue = optional_param_array($keyname, null, $itemobj->value_type()); 02277 } else { 02278 $itemvalue = optional_param($keyname, null, $itemobj->value_type()); 02279 } 02280 02281 //is the itemvalue set (could be a subset of items because pagebreak)? 02282 if (is_null($itemvalue)) { 02283 continue; 02284 } 02285 02286 $newvalue = new stdClass(); 02287 $newvalue->item = $item->id; 02288 $newvalue->completed = $completed->id; 02289 $newvalue->course_id = $courseid; 02290 02291 //the kind of values can be absolutely different 02292 //so we run create_value directly by the item-class 02293 $newvalue->value = $itemobj->create_value($itemvalue); 02294 02295 //check, if we have to create or update the value 02296 $exist = false; 02297 foreach ($values as $value) { 02298 if ($value->item == $newvalue->item) { 02299 $newvalue->id = $value->id; 02300 $exist = true; 02301 break; 02302 } 02303 } 02304 if ($exist) { 02305 $DB->update_record('feedback_value'.$tmpstr, $newvalue); 02306 } else { 02307 $DB->insert_record('feedback_value'.$tmpstr, $newvalue); 02308 } 02309 } 02310 02311 return $completed->id; 02312 } 02313 02326 function feedback_get_group_values($item, 02327 $groupid = false, 02328 $courseid = false, 02329 $ignore_empty = false) { 02330 02331 global $CFG, $DB; 02332 02333 //if the groupid is given? 02334 if (intval($groupid) > 0) { 02335 if ($ignore_empty) { 02336 $ignore_empty_select = "AND fbv.value != '' AND fbv.value != '0'"; 02337 } else { 02338 $ignore_empty_select = ""; 02339 } 02340 02341 $query = 'SELECT fbv . * 02342 FROM {feedback_value} fbv, {feedback_completed} fbc, {groups_members} gm 02343 WHERE fbv.item = ? 02344 AND fbv.completed = fbc.id 02345 AND fbc.userid = gm.userid 02346 '.$ignore_empty_select.' 02347 AND gm.groupid = ? 02348 ORDER BY fbc.timemodified'; 02349 $values = $DB->get_records_sql($query, array($item->id, $groupid)); 02350 02351 } else { 02352 if ($ignore_empty) { 02353 $ignore_empty_select = "AND value != '' AND value != '0'"; 02354 } else { 02355 $ignore_empty_select = ""; 02356 } 02357 02358 if ($courseid) { 02359 $select = "item = ? AND course_id = ? ".$ignore_empty_select; 02360 $params = array($item->id, $courseid); 02361 $values = $DB->get_records_select('feedback_value', $select, $params); 02362 } else { 02363 $select = "item = ? ".$ignore_empty_select; 02364 $params = array($item->id); 02365 $values = $DB->get_records_select('feedback_value', $select, $params); 02366 } 02367 } 02368 $params = array('id'=>$item->feedback); 02369 if ($DB->get_field('feedback', 'anonymous', $params) == FEEDBACK_ANONYMOUS_YES) { 02370 if (is_array($values)) { 02371 shuffle($values); 02372 } 02373 } 02374 return $values; 02375 } 02376 02387 function feedback_is_already_submitted($feedbackid, $courseid = false) { 02388 global $USER, $DB; 02389 02390 $params = array('userid'=>$USER->id, 'feedback'=>$feedbackid); 02391 if (!$trackings = $DB->get_records_menu('feedback_tracking', $params, '', 'id, completed')) { 02392 return false; 02393 } 02394 02395 if ($courseid) { 02396 $select = 'completed IN ('.implode(',', $trackings).') AND course_id = ?'; 02397 if (!$values = $DB->get_records_select('feedback_value', $select, array($courseid))) { 02398 return false; 02399 } 02400 } 02401 02402 return true; 02403 } 02404 02419 function feedback_get_current_completed($feedbackid, 02420 $tmp = false, 02421 $courseid = false, 02422 $guestid = false) { 02423 02424 global $USER, $CFG, $DB; 02425 02426 $tmpstr = $tmp ? 'tmp' : ''; 02427 02428 if (!$courseid) { 02429 if ($guestid) { 02430 $params = array('feedback'=>$feedbackid, 'guestid'=>$guestid); 02431 return $DB->get_record('feedback_completed'.$tmpstr, $params); 02432 } else { 02433 $params = array('feedback'=>$feedbackid, 'userid'=>$USER->id); 02434 return $DB->get_record('feedback_completed'.$tmpstr, $params); 02435 } 02436 } 02437 02438 $params = array(); 02439 02440 if ($guestid) { 02441 $userselect = "AND fc.guestid = :guestid"; 02442 $params['guestid'] = $guestid; 02443 } else { 02444 $userselect = "AND fc.userid = :userid"; 02445 $params['userid'] = $USER->id; 02446 } 02447 //if courseid is set the feedback is global. 02448 //there can be more than one completed on one feedback 02449 $sql = "SELECT DISTINCT fc.* 02450 FROM {feedback_value{$tmpstr}} fv, {feedback_completed{$tmpstr}} fc 02451 WHERE fv.course_id = :courseid 02452 AND fv.completed = fc.id 02453 $userselect 02454 AND fc.feedback = :feedbackid"; 02455 $params['courseid'] = intval($courseid); 02456 $params['feedbackid'] = $feedbackid; 02457 02458 if (!$sqlresult = $DB->get_records_sql($sql, $params)) { 02459 return false; 02460 } 02461 foreach ($sqlresult as $r) { 02462 return $DB->get_record('feedback_completed'.$tmpstr, array('id'=>$r->id)); 02463 } 02464 } 02465 02476 function feedback_get_completeds_group($feedback, $groupid = false, $courseid = false) { 02477 global $CFG, $DB; 02478 02479 if (intval($groupid) > 0) { 02480 $query = "SELECT fbc.* 02481 FROM {feedback_completed} fbc, {groups_members} gm 02482 WHERE fbc.feedback = ? 02483 AND gm.groupid = ? 02484 AND fbc.userid = gm.userid"; 02485 if ($values = $DB->get_records_sql($query, array($feedback->id, $groupid))) { 02486 return $values; 02487 } else { 02488 return false; 02489 } 02490 } else { 02491 if ($courseid) { 02492 $query = "SELECT DISTINCT fbc.* 02493 FROM {feedback_completed} fbc, {feedback_value} fbv 02494 WHERE fbc.id = fbv.completed 02495 AND fbc.feedback = ? 02496 AND fbv.course_id = ? 02497 ORDER BY random_response"; 02498 if ($values = $DB->get_records_sql($query, array($feedback->id, $courseid))) { 02499 return $values; 02500 } else { 02501 return false; 02502 } 02503 } else { 02504 if ($values = $DB->get_records('feedback_completed', array('feedback'=>$feedback->id))) { 02505 return $values; 02506 } else { 02507 return false; 02508 } 02509 } 02510 } 02511 } 02512 02523 function feedback_get_completeds_group_count($feedback, $groupid = false, $courseid = false) { 02524 global $CFG, $DB; 02525 02526 if ($courseid > 0 AND !$groupid <= 0) { 02527 $sql = "SELECT id, COUNT(item) AS ci 02528 FROM {feedback_value} 02529 WHERE course_id = ? 02530 GROUP BY item ORDER BY ci DESC"; 02531 if ($foundrecs = $DB->get_records_sql($sql, array($courseid))) { 02532 $foundrecs = array_values($foundrecs); 02533 return $foundrecs[0]->ci; 02534 } 02535 return false; 02536 } 02537 if ($values = feedback_get_completeds_group($feedback, $groupid)) { 02538 return count($values); 02539 } else { 02540 return false; 02541 } 02542 } 02543 02552 function feedback_delete_all_completeds($feedbackid) { 02553 global $DB; 02554 02555 if (!$completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedbackid))) { 02556 return; 02557 } 02558 foreach ($completeds as $completed) { 02559 feedback_delete_completed($completed->id); 02560 } 02561 } 02562 02571 function feedback_delete_completed($completedid) { 02572 global $DB, $CFG; 02573 require_once($CFG->libdir.'/completionlib.php'); 02574 02575 if (!$completed = $DB->get_record('feedback_completed', array('id'=>$completedid))) { 02576 return false; 02577 } 02578 02579 if (!$feedback = $DB->get_record('feedback', array('id'=>$completed->feedback))) { 02580 return false; 02581 } 02582 02583 if (!$course = $DB->get_record('course', array('id'=>$feedback->course))) { 02584 return false; 02585 } 02586 02587 if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) { 02588 return false; 02589 } 02590 02591 //first we delete all related values 02592 $DB->delete_records('feedback_value', array('completed'=>$completed->id)); 02593 02594 //now we delete all tracking data 02595 $params = array('completed'=>$completed->id, 'feedback'=>$completed->feedback); 02596 if ($tracking = $DB->get_record('feedback_tracking', $params)) { 02597 $DB->delete_records('feedback_tracking', array('completed'=>$completed->id)); 02598 } 02599 02600 // Update completion state 02601 $completion = new completion_info($course); 02602 if ($completion->is_enabled($cm) && $feedback->completionsubmit) { 02603 $completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid); 02604 } 02605 //last we delete the completed-record 02606 return $DB->delete_records('feedback_completed', array('id'=>$completed->id)); 02607 } 02608 02612 //functions to handle sitecourse mapping 02614 02623 function feedback_is_course_in_sitecourse_map($feedbackid, $courseid) { 02624 global $DB; 02625 $params = array('feedbackid'=>$feedbackid, 'courseid'=>$courseid); 02626 return $DB->count_records('feedback_sitecourse_map', $params); 02627 } 02628 02636 function feedback_is_feedback_in_sitecourse_map($feedbackid) { 02637 global $DB; 02638 return $DB->record_exists('feedback_sitecourse_map', array('feedbackid'=>$feedbackid)); 02639 } 02640 02653 function feedback_get_feedbacks_from_sitecourse_map($courseid) { 02654 global $DB; 02655 02656 //first get all feedbacks listed in sitecourse_map with named courseid 02657 $sql = "SELECT f.id AS id, 02658 cm.id AS cmid, 02659 f.name AS name, 02660 f.timeopen AS timeopen, 02661 f.timeclose AS timeclose 02662 FROM {feedback} f, {course_modules} cm, {feedback_sitecourse_map} sm, {modules} m 02663 WHERE f.id = cm.instance 02664 AND f.course = '".SITEID."' 02665 AND m.id = cm.module 02666 AND m.name = 'feedback' 02667 AND sm.courseid = ? 02668 AND sm.feedbackid = f.id"; 02669 02670 if (!$feedbacks1 = $DB->get_records_sql($sql, array($courseid))) { 02671 $feedbacks1 = array(); 02672 } 02673 02674 //second get all feedbacks not listed in sitecourse_map 02675 $feedbacks2 = array(); 02676 $sql = "SELECT f.id AS id, 02677 cm.id AS cmid, 02678 f.name AS name, 02679 f.timeopen AS timeopen, 02680 f.timeclose AS timeclose 02681 FROM {feedback} f, {course_modules} cm, {modules} m 02682 WHERE f.id = cm.instance 02683 AND f.course = '".SITEID."' 02684 AND m.id = cm.module 02685 AND m.name = 'feedback'"; 02686 if (!$allfeedbacks = $DB->get_records_sql($sql)) { 02687 $allfeedbacks = array(); 02688 } 02689 foreach ($allfeedbacks as $a) { 02690 if (!$DB->record_exists('feedback_sitecourse_map', array('feedbackid'=>$a->id))) { 02691 $feedbacks2[] = $a; 02692 } 02693 } 02694 02695 return array_merge($feedbacks1, $feedbacks2); 02696 02697 } 02698 02706 function feedback_get_courses_from_sitecourse_map($feedbackid) { 02707 global $DB; 02708 02709 $sql = "SELECT f.id, f.courseid, c.fullname, c.shortname 02710 FROM {feedback_sitecourse_map} f, {course} c 02711 WHERE c.id = f.courseid 02712 AND f.feedbackid = ? 02713 ORDER BY c.fullname"; 02714 02715 return $DB->get_records_sql($sql, array($feedbackid)); 02716 02717 } 02718 02727 function feedback_clean_up_sitecourse_map() { 02728 global $DB; 02729 02730 $maps = $DB->get_records('feedback_sitecourse_map'); 02731 foreach ($maps as $map) { 02732 if (!$DB->get_record('course', array('id'=>$map->courseid))) { 02733 $params = array('courseid'=>$map->courseid, 'feedbackid'=>$map->feedbackid); 02734 $DB->delete_records('feedback_sitecourse_map', $params); 02735 continue; 02736 } 02737 if (!$DB->get_record('feedback', array('id'=>$map->feedbackid))) { 02738 $params = array('courseid'=>$map->courseid, 'feedbackid'=>$map->feedbackid); 02739 $DB->delete_records('feedback_sitecourse_map', $params); 02740 continue; 02741 } 02742 02743 } 02744 } 02745 02749 //not relatable functions 02751 02760 function feedback_print_numeric_option_list($startval, $endval, $selectval = '', $interval = 1) { 02761 for ($i = $startval; $i <= $endval; $i += $interval) { 02762 if ($selectval == ($i)) { 02763 $selected = 'selected="selected"'; 02764 } else { 02765 $selected = ''; 02766 } 02767 echo '<option '.$selected.'>'.$i.'</option>'; 02768 } 02769 } 02770 02784 function feedback_send_email($cm, $feedback, $course, $userid) { 02785 global $CFG, $DB; 02786 02787 if ($feedback->email_notification == 0) { // No need to do anything 02788 return; 02789 } 02790 02791 $user = $DB->get_record('user', array('id'=>$userid)); 02792 02793 if (isset($cm->groupmode) && empty($course->groupmodeforce)) { 02794 $groupmode = $cm->groupmode; 02795 } else { 02796 $groupmode = $course->groupmode; 02797 } 02798 02799 if ($groupmode == SEPARATEGROUPS) { 02800 $groups = $DB->get_records_sql_menu("SELECT g.name, g.id 02801 FROM {groups} g, {groups_members} m 02802 WHERE g.courseid = ? 02803 AND g.id = m.groupid 02804 AND m.userid = ? 02805 ORDER BY name ASC", array($course->id, $userid)); 02806 $groups = array_values($groups); 02807 02808 $teachers = feedback_get_receivemail_users($cm->id, $groups); 02809 } else { 02810 $teachers = feedback_get_receivemail_users($cm->id); 02811 } 02812 02813 if ($teachers) { 02814 02815 $strfeedbacks = get_string('modulenameplural', 'feedback'); 02816 $strfeedback = get_string('modulename', 'feedback'); 02817 $strcompleted = get_string('completed', 'feedback'); 02818 02819 if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) { 02820 $printusername = fullname($user); 02821 } else { 02822 $printusername = get_string('anonymous_user', 'feedback'); 02823 } 02824 02825 foreach ($teachers as $teacher) { 02826 $info = new stdClass(); 02827 $info->username = $printusername; 02828 $info->feedback = format_string($feedback->name, true); 02829 $info->url = $CFG->wwwroot.'/mod/feedback/show_entries.php?'. 02830 'id='.$cm->id.'&'. 02831 'userid='.$userid.'&'. 02832 'do_show=showentries'; 02833 02834 $postsubject = $strcompleted.': '.$info->username.' -> '.$feedback->name; 02835 $posttext = feedback_send_email_text($info, $course); 02836 02837 if ($teacher->mailformat == 1) { 02838 $posthtml = feedback_send_email_html($info, $course, $cm); 02839 } else { 02840 $posthtml = ''; 02841 } 02842 02843 if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO) { 02844 $eventdata = new stdClass(); 02845 $eventdata->name = 'submission'; 02846 $eventdata->component = 'mod_feedback'; 02847 $eventdata->userfrom = $user; 02848 $eventdata->userto = $teacher; 02849 $eventdata->subject = $postsubject; 02850 $eventdata->fullmessage = $posttext; 02851 $eventdata->fullmessageformat = FORMAT_PLAIN; 02852 $eventdata->fullmessagehtml = $posthtml; 02853 $eventdata->smallmessage = ''; 02854 message_send($eventdata); 02855 } else { 02856 $eventdata = new stdClass(); 02857 $eventdata->name = 'submission'; 02858 $eventdata->component = 'mod_feedback'; 02859 $eventdata->userfrom = $teacher; 02860 $eventdata->userto = $teacher; 02861 $eventdata->subject = $postsubject; 02862 $eventdata->fullmessage = $posttext; 02863 $eventdata->fullmessageformat = FORMAT_PLAIN; 02864 $eventdata->fullmessagehtml = $posthtml; 02865 $eventdata->smallmessage = ''; 02866 message_send($eventdata); 02867 } 02868 } 02869 } 02870 } 02871 02882 function feedback_send_email_anonym($cm, $feedback, $course) { 02883 global $CFG; 02884 02885 if ($feedback->email_notification == 0) { // No need to do anything 02886 return; 02887 } 02888 02889 $teachers = feedback_get_receivemail_users($cm->id); 02890 02891 if ($teachers) { 02892 02893 $strfeedbacks = get_string('modulenameplural', 'feedback'); 02894 $strfeedback = get_string('modulename', 'feedback'); 02895 $strcompleted = get_string('completed', 'feedback'); 02896 $printusername = get_string('anonymous_user', 'feedback'); 02897 02898 foreach ($teachers as $teacher) { 02899 $info = new stdClass(); 02900 $info->username = $printusername; 02901 $info->feedback = format_string($feedback->name, true); 02902 $info->url = $CFG->wwwroot.'/mod/feedback/show_entries_anonym.php?id='.$cm->id; 02903 02904 $postsubject = $strcompleted.': '.$info->username.' -> '.$feedback->name; 02905 $posttext = feedback_send_email_text($info, $course); 02906 02907 if ($teacher->mailformat == 1) { 02908 $posthtml = feedback_send_email_html($info, $course, $cm); 02909 } else { 02910 $posthtml = ''; 02911 } 02912 02913 $eventdata = new stdClass(); 02914 $eventdata->name = 'submission'; 02915 $eventdata->component = 'mod_feedback'; 02916 $eventdata->userfrom = $teacher; 02917 $eventdata->userto = $teacher; 02918 $eventdata->subject = $postsubject; 02919 $eventdata->fullmessage = $posttext; 02920 $eventdata->fullmessageformat = FORMAT_PLAIN; 02921 $eventdata->fullmessagehtml = $posthtml; 02922 $eventdata->smallmessage = ''; 02923 message_send($eventdata); 02924 } 02925 } 02926 } 02927 02935 function feedback_send_email_text($info, $course) { 02936 $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id); 02937 $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext)); 02938 $posttext = $courseshortname.' -> '.get_string('modulenameplural', 'feedback').' -> '. 02939 $info->feedback."\n"; 02940 $posttext .= '---------------------------------------------------------------------'."\n"; 02941 $posttext .= get_string("emailteachermail", "feedback", $info)."\n"; 02942 $posttext .= '---------------------------------------------------------------------'."\n"; 02943 return $posttext; 02944 } 02945 02946 02955 function feedback_send_email_html($info, $course, $cm) { 02956 global $CFG; 02957 $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id); 02958 $courseshortname = format_string($course->shortname, true, array('context' => $coursecontext)); 02959 $course_url = $CFG->wwwroot.'/course/view.php?id='.$course->id; 02960 $feedback_all_url = $CFG->wwwroot.'/mod/feedback/index.php?id='.$course->id; 02961 $feedback_url = $CFG->wwwroot.'/mod/feedback/view.php?id='.$cm->id; 02962 02963 $posthtml = '<p><font face="sans-serif">'. 02964 '<a href="'.$course_url.'">'.$courseshortname.'</a> ->'. 02965 '<a href="'.$feedback_all_url.'">'.get_string('modulenameplural', 'feedback').'</a> ->'. 02966 '<a href="'.$feedback_url.'">'.$info->feedback.'</a></font></p>'; 02967 $posthtml .= '<hr /><font face="sans-serif">'; 02968 $posthtml .= '<p>'.get_string('emailteachermailhtml', 'feedback', $info).'</p>'; 02969 $posthtml .= '</font><hr />'; 02970 return $posthtml; 02971 } 02972 02977 function feedback_encode_target_url($url) { 02978 if (strpos($url, '?')) { 02979 list($part1, $part2) = explode('?', $url, 2); //maximal 2 parts 02980 return $part1 . '?' . htmlentities($part2); 02981 } else { 02982 return $url; 02983 } 02984 } 02985 02992 function feedback_extend_settings_navigation(settings_navigation $settings, 02993 navigation_node $feedbacknode) { 02994 02995 global $PAGE, $DB; 02996 02997 if (!$context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id)) { 02998 print_error('badcontext'); 02999 } 03000 03001 if (has_capability('mod/feedback:edititems', $context)) { 03002 $questionnode = $feedbacknode->add(get_string('questions', 'feedback')); 03003 03004 $questionnode->add(get_string('edit_items', 'feedback'), 03005 new moodle_url('/mod/feedback/edit.php', 03006 array('id' => $PAGE->cm->id, 03007 'do_show' => 'edit'))); 03008 03009 $questionnode->add(get_string('export_questions', 'feedback'), 03010 new moodle_url('/mod/feedback/export.php', 03011 array('id' => $PAGE->cm->id, 03012 'action' => 'exportfile'))); 03013 03014 $questionnode->add(get_string('import_questions', 'feedback'), 03015 new moodle_url('/mod/feedback/import.php', 03016 array('id' => $PAGE->cm->id))); 03017 03018 $questionnode->add(get_string('templates', 'feedback'), 03019 new moodle_url('/mod/feedback/edit.php', 03020 array('id' => $PAGE->cm->id, 03021 'do_show' => 'templates'))); 03022 } 03023 03024 if (has_capability('mod/feedback:viewreports', $context)) { 03025 $feedback = $DB->get_record('feedback', array('id'=>$PAGE->cm->instance)); 03026 if ($feedback->course == SITEID) { 03027 $feedbacknode->add(get_string('analysis', 'feedback'), 03028 new moodle_url('/mod/feedback/analysis_course.php', 03029 array('id' => $PAGE->cm->id, 03030 'course' => $PAGE->course->id, 03031 'do_show' => 'analysis'))); 03032 } else { 03033 $feedbacknode->add(get_string('analysis', 'feedback'), 03034 new moodle_url('/mod/feedback/analysis.php', 03035 array('id' => $PAGE->cm->id, 03036 'course' => $PAGE->course->id, 03037 'do_show' => 'analysis'))); 03038 } 03039 03040 $feedbacknode->add(get_string('show_entries', 'feedback'), 03041 new moodle_url('/mod/feedback/show_entries.php', 03042 array('id' => $PAGE->cm->id, 03043 'do_show' => 'showentries'))); 03044 } 03045 } 03046 03047 function feedback_init_feedback_session() { 03048 //initialize the feedback-Session - not nice at all!! 03049 global $SESSION; 03050 if (!empty($SESSION)) { 03051 if (!isset($SESSION->feedback) OR !is_object($SESSION->feedback)) { 03052 $SESSION->feedback = new stdClass(); 03053 } 03054 } 03055 } 03056 03063 function feedback_page_type_list($pagetype, $parentcontext, $currentcontext) { 03064 $module_pagetype = array('mod-feedback-*'=>get_string('page-mod-feedback-x', 'feedback')); 03065 return $module_pagetype; 03066 }