Search moodle.org's
Developer Documentation

  • Bug fixes for general core bugs in 3.11.x will end 9 May 2022 (12 months).
  • Bug fixes for security issues in 3.11.x will end 14 November 2022 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
  • /mod/forum/ -> user.php (source)

    Differences Between: [Versions 35 and 311] [Versions 36 and 311] [Versions 37 and 311] [Versions 38 and 311]

       1  <?php
       2  
       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/>.
      17  
      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   */
      25  
      26  require(__DIR__.'/../../config.php');
      27  require_once($CFG->dirroot.'/mod/forum/lib.php');
      28  require_once($CFG->dirroot.'/rating/lib.php');
      29  require_once($CFG->dirroot.'/user/lib.php');
      30  
      31  $courseid  = optional_param('course', null, PARAM_INT); // Limit the posts to just this course
      32  $userid = optional_param('id', $USER->id, PARAM_INT);        // User id whose posts we want to view
      33  $mode = optional_param('mode', 'posts', PARAM_ALPHA);   // The mode to use. Either posts or discussions
      34  $page = optional_param('page', 0, PARAM_INT);           // The page number to display
      35  $perpage = optional_param('perpage', 5, PARAM_INT);     // The number of posts to display per page
      36  
      37  if (empty($userid)) {
      38      if (!isloggedin()) {
      39          require_login();
      40      }
      41      $userid = $USER->id;
      42  }
      43  
      44  $discussionsonly = ($mode !== 'posts');
      45  $isspecificcourse = !is_null($courseid);
      46  $iscurrentuser = ($USER->id == $userid);
      47  
      48  $url = new moodle_url('/mod/forum/user.php', array('id' => $userid));
      49  if ($isspecificcourse) {
      50      $url->param('course', $courseid);
      51  }
      52  if ($discussionsonly) {
      53      $url->param('mode', 'discussions');
      54  }
      55  
      56  $PAGE->set_url($url);
      57  $PAGE->set_pagelayout('standard');
      58  
      59  if ($page != 0) {
      60      $url->param('page', $page);
      61  }
      62  if ($perpage != 5) {
      63      $url->param('perpage', $perpage);
      64  }
      65  
      66  $user = $DB->get_record("user", array("id" => $userid), '*', MUST_EXIST);
      67  $usercontext = context_user::instance($user->id, MUST_EXIST);
      68  // Check if the requested user is the guest user
      69  if (isguestuser($user)) {
      70      // The guest user cannot post, so it is not possible to view any posts.
      71      // May as well just bail aggressively here.
      72      print_error('invaliduserid');
      73  }
      74  // Make sure the user has not been deleted
      75  if ($user->deleted) {
      76      $PAGE->set_title(get_string('userdeleted'));
      77      $PAGE->set_context(context_system::instance());
      78      echo $OUTPUT->header();
      79      echo $OUTPUT->heading($PAGE->title);
      80      echo $OUTPUT->footer();
      81      die;
      82  }
      83  
      84  $isloggedin = isloggedin();
      85  $isguestuser = $isloggedin && isguestuser();
      86  $isparent = !$iscurrentuser && $DB->record_exists('role_assignments', array('userid'=>$USER->id, 'contextid'=>$usercontext->id));
      87  $hasparentaccess = $isparent && has_all_capabilities(array('moodle/user:viewdetails', 'moodle/user:readuserposts'), $usercontext);
      88  
      89  // Check whether a specific course has been requested
      90  if ($isspecificcourse) {
      91      // Get the requested course and its context
      92      $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
      93      $coursecontext = context_course::instance($courseid, MUST_EXIST);
      94      // We have a specific course to search, which we will also assume we are within.
      95      if ($hasparentaccess) {
      96          // A `parent` role won't likely have access to the course so we won't attempt
      97          // to enter it. We will however still make them jump through the normal
      98          // login hoops
      99          require_login();
     100          $PAGE->set_context($coursecontext);
     101          $PAGE->set_course($course);
     102      } else {
     103          // Enter the course we are searching
     104          require_login($course);
     105      }
     106      // Get the course ready for access checks
     107      $courses = array($courseid => $course);
     108  } else {
     109      // We are going to search for all of the users posts in all courses!
     110      // a general require login here as we arn't actually within any course.
     111      require_login();
     112      $PAGE->set_context(context_user::instance($user->id));
     113  
     114      // Now we need to get all of the courses to search.
     115      // All courses where the user has posted within a forum will be returned.
     116      $courses = forum_get_courses_user_posted_in($user, $discussionsonly);
     117  }
     118  
     119  $params = array(
     120      'context' => $PAGE->context,
     121      'relateduserid' => $user->id,
     122      'other' => array('reportmode' => $mode),
     123  );
     124  $event = \mod_forum\event\user_report_viewed::create($params);
     125  $event->trigger();
     126  
     127  // Get the posts by the requested user that the current user can access.
     128  $result = forum_get_posts_by_user($user, $courses, $isspecificcourse, $discussionsonly, ($page * $perpage), $perpage);
     129  
     130  // Check whether there are not posts to display.
     131  if (empty($result->posts)) {
     132      // Ok no posts to display means that either the user has not posted or there
     133      // are no posts made by the requested user that the current user is able to
     134      // see.
     135      // In either case we need to decide whether we can show personal information
     136      // about the requested user to the current user so we will execute some checks
     137  
     138      $canviewuser = user_can_view_profile($user, null, $usercontext);
     139  
     140      // Prepare the page title
     141      $pagetitle = get_string('noposts', 'mod_forum');
     142  
     143      // Get the page heading
     144      if ($isspecificcourse) {
     145          $pageheading = format_string($course->fullname, true, array('context' => $coursecontext));
     146      } else {
     147          $pageheading = get_string('pluginname', 'mod_forum');
     148      }
     149  
     150      // Next we need to set up the loading of the navigation and choose a message
     151      // to display to the current user.
     152      if ($iscurrentuser) {
     153          // No need to extend the navigation it happens automatically for the
     154          // current user.
     155          if ($discussionsonly) {
     156              $notification = get_string('nodiscussionsstartedbyyou', 'forum');
     157          } else {
     158              $notification = get_string('nopostsmadebyyou', 'forum');
     159          }
     160          // These are the user's forum interactions.
     161          // Shut down the navigation 'Users' node.
     162          $usernode = $PAGE->navigation->find('users', null);
     163          $usernode->make_inactive();
     164          // Edit navbar.
     165          if (isset($courseid) && $courseid != SITEID) {
     166              // Create as much of the navbar automatically.
     167              if ($newusernode = $PAGE->navigation->find('user' . $user->id, null)) {
     168                  $newusernode->make_active();
     169              }
     170              // Check to see if this is a discussion or a post.
     171              if ($mode == 'posts') {
     172                  $navbar = $PAGE->navbar->add(get_string('posts', 'forum'), new moodle_url('/mod/forum/user.php',
     173                          array('id' => $user->id, 'course' => $courseid)));
     174              } else {
     175                  $navbar = $PAGE->navbar->add(get_string('discussions', 'forum'), new moodle_url('/mod/forum/user.php',
     176                          array('id' => $user->id, 'course' => $courseid, 'mode' => 'discussions')));
     177              }
     178          }
     179      } else if ($canviewuser) {
     180          $PAGE->navigation->extend_for_user($user);
     181          $PAGE->navigation->set_userid_for_parent_checks($user->id); // see MDL-25805 for reasons and for full commit reference for reversal when fixed.
     182  
     183          // Edit navbar.
     184          if (isset($courseid) && $courseid != SITEID) {
     185              // Create as much of the navbar automatically.
     186              if ($usernode = $PAGE->navigation->find('user' . $user->id, null)) {
     187                  $usernode->make_active();
     188              }
     189              // Check to see if this is a discussion or a post.
     190              if ($mode == 'posts') {
     191                  $navbar = $PAGE->navbar->add(get_string('posts', 'forum'), new moodle_url('/mod/forum/user.php',
     192                          array('id' => $user->id, 'course' => $courseid)));
     193              } else {
     194                  $navbar = $PAGE->navbar->add(get_string('discussions', 'forum'), new moodle_url('/mod/forum/user.php',
     195                          array('id' => $user->id, 'course' => $courseid, 'mode' => 'discussions')));
     196              }
     197          }
     198  
     199          $fullname = fullname($user);
     200          if ($discussionsonly) {
     201              $notification = get_string('nodiscussionsstartedby', 'forum', $fullname);
     202          } else {
     203              $notification = get_string('nopostsmadebyuser', 'forum', $fullname);
     204          }
     205      } else {
     206          // Don't extend the navigation it would be giving out information that
     207          // the current uesr doesn't have access to.
     208          $notification = get_string('cannotviewusersposts', 'forum');
     209          if ($isspecificcourse) {
     210              $url = new moodle_url('/course/view.php', array('id' => $courseid));
     211          } else {
     212              $url = new moodle_url('/');
     213          }
     214          navigation_node::override_active_url($url);
     215      }
     216  
     217      // Display a page letting the user know that there's nothing to display;
     218      $PAGE->set_title($pagetitle);
     219      if ($isspecificcourse) {
     220          $PAGE->set_heading($pageheading);
     221      } else if ($canviewuser) {
     222          $PAGE->set_heading(fullname($user));
     223      } else {
     224          $PAGE->set_heading($SITE->fullname);
     225      }
     226      echo $OUTPUT->header();
     227      if (!$isspecificcourse) {
     228          echo $OUTPUT->heading($pagetitle);
     229      } else {
     230          $userheading = array(
     231                  'heading' => fullname($user),
     232                  'user' => $user,
     233                  'usercontext' => $usercontext
     234              );
     235          echo $OUTPUT->context_header($userheading, 2);
     236      }
     237      echo $OUTPUT->notification($notification);
     238      if (!$url->compare($PAGE->url)) {
     239          echo $OUTPUT->continue_button($url);
     240      }
     241      echo $OUTPUT->footer();
     242      die;
     243  }
     244  
     245  $discussions = array();
     246  foreach ($result->posts as $post) {
     247      $discussions[] = $post->discussion;
     248  }
     249  $discussions = $DB->get_records_list('forum_discussions', 'id', array_unique($discussions));
     250  
     251  $entityfactory = mod_forum\local\container::get_entity_factory();
     252  $rendererfactory = mod_forum\local\container::get_renderer_factory();
     253  $postsrenderer = $rendererfactory->get_user_forum_posts_report_renderer(!$isspecificcourse && !$hasparentaccess);
     254  $postoutput = $postsrenderer->render(
     255      $USER,
     256      array_map(function($forum) use ($entityfactory, $result) {
     257          $cm = $forum->cm;
     258          $context = context_module::instance($cm->id);
     259          $course = $result->courses[$forum->course];
     260          return $entityfactory->get_forum_from_stdclass($forum, $context, $cm, $course);
     261      }, $result->forums),
     262      array_map(function($discussion) use ($entityfactory) {
     263          return $entityfactory->get_discussion_from_stdclass($discussion);
     264      }, $discussions),
     265      array_map(function($post) use ($entityfactory) {
     266          return $entityfactory->get_post_from_stdclass($post);
     267      }, $result->posts)
     268  );
     269  
     270  $userfullname = fullname($user);
     271  
     272  if ($discussionsonly) {
     273      $inpageheading = get_string('discussionsstartedby', 'mod_forum', $userfullname);
     274  } else {
     275      $inpageheading = get_string('postsmadebyuser', 'mod_forum', $userfullname);
     276  }
     277  if ($isspecificcourse) {
     278      $a = new stdClass;
     279      $a->fullname = $userfullname;
     280      $a->coursename = format_string($course->fullname, true, array('context' => $coursecontext));
     281      $pageheading = $a->coursename;
     282      if ($discussionsonly) {
     283          $pagetitle = get_string('discussionsstartedbyuserincourse', 'mod_forum', $a);
     284      } else {
     285          $pagetitle = get_string('postsmadebyuserincourse', 'mod_forum', $a);
     286      }
     287  } else {
     288      $pagetitle = $inpageheading;
     289      $pageheading = $userfullname;
     290  }
     291  
     292  $PAGE->set_title($pagetitle);
     293  $PAGE->set_heading($pageheading);
     294  
     295  $PAGE->navigation->extend_for_user($user);
     296  $PAGE->navigation->set_userid_for_parent_checks($user->id); // see MDL-25805 for reasons and for full commit reference for reversal when fixed.
     297  
     298  // Edit navbar.
     299  if (isset($courseid) && $courseid != SITEID) {
     300      if ($usernode = $PAGE->navigation->find('user' . $user->id , null)) {
     301          $usernode->make_active();
     302      }
     303  
     304      // Check to see if this is a discussion or a post.
     305      if ($mode == 'posts') {
     306          $navbar = $PAGE->navbar->add(get_string('posts', 'forum'), new moodle_url('/mod/forum/user.php',
     307                  array('id' => $user->id, 'course' => $courseid)));
     308      } else {
     309          $navbar = $PAGE->navbar->add(get_string('discussions', 'forum'), new moodle_url('/mod/forum/user.php',
     310                  array('id' => $user->id, 'course' => $courseid, 'mode' => 'discussions')));
     311      }
     312  }
     313  
     314  echo $OUTPUT->header();
     315  echo html_writer::start_tag('div', array('class' => 'user-content'));
     316  
     317  if ($isspecificcourse) {
     318      $userheading = array(
     319          'heading' => fullname($user),
     320          'user' => $user,
     321          'usercontext' => $usercontext
     322      );
     323      echo $OUTPUT->context_header($userheading, 2);
     324  } else {
     325      echo $OUTPUT->heading($inpageheading);
     326  }
     327  
     328  if (!empty($postoutput)) {
     329      echo $OUTPUT->paging_bar($result->totalcount, $page, $perpage, $url);
     330      echo $postoutput;
     331      echo $OUTPUT->paging_bar($result->totalcount, $page, $perpage, $url);
     332  } else if ($discussionsonly) {
     333      echo $OUTPUT->heading(get_string('nodiscussionsstartedby', 'forum', $userfullname));
     334  } else {
     335      echo $OUTPUT->heading(get_string('noposts', 'forum'));
     336  }
     337  
     338  echo html_writer::end_tag('div');
     339  echo $OUTPUT->footer();