diff --git a/rating/lib.php b/rating/lib.php index 7b3a25741ab..b2f334776a2 100644 --- a/rating/lib.php +++ b/rating/lib.php @@ -1051,6 +1051,129 @@ class rating_manager { return $aggregatelabel; } + /** + * Adds a new rating + * + * @param stdClass $cm course module object + * @param stdClass $context context object + * @param string $component component name + * @param string $ratingarea rating area + * @param int $itemid the item id + * @param int $scaleid the scale id + * @param int $userrating the user rating + * @param int $rateduserid the rated user id + * @param int $aggregationmethod the aggregation method + * @since Moodle 3.2 + */ + public function add_rating($cm, $context, $component, $ratingarea, $itemid, $scaleid, $userrating, $rateduserid, + $aggregationmethod) { + global $CFG, $DB, $USER; + + $result = new stdClass; + // Check the module rating permissions. + // Doing this check here rather than within rating_manager::get_ratings() so we can return a error response. + $pluginpermissionsarray = $this->get_plugin_permissions_array($context->id, $component, $ratingarea); + + if (!$pluginpermissionsarray['rate']) { + $result->error = 'ratepermissiondenied'; + return $result; + } else { + $params = array( + 'context' => $context, + 'component' => $component, + 'ratingarea' => $ratingarea, + 'itemid' => $itemid, + 'scaleid' => $scaleid, + 'rating' => $userrating, + 'rateduserid' => $rateduserid, + 'aggregation' => $aggregationmethod + ); + if (!$this->check_rating_is_valid($params)) { + $result->error = 'ratinginvalid'; + return $result; + } + } + + // Rating options used to update the rating then retrieve the aggregate. + $ratingoptions = new stdClass; + $ratingoptions->context = $context; + $ratingoptions->ratingarea = $ratingarea; + $ratingoptions->component = $component; + $ratingoptions->itemid = $itemid; + $ratingoptions->scaleid = $scaleid; + $ratingoptions->userid = $USER->id; + + if ($userrating != RATING_UNSET_RATING) { + $rating = new rating($ratingoptions); + $rating->update_rating($userrating); + } else { // Delete the rating if the user set to "Rate..." + $options = new stdClass; + $options->contextid = $context->id; + $options->component = $component; + $options->ratingarea = $ratingarea; + $options->userid = $USER->id; + $options->itemid = $itemid; + + $this->delete_ratings($options); + } + + // Future possible enhancement: add a setting to turn grade updating off for those who don't want them in gradebook. + // Note that this would need to be done in both rate.php and rate_ajax.php. + if ($context->contextlevel == CONTEXT_MODULE) { + // Tell the module that its grades have changed. + $modinstance = $DB->get_record($cm->modname, array('id' => $cm->instance)); + if ($modinstance) { + $modinstance->cmidnumber = $cm->id; // MDL-12961. + $functionname = $cm->modname.'_update_grades'; + require_once($CFG->dirroot."/mod/{$cm->modname}/lib.php"); + if (function_exists($functionname)) { + $functionname($modinstance, $rateduserid); + } + } + } + + // Object to return to client as JSON. + $result->success = true; + + // Need to retrieve the updated item to get its new aggregate value. + $item = new stdClass; + $item->id = $itemid; + + // Most of $ratingoptions variables were previously set. + $ratingoptions->items = array($item); + $ratingoptions->aggregate = $aggregationmethod; + + $items = $this->get_ratings($ratingoptions); + $firstrating = $items[0]->rating; + + // See if the user has permission to see the rating aggregate. + if ($firstrating->user_can_view_aggregate()) { + + // For custom scales return text not the value. + // This scales weirdness will go away when scales are refactored. + $scalearray = null; + $aggregatetoreturn = round($firstrating->aggregate, 1); + + // Output a dash if aggregation method == COUNT as the count is output next to the aggregate anyway. + if ($firstrating->settings->aggregationmethod == RATING_AGGREGATE_COUNT or $firstrating->count == 0) { + $aggregatetoreturn = ' - '; + } else if ($firstrating->settings->scale->id < 0) { // If its non-numeric scale. + // Dont use the scale item if the aggregation method is sum as adding items from a custom scale makes no sense. + if ($firstrating->settings->aggregationmethod != RATING_AGGREGATE_SUM) { + $scalerecord = $DB->get_record('scale', array('id' => -$firstrating->settings->scale->id)); + if ($scalerecord) { + $scalearray = explode(',', $scalerecord->scale); + $aggregatetoreturn = $scalearray[$aggregatetoreturn - 1]; + } + } + } + + $result->aggregate = $aggregatetoreturn; + $result->count = $firstrating->count; + $result->itemid = $itemid; + } + return $result; + } } // End rating_manager class definition. /** diff --git a/rating/rate_ajax.php b/rating/rate_ajax.php index 993d773f2df..859824270b2 100644 --- a/rating/rate_ajax.php +++ b/rating/rate_ajax.php @@ -63,110 +63,11 @@ if (!confirm_sesskey() || !has_capability('moodle/rating:rate', $context)) { } $rm = new rating_manager(); +$result = $rm->add_rating($cm, $context, $component, $ratingarea, $itemid, $scaleid, $userrating, $rateduserid, $aggregationmethod); -// Check the module rating permissions. -// Doing this check here rather than within rating_manager::get_ratings() so we can return a json error response. -$pluginpermissionsarray = $rm->get_plugin_permissions_array($context->id, $component, $ratingarea); - -if (!$pluginpermissionsarray['rate']) { - $result->error = get_string('ratepermissiondenied', 'rating'); - echo json_encode($result); - die(); -} else { - $params = array( - 'context' => $context, - 'component' => $component, - 'ratingarea' => $ratingarea, - 'itemid' => $itemid, - 'scaleid' => $scaleid, - 'rating' => $userrating, - 'rateduserid' => $rateduserid, - 'aggregation' => $aggregationmethod - ); - if (!$rm->check_rating_is_valid($params)) { - $result->error = get_string('ratinginvalid', 'rating'); - echo json_encode($result); - die(); - } -} - -// Rating options used to update the rating then retrieve the aggregate. -$ratingoptions = new stdClass; -$ratingoptions->context = $context; -$ratingoptions->ratingarea = $ratingarea; -$ratingoptions->component = $component; -$ratingoptions->itemid = $itemid; -$ratingoptions->scaleid = $scaleid; -$ratingoptions->userid = $USER->id; - -if ($userrating != RATING_UNSET_RATING) { - $rating = new rating($ratingoptions); - $rating->update_rating($userrating); -} else { // Delete the rating if the user set to "Rate..." - $options = new stdClass; - $options->contextid = $context->id; - $options->component = $component; - $options->ratingarea = $ratingarea; - $options->userid = $USER->id; - $options->itemid = $itemid; - - $rm->delete_ratings($options); -} - -// Future possible enhancement: add a setting to turn grade updating off for those who don't want them in gradebook. -// Note that this would need to be done in both rate.php and rate_ajax.php. -if ($context->contextlevel == CONTEXT_MODULE) { - // Tell the module that its grades have changed. - $modinstance = $DB->get_record($cm->modname, array('id' => $cm->instance)); - if ($modinstance) { - $modinstance->cmidnumber = $cm->id; // MDL-12961. - $functionname = $cm->modname.'_update_grades'; - require_once($CFG->dirroot."/mod/{$cm->modname}/lib.php"); - if (function_exists($functionname)) { - $functionname($modinstance, $rateduserid); - } - } -} - -// Object to return to client as JSON. -$result->success = true; - -// Need to retrieve the updated item to get its new aggregate value. -$item = new stdClass; -$item->id = $itemid; - -// Most of $ratingoptions variables were previously set. -$ratingoptions->items = array($item); -$ratingoptions->aggregate = $aggregationmethod; - -$items = $rm->get_ratings($ratingoptions); -$firstrating = $items[0]->rating; - -// See if the user has permission to see the rating aggregate. -if ($firstrating->user_can_view_aggregate()) { - - // For custom scales return text not the value. - // This scales weirdness will go away when scales are refactored. - $scalearray = null; - $aggregatetoreturn = round($firstrating->aggregate, 1); - - // Output a dash if aggregation method == COUNT as the count is output next to the aggregate anyway. - if ($firstrating->settings->aggregationmethod == RATING_AGGREGATE_COUNT or $firstrating->count == 0) { - $aggregatetoreturn = ' - '; - } else if ($firstrating->settings->scale->id < 0) { // If its non-numeric scale. - // Dont use the scale item if the aggregation method is sum as adding items from a custom scale makes no sense. - if ($firstrating->settings->aggregationmethod != RATING_AGGREGATE_SUM) { - $scalerecord = $DB->get_record('scale', array('id' => -$firstrating->settings->scale->id)); - if ($scalerecord) { - $scalearray = explode(',', $scalerecord->scale); - $aggregatetoreturn = $scalearray[$aggregatetoreturn - 1]; - } - } - } - - $result->aggregate = $aggregatetoreturn; - $result->count = $firstrating->count; - $result->itemid = $itemid; +// Return translated error. +if (!empty($result->error)) { + $result->error = get_string($result->error, 'rating'); } echo json_encode($result);