MDL-55786 rating: Move common code to new function

This commit is contained in:
Juan Leyva 2016-09-08 13:52:19 +01:00
parent ddd8dc0d1b
commit a497458c89
2 changed files with 127 additions and 103 deletions

View file

@ -1051,6 +1051,129 @@ class rating_manager {
return $aggregatelabel; 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. } // End rating_manager class definition.
/** /**

View file

@ -63,110 +63,11 @@ if (!confirm_sesskey() || !has_capability('moodle/rating:rate', $context)) {
} }
$rm = new rating_manager(); $rm = new rating_manager();
$result = $rm->add_rating($cm, $context, $component, $ratingarea, $itemid, $scaleid, $userrating, $rateduserid, $aggregationmethod);
// Check the module rating permissions. // Return translated error.
// Doing this check here rather than within rating_manager::get_ratings() so we can return a json error response. if (!empty($result->error)) {
$pluginpermissionsarray = $rm->get_plugin_permissions_array($context->id, $component, $ratingarea); $result->error = get_string($result->error, 'rating');
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;
} }
echo json_encode($result); echo json_encode($result);