Moodle  2.2.1
http://www.collinsharper.com
C:/xampp/htdocs/moodle/mod/feedback/lib.php
Go to the documentation of this file.
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}&amp;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 }
 All Data Structures Namespaces Files Functions Variables Enumerations