From 12f6d0161078ed92e69c3ecf2ac6cd384a0e7067 Mon Sep 17 00:00:00 2001 From: stronk7 Date: Sat, 17 Jan 2009 19:14:37 +0000 Subject: [PATCH] MDL-17364 forum ajax rating working --- mod/forum/discuss.php | 4 + mod/forum/lib.php | 30 +++++-- mod/forum/rate.php | 1 + mod/forum/rate_ajax.js | 168 ++++++++++++++++++++++++++++++++++++++++ mod/forum/rate_ajax.php | 160 ++++++++++++++++++++++++++++++++++++++ mod/forum/settings.php | 3 + 6 files changed, 358 insertions(+), 8 deletions(-) create mode 100644 mod/forum/rate_ajax.js create mode 100644 mod/forum/rate_ajax.php diff --git a/mod/forum/discuss.php b/mod/forum/discuss.php index 745bc60608..46ef0ec7f6 100644 --- a/mod/forum/discuss.php +++ b/mod/forum/discuss.php @@ -30,6 +30,10 @@ require_course_login($course, true, $cm); +/// Add ajax-related libs + require_js(array('yui_yahoo', 'yui_event', 'yui_dom', 'yui_connection', 'yui_json')); + require_js('mod/forum/rate_ajax.js'); + // move this down fix for MDL-6926 require_once('lib.php'); diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 955638e4e7..c8c229b936 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -3257,7 +3257,9 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa } if ($canviewallratings and !$mypost) { - forum_print_ratings($post->id, $ratings->scale, $forum->assessed, $canviewallratings, $allratings); + echo '' . + forum_print_ratings($post->id, $ratings->scale, $forum->assessed, $canviewallratings, $allratings, true) . + ''; if (!empty($ratings->allow)) { echo ' '; forum_print_rating_menu($post->id, $USER->id, $ratings->scale, $myrating); @@ -3265,7 +3267,9 @@ function forum_print_post($post, $discussion, $forum, &$cm, $course, $ownpost=fa } } else if ($mypost) { - forum_print_ratings($post->id, $ratings->scale, $forum->assessed, true, $allratings); + echo '' . + forum_print_ratings($post->id, $ratings->scale, $forum->assessed, true, $allratings, true) . + ''; } else if (!empty($ratings->allow) ) { forum_print_rating_menu($post->id, $USER->id, $ratings->scale, $myrating); @@ -3489,7 +3493,7 @@ function forum_shorten_post($message) { * Forumid prevents the double lookup of the forumid in discussion to determine the aggregate type * Scale is an array of ratings */ -function forum_print_ratings($postid, $scale, $aggregatetype, $link=true, $ratings=null) { +function forum_print_ratings($postid, $scale, $aggregatetype, $link=true, $ratings=null, $return=false) { $strratings = ''; @@ -3522,11 +3526,18 @@ function forum_print_ratings($postid, $scale, $aggregatetype, $link=true, $ratin $strratings = get_string("ratings", "forum"); } - echo "$strratings: "; + $strratings .= ': '; + if ($link) { - link_to_popup_window ("/mod/forum/report.php?id=$postid", "ratings", $agg, 400, 600); + $strratings .= link_to_popup_window ("/mod/forum/report.php?id=$postid", "ratings", $agg, 400, 600, null, null, true); } else { - echo "$agg "; + $strratings .= "$agg "; + } + + if ($return) { + return $strratings; + } else { + echo $strratings; } } } @@ -3770,7 +3781,7 @@ function forum_print_rating_menu($postid, $userid, $scale, $myrating=NULL) { $strrate = get_string("rate", "forum"); } $scale = array(FORUM_UNSET_POST_RATING => $strrate.'...') + $scale; - choose_from_menu($scale, $postid, $myrating, ''); + choose_from_menu($scale, $postid, $myrating, '', '', '0', false, false, 0, '', false, false, 'forumpostratingmenu'); } /** @@ -5318,7 +5329,10 @@ function forum_print_discussion($course, $cm, $forum, $discussion, $post, $mode, if ($ratingsformused) { if ($ratingsmenuused) { echo '
'; - echo ''; + echo ''; + if (ajaxenabled() && !empty($CFG->forum_ajaxrating)) { /// AJAX enabled, standard submission form + print_js_call('init_rate_ajax'); + } if ($forum->scale < 0) { if ($scale = $DB->get_record("scale", array("id" => abs($forum->scale)))) { print_scale_menu_helpbutton($course->id, $scale ); diff --git a/mod/forum/rate.php b/mod/forum/rate.php index c0e6e6582b..1879f4d34b 100644 --- a/mod/forum/rate.php +++ b/mod/forum/rate.php @@ -2,6 +2,7 @@ // Collect ratings, store them, then return to where we came from +/// TODO: Centralise duplicate code in rate.php and rate_ajax.php require_once('../../config.php'); require_once('lib.php'); diff --git a/mod/forum/rate_ajax.js b/mod/forum/rate_ajax.js new file mode 100644 index 0000000000..7f4fb3d75d --- /dev/null +++ b/mod/forum/rate_ajax.js @@ -0,0 +1,168 @@ +// $Id$ + +/////////////////////////////////////////////////////////////////////////// +// // +// NOTICE OF COPYRIGHT // +// // +// Moodle - Modular Object-Oriented Dynamic Learning Environment // +// http://moodle.org // +// // +// Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com // +// (C) 2001-3001 Eloy Lafuente (stronk7) http://contiento.com // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation; either version 2 of the License, or // +// (at your option) any later version. // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details: // +// // +// http://www.gnu.org/copyleft/gpl.html // +// // +/////////////////////////////////////////////////////////////////////////// + +/// Javascript used to handle AJAX forum ratings + +/** + * This function initializes all the stuff needed to have forum ratings + * working under AJAX. Basically it adds one onload listener that triggers + * the add_menu_listeners() function to add menu listeners + */ +function init_rate_ajax () { + YAHOO.util.Event.onDOMReady(add_menu_listeners); +} + +/** + * This function adds event listeners to any rating + * menu found in he page (class = forumpostratingmenu) + * and prevents manual submission + */ +function add_menu_listeners(e) { + + /** hide the submit button */ + var submitbutton = YAHOO.util.Dom.get('forumpostratingsubmit'); + submitbutton.style.display = 'none'; + + /** prevent form submission **/ + var form = YAHOO.util.Dom.get('form'); + YAHOO.util.Event.addListener(form, 'submit', prevent_form_submission); + + /** add listeners to all rating menus */ + var menus = YAHOO.util.Dom.getElementsByClassName('forumpostratingmenu', 'select'); + for (var i=0; idirroot . '/mod/forum/lib.php'); + +/// In developer debug mode, when there is a debug=1 in the URL send as plain text +/// for easier debugging. + if (debugging('', DEBUG_DEVELOPER) && optional_param('debug', false, PARAM_BOOL)) { + header('Content-type: text/plain; charset=UTF-8'); + $debugmode = true; + } else { + header('Content-type: application/json'); + $debugmode = false; + } + +/// Here we maintain response contents + $response = array('status'=> 'Error', 'message'=>'kk'); + +/// Check access. + if (!isloggedin()) { + print_error('mustbeloggedin'); + } + if (isguestuser()) { + print_error('noguestrate', 'forum'); + } + if (!confirm_sesskey()) { + print_error('invalidsesskey'); + } + + +/// Check required params + $postid = required_param('postid', PARAM_INT); // The postid to rate + $rate = required_param('rate', PARAM_INT); // The rate to apply + +/// Check postid is valid + if (!$post = $DB->get_record_sql('SELECT p.*, + d.forum AS forumid + FROM {forum_posts} p + JOIN {forum_discussions} d ON p.discussion = d.id + WHERE p.id = ?', array($postid))) { + print_error('invalidpostid', 'forum', '', $postid);; + } + +/// Check forum + if (!$forum = $DB->get_record('forum', array('id' => $post->forumid))) { + print_error('invalidforumid', 'forum'); + } + +/// Check course + if (!$course = $DB->get_record('course', array('id' => $forum->course))) { + print_error('invalidcourseid'); + } + +/// Check coursemodule + if (!$cm = get_coursemodule_from_instance('forum', $forum->id)) { + print_error('invalidcoursemodule'); + } else { + $forum->cmidnumber = $cm->id; //MDL-12961 + } + +/// Check forum can be rated + if (!$forum->assessed) { + print_error('norate', 'forum'); + } + +/// Check user can rate + $context = get_context_instance(CONTEXT_MODULE, $cm->id); + require_capability('mod/forum:rate', $context); + +/// Check timed ratings + if ($forum->assesstimestart and $forum->assesstimefinish) { + if ($post->created < $forum->assesstimestart or $post->created > $forum->assesstimefinish) { + // we can not rate this, ignore it - this should not happen anyway unless teacher changes setting + print_error('norate', 'forum'); + } + } + +/// Calculate scale values + $scale_values = make_grades_menu($forum->scale); + +/// Check rate is valid for for that forum scale values + if (!array_key_exists($rate, $scale_values) && $rate != FORUM_UNSET_POST_RATING) { + print_error('invalidrate', 'forum'); + } + +/// Everything ready, process rate + +/// Deleting rate + if ($rate == FORUM_UNSET_POST_RATING) { + $DB->delete_records('forum_ratings', array('post' => $postid, 'userid' => $USER->id)); + +/// Updating rate + } else if ($oldrating = $DB->get_record('forum_ratings', array('userid' => $USER->id, 'post' => $post->id))) { + if ($rate != $oldrating->rating) { + $oldrating->rating = $rate; + $oldrating->time = time(); + if (!$DB->update_record('forum_ratings', $oldrating)) { + print_error('cannotupdaterate', 'error', '', (object)array('id'=>$post->id, 'rating'=>$rate)); + } + } + +/// Inserting rate + } else { + $newrating = new object(); + $newrating->userid = $USER->id; + $newrating->time = time(); + $newrating->post = $post->id; + $newrating->rating = $rate; + + if (! $DB->insert_record('forum_ratings', $newrating)) { + print_error('cannotinsertrate', 'error', '', (object)array('id'=>$postid, 'rating'=>$rate)); + } + } + +/// Update grades + forum_update_grades($forum, $post->userid); + +/// Check user can see any rate + $canviewanyrating = has_capability('mod/forum:viewanyrating', $context); + +/// Decide if rates info is displayed + $rateinfo = ''; + if ($canviewanyrating) { + $rateinfo = forum_print_ratings($postid, $scale_values, $forum->assessed, true, NULL, true); + } + +/// Calculate response + $response['status'] = 'Ok'; + $response['message'] = $rateinfo; + echo json_encode($response); + +?> diff --git a/mod/forum/settings.php b/mod/forum/settings.php index 6c5b1b2561..c70a885b7d 100644 --- a/mod/forum/settings.php +++ b/mod/forum/settings.php @@ -65,4 +65,7 @@ $settings->add(new admin_setting_configcheckbox('forum_enabletimedposts', get_st $settings->add(new admin_setting_configcheckbox('forum_logblocked', get_string('logblocked', 'forum'), get_string('configlogblocked', 'forum'), 1)); +$settings->add(new admin_setting_configcheckbox('forum_ajaxrating', get_string('ajaxrating', 'forum'), + get_string('configajaxrating', 'forum'), 0)); + ?> -- 2.39.5