*
*/
function forum_user_complete($course, $user, $mod, $forum) {
- global $CFG;
+ global $CFG,$USER;
if ($posts = forum_get_user_posts($forum->id, $user->id)) {
}
$discussions = forum_get_user_involved_discussions($forum->id, $user->id);
+ // preload all user ratings for these discussions - one query only and minimal memory
+ $cm->cache->ratings = array();
+ $cm->cache->myratings = array();
+ if ($postratings = forum_get_all_user_ratings($user->id, $discussions)) {
+ foreach ($postratings as $pr) {
+ if (!isset($cm->cache->ratings[$pr->postid])) {
+ $cm->cache->ratings[$pr->postid] = array();
+ }
+ $cm->cache->ratings[$pr->postid][$pr->id] = $pr->rating;
+
+ if ($pr->userid == $USER->id) {
+ $cm->cache->myratings[$pr->postid] = $pr->rating;
+ }
+ }
+ unset($postratings);
+ }
+
foreach ($posts as $post) {
if (!isset($discussions[$post->discussion])) {
continue;
}
}
- pre_load_all_ratings($cm, $discussion);
forum_print_post($post, $discussion, $forum, $cm, $course, false, false, false, $ratings);
}
}
-/**
- * Preload all ratings of a discussion into course module
- * Use this function to optimize post display with ratings:
- * one query only and minimal memory
- * @param object $cm course module (passed by reference as cache attribut is modified)
- * @param object $discussion the discussion for which the ratings are cached
- */
-function pre_load_all_ratings(&$cm, $discussion) {
- global $CFG,$USER;
- $cm->cache->ratings = array();
- $cm->cache->myratings = array();
- if ($postratings = forum_get_all_discussion_ratings($discussion)) {
- foreach ($postratings as $pr) {
- if (!isset($cm->cache->ratings[$pr->postid])) {
- $cm->cache->ratings[$pr->postid] = array();
- }
- $cm->cache->ratings[$pr->postid][$pr->id] = $pr->rating;
- if ($pr->userid == $USER->id) {
- $cm->cache->myratings[$pr->postid] = $pr->rating;
- }
- }
- }
-}
+
+
+
/**
ORDER BY p.id ASC", array($discussion->id));
}
+/**
+ * Returns a list of ratings for one specific user for all posts in discussion
+ * @global object $CFG
+ * @global object $DB
+ * @param object $discussions the discussions for which we return all ratings
+ * @param int $userid the user for who we return all ratings
+ * @return object
+ */
+function forum_get_all_user_ratings($userid, $discussions) {
+ global $CFG, $DB;
+
+
+ foreach ($discussions as $discussion) {
+ if (!isset($discussionsid)){
+ $discussionsid = $discussion->id;
+ }
+ else {
+ $discussionsid .= ",".$discussion->id;
+ }
+ }
+
+ $sql = "SELECT r.id, r.userid, p.id AS postid, r.rating
+ FROM {$CFG->prefix}forum_ratings r,
+ {$CFG->prefix}forum_posts p
+ WHERE r.post = p.id AND p.userid = :userid";
+
+
+ $params = array();
+ $params['userid'] = $userid;
+ //postgres compability
+ if (!isset($discussionsid)) {
+ $sql .=" AND p.discussion IN (".$discussionsid.")";
+ }
+ $sql .=" ORDER BY p.id ASC";
+
+ return $DB->get_records_sql($sql, $params);
+
+
+}
+
/**
* Returns a list of ratings for a particular post - sorted.
* @param int $postid
echo '<input type="hidden" name="forumid" value="'.$forum->id.'" />';
$ratingsformused = true;
}
- pre_load_all_ratings($cm, $discussion);
+ // preload all ratings - one query only and minimal memory
+ $cm->cache->ratings = array();
+ $cm->cache->myratings = array();
+ if ($postratings = forum_get_all_discussion_ratings($discussion)) {
+ foreach ($postratings as $pr) {
+ if (!isset($cm->cache->ratings[$pr->postid])) {
+ $cm->cache->ratings[$pr->postid] = array();
+ }
+ $cm->cache->ratings[$pr->postid][$pr->id] = $pr->rating;
+ if ($pr->userid == $USER->id) {
+ $cm->cache->myratings[$pr->postid] = $pr->rating;
+ }
+ }
+ unset($postratings);
+ }
}
}