MDL-25805 Roles propagated ugly hack for parent seeing child activities into navigati...
[moodle.git] / mod / forum / user.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Display user activity reports for a course
20  *
21  * @package mod-forum
22  * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 require_once('../../config.php');
27 require_once('lib.php');
29 // Course ID
30 $course  = optional_param('course', SITEID, PARAM_INT);
31 // User ID
32 $id      = optional_param('id', 0, PARAM_INT);
33 $mode    = optional_param('mode', 'posts', PARAM_ALPHA);
34 $page    = optional_param('page', 0, PARAM_INT);
35 $perpage = optional_param('perpage', 5, PARAM_INT);
37 $url = new moodle_url('/mod/forum/user.php');
38 if ($course !== SITEID) {
39     $url->param('course', $course);
40 }
41 if ($id !== 0) {
42     $url->param('id', $id);
43 }
44 if ($mode !== 'posts') {
45     $url->param('mode', $mode);
46 }
47 $PAGE->set_url($url);
48 $PAGE->set_pagelayout('standard');
50 if (empty($id)) {         // See your own profile by default
51     require_login();
52     $id = $USER->id;
53 }
55 $user = $DB->get_record("user", array("id" => $id), '*', MUST_EXIST);
56 $course = $DB->get_record("course", array("id" => $course), '*', MUST_EXIST);
58 $syscontext = get_context_instance(CONTEXT_SYSTEM);
59 $usercontext   = get_context_instance(CONTEXT_USER, $id);
61 // do not force parents to enrol
62 if (!$DB->get_record('role_assignments', array('userid' => $USER->id, 'contextid' => $usercontext->id))) {
63     require_course_login($course);
64 } else {
65     $PAGE->set_course($course);
66 }
68 if ($user->deleted) {
69     echo $OUTPUT->header();
70     echo $OUTPUT->heading(get_string('userdeleted'));
71     echo $OUTPUT->footer();
72     die;
73 }
75 add_to_log($course->id, "forum", "user report",
76         "user.php?course=$course->id&amp;id=$user->id&amp;mode=$mode", "$user->id");
78 $strforumposts   = get_string('forumposts', 'forum');
79 $strparticipants = get_string('participants');
80 $strmode         = get_string($mode, 'forum');
81 $fullname        = fullname($user, has_capability('moodle/site:viewfullnames', $syscontext));
83 $link = null;
84 if (has_capability('moodle/course:viewparticipants', get_context_instance(CONTEXT_COURSE, $course->id)) || has_capability('moodle/site:viewparticipants', $syscontext)) {
85     $link = new moodle_url('/user/index.php',array('id'=>$course->id));
86 }
88 $PAGE->navigation->extend_for_user($user);
89 $PAGE->navigation->set_userid_for_parent_nav_hack($id); // see MDL-25805 for reasons and for full commit reference for reversal when fixed.
90 $PAGE->set_title("$course->shortname: $fullname: $strmode");
91 $PAGE->set_heading($course->fullname);
92 echo $OUTPUT->header();
93 echo $OUTPUT->heading($fullname);
95 switch ($mode) {
96     case 'posts' :
97         $searchterms = array('userid:'.$user->id);
98         $extrasql = '';
99         break;
101     default:
102         $searchterms = array('userid:'.$user->id);
103         $extrasql = 'AND p.parent = 0';
104         break;
107 echo '<div class="user-content">';
109 if ($course->id == SITEID) {
110     $searchcourse = SITEID;
111     if (empty($CFG->forceloginforprofiles) or (isloggedin() and !isguestuser() and !is_web_crawler())) {
112         // Search throughout the whole site.
113         $searchcourse = 0;
114     }
115 } else {
116     // Search only for posts the user made in this course.
117     $searchcourse = $course->id;
120 // Get the posts.
121 if ($posts = forum_search_posts($searchterms, $searchcourse, $page*$perpage, $perpage, $totalcount, $extrasql)) {
123     require_once($CFG->dirroot.'/rating/lib.php');
125     $baseurl = new moodle_url('user.php', array('id' => $user->id, 'course' => $course->id, 'mode' => $mode, 'perpage' => $perpage));
126     echo $OUTPUT->paging_bar($totalcount, $page, $perpage, $baseurl);
128     $discussions = array();
129     $forums      = array();
130     $cms         = array();
132     //todo Rather than retrieving the ratings for each post individually it would be nice to do them in groups
133     //however this requires creating arrays of posts with each array containing all of the posts from a particular forum,
134     //retrieving the ratings then reassembling them all back into a single array sorted by post.modified (descending)
135     $rm = new rating_manager();
136     $ratingoptions = new stdclass();
137     $ratingoptions->plugintype = 'mod';
138     $ratingoptions->pluginname = 'forum';
140     foreach ($posts as $post) {
142         if (!isset($discussions[$post->discussion])) {
143             if (! $discussion = $DB->get_record('forum_discussions', array('id' => $post->discussion))) {
144                 print_error('invaliddiscussionid', 'forum');
145             }
146             $discussions[$post->discussion] = $discussion;
147         } else {
148             $discussion = $discussions[$post->discussion];
149         }
151         if (!isset($forums[$discussion->forum])) {
152             if (! $forum = $DB->get_record('forum', array('id' => $discussion->forum))) {
153                 print_error('invalidforumid', 'forum');
154             }
155             //hold onto forum cm and context for when we load ratings
156             if ($forumcm = get_coursemodule_from_instance('forum', $forum->id)) {
157                 $forum->cm = $forumcm;
158                 $forumcontext = get_context_instance(CONTEXT_MODULE, $forum->cm->id);
159                 $forum->context = $forumcontext;
160             }
161             $forums[$discussion->forum] = $forum;
162         } else {
163             $forum = $forums[$discussion->forum];
164         }
166         //load ratings
167         if ($forum->assessed!=RATING_AGGREGATE_NONE) {
168             $ratingoptions->context = $forum->context;
169             $ratingoptions->items = array($post);
170             $ratingoptions->aggregate = $forum->assessed;//the aggregation method
171             $ratingoptions->scaleid = $forum->scale;
172             $ratingoptions->userid = $user->id;
173             if ($forum->type == 'single' or !$discussion->id) {
174                 $ratingoptions->returnurl = "$CFG->wwwroot/mod/forum/view.php?id={$forum->cm->id}";
175             } else {
176                 $ratingoptions->returnurl = "$CFG->wwwroot/mod/forum/discuss.php?d=$discussion->id";
177             }
178             $ratingoptions->assesstimestart = $forum->assesstimestart;
179             $ratingoptions->assesstimefinish = $forum->assesstimefinish;
181             $updatedpost = $rm->get_ratings($ratingoptions);
182             //updating the array this way because we're iterating over a collection and updating them one by one
183             $posts[$updatedpost[0]->id] = $updatedpost[0];
184         }
186         if (!isset($cms[$forum->id])) {
187             $cm = get_coursemodule_from_instance('forum', $forum->id, 0, false, MUST_EXIST);
188             $cms[$forum->id] = $cm;
189             unset($cm); // do not use cm directly, it would break caching
190         }
192         $fullsubject = "<a href=\"view.php?f=$forum->id\">".format_string($forum->name,true)."</a>";
193         if ($forum->type != 'single') {
194             $fullsubject .= " -> <a href=\"discuss.php?d=$discussion->id\">".format_string($discussion->name,true)."</a>";
195             if ($post->parent != 0) {
196                 $fullsubject .= " -> <a href=\"discuss.php?d=$post->discussion&amp;parent=$post->id\">".format_string($post->subject,true)."</a>";
197             }
198         }
200         if ($course->id == SITEID && has_capability('moodle/site:config', $syscontext)) {
201             $postcoursename = $DB->get_field('course', 'shortname', array('id'=>$forum->course));
202             $fullsubject = '<a href="'.$CFG->wwwroot.'/course/view.php?id='.$forum->course.'">'.$postcoursename.'</a> -> '. $fullsubject;
203         }
205         $post->subject = $fullsubject;
207         $fulllink = "<a href=\"discuss.php?d=$post->discussion#p$post->id\">".
208             get_string("postincontext", "forum")."</a>";
210         forum_print_post($post, $discussion, $forum, $cms[$forum->id], $course, false, false, false, $fulllink);
211         echo "<br />";
212     }
214     echo $OUTPUT->paging_bar($totalcount, $page, $perpage, $baseurl);
215 } else {
216     if ($mode == 'posts') {
217         echo $OUTPUT->heading(get_string('noposts', 'forum'));
218     } else {
219         echo $OUTPUT->heading(get_string('nodiscussionsstartedby', 'forum'));
220     }
222 echo '</div>';
223 echo $OUTPUT->footer();