See Release Notes
Long Term Support Release
<?php // This file is part of Moodle - http://moodle.org/ // // Moodle 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 3 of the License, or // (at your option) any later version. // // Moodle 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. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Rating external functions utility class. * * @package core_rating * @copyright 2017 Juan Leyva * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace core_rating\external; defined('MOODLE_INTERNAL') || die(); require_once($CFG->dirroot . '/rating/lib.php');< require_once($CFG->libdir . '/externallib.php');< use external_multiple_structure; < use external_single_structure; < use external_value;> use core_external\external_multiple_structure; > use core_external\external_single_structure; > use core_external\external_value;use rating_manager; use stdClass; /** * Rating external functions utility class. * * @package core_rating * @copyright 2017 Juan Leyva * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since Moodle 3.4 */ class util { /** * Returns the ratings definition for external functions. */ public static function external_ratings_structure() { return new external_single_structure ( [ 'contextid' => new external_value(PARAM_INT, 'Context id.'), 'component' => new external_value(PARAM_COMPONENT, 'Context name.'), 'ratingarea' => new external_value(PARAM_AREA, 'Rating area name.'), 'canviewall' => new external_value(PARAM_BOOL, 'Whether the user can view all the individual ratings.', VALUE_OPTIONAL), 'canviewany' => new external_value(PARAM_BOOL, 'Whether the user can view aggregate of ratings of others.', VALUE_OPTIONAL), 'scales' => new external_multiple_structure( new external_single_structure ( [ 'id' => new external_value(PARAM_INT, 'Scale id.'), 'courseid' => new external_value(PARAM_INT, 'Course id.', VALUE_OPTIONAL), 'name' => new external_value(PARAM_TEXT, 'Scale name (when a real scale is used).', VALUE_OPTIONAL), 'max' => new external_value(PARAM_INT, 'Max value for the scale.'), 'isnumeric' => new external_value(PARAM_BOOL, 'Whether is a numeric scale.'), 'items' => new external_multiple_structure( new external_single_structure ( [ 'value' => new external_value(PARAM_INT, 'Scale value/option id.'), 'name' => new external_value(PARAM_NOTAGS, 'Scale name.'), ] ), 'Scale items. Only returned for not numerical scales.', VALUE_OPTIONAL ) ], 'Scale information' ), 'Different scales used information', VALUE_OPTIONAL ), 'ratings' => new external_multiple_structure( new external_single_structure ( [ 'itemid' => new external_value(PARAM_INT, 'Item id.'), 'scaleid' => new external_value(PARAM_INT, 'Scale id.', VALUE_OPTIONAL), 'userid' => new external_value(PARAM_INT, 'User who rated id.', VALUE_OPTIONAL), 'aggregate' => new external_value(PARAM_FLOAT, 'Aggregated ratings grade.', VALUE_OPTIONAL), 'aggregatestr' => new external_value(PARAM_NOTAGS, 'Aggregated ratings as string.', VALUE_OPTIONAL), 'aggregatelabel' => new external_value(PARAM_NOTAGS, 'The aggregation label.', VALUE_OPTIONAL), 'count' => new external_value(PARAM_INT, 'Ratings count (used when aggregating).', VALUE_OPTIONAL), 'rating' => new external_value(PARAM_INT, 'The rating the user gave.', VALUE_OPTIONAL), 'canrate' => new external_value(PARAM_BOOL, 'Whether the user can rate the item.', VALUE_OPTIONAL), 'canviewaggregate' => new external_value(PARAM_BOOL, 'Whether the user can view the aggregated grade.', VALUE_OPTIONAL), ] ), 'The ratings', VALUE_OPTIONAL ), ], 'Rating information', VALUE_OPTIONAL ); } /** * Returns rating information inside a data structure like the one defined by external_ratings_structure. * * @param stdClass $mod course module object * @param stdClass $context context object * @param str $component component name * @param str $ratingarea rating area * @param array $items items to add ratings * @return array ratings ready to be returned by external functions. */ public static function get_rating_info($mod, $context, $component, $ratingarea, $items) { global $USER; $ratinginfo = [ 'contextid' => $context->id, 'component' => $component, 'ratingarea' => $ratingarea, 'canviewall' => null, 'canviewany' => null, 'scales' => [], 'ratings' => [], ]; if ($mod->assessed != RATING_AGGREGATE_NONE) { $ratingoptions = new stdClass; $ratingoptions->context = $context; $ratingoptions->component = $component; $ratingoptions->ratingarea = $ratingarea; $ratingoptions->items = $items; $ratingoptions->aggregate = $mod->assessed; $ratingoptions->scaleid = $mod->scale; $ratingoptions->userid = $USER->id; $ratingoptions->assesstimestart = $mod->assesstimestart; $ratingoptions->assesstimefinish = $mod->assesstimefinish; $rm = new rating_manager(); $allitems = $rm->get_ratings($ratingoptions); foreach ($allitems as $item) { if (empty($item->rating)) { continue; } $rating = [ 'itemid' => $item->rating->itemid, 'scaleid' => $item->rating->scaleid, 'userid' => $item->rating->userid, 'rating' => $item->rating->rating, 'canrate' => $item->rating->user_can_rate(), 'canviewaggregate' => $item->rating->user_can_view_aggregate(), ]; // Fill the capabilities fields the first time (the rest are the same values because they are not item dependent). if ($ratinginfo['canviewall'] === null) { $ratinginfo['canviewall'] = $item->rating->settings->permissions->viewall && $item->rating->settings->pluginpermissions->viewall; $ratinginfo['canviewany'] = $item->rating->settings->permissions->viewany && $item->rating->settings->pluginpermissions->viewany; } // Return only the information the user can see. if ($rating['canviewaggregate']) { $rating['aggregate'] = $item->rating->aggregate; $rating['aggregatestr'] = $item->rating->get_aggregate_string(); $rating['aggregatelabel'] = $rm->get_aggregate_label($item->rating->settings->aggregationmethod); $rating['count'] = $item->rating->count; } // If the user can rate, return the scale information only one time. if ($rating['canrate'] && !empty($item->rating->settings->scale->id) && !isset($ratinginfo['scales'][$item->rating->settings->scale->id])) { $scale = $item->rating->settings->scale; // Return only non numeric scales (to avoid return lots of data just including items from 0 to $scale->max). if (!$scale->isnumeric) { $scaleitems = []; foreach ($scale->scaleitems as $value => $name) { $scaleitems[] = [ 'name' => $name, 'value' => $value, ]; } $scale->items = $scaleitems; } $ratinginfo['scales'][$item->rating->settings->scale->id] = (array) $scale; } $ratinginfo['ratings'][] = $rating; } } return $ratinginfo; } }