array(
'groupingids' => new external_multiple_structure(new external_value(PARAM_INT, 'grouping ID')
, 'List of grouping id. A grouping id is an integer.'),
+ 'returngroups' => new external_value(PARAM_BOOL, 'return associated groups', VALUE_DEFAULT, 0)
)
);
}
* Get groupings definition specified by ids
*
* @param array $groupingids arrays of grouping ids
+ * @param boolean $returngroups return the associated groups if true. The default is false.
* @return array of grouping objects (id, courseid, name)
* @since Moodle 2.3
*/
- public static function get_groupings($groupingids) {
- global $CFG;
+ public static function get_groupings($groupingids, $returngroups = false) {
+ global $CFG, $DB;
require_once("$CFG->dirroot/group/lib.php");
require_once("$CFG->libdir/filelib.php");
- $params = self::validate_parameters(self::get_groupings_parameters(), array('groupingids'=>$groupingids));
+ $params = self::validate_parameters(self::get_groupings_parameters(),
+ array('groupingids' => $groupingids,
+ 'returngroups' => $returngroups));
$groupings = array();
foreach ($params['groupingids'] as $groupingid) {
external_format_text($grouping->description, $grouping->descriptionformat,
$context->id, 'grouping', 'description', $grouping->id);
- $groupings[] = (array)$grouping;
+ $groupingarray = (array)$grouping;
+
+ if ($params['returngroups']) {
+ $grouprecords = $DB->get_records_sql("SELECT * FROM {groups} g INNER JOIN {groupings_groups} gg ".
+ "ON g.id = gg.groupid WHERE gg.groupingid = ? ".
+ "ORDER BY groupid", array($groupingid));
+ if ($grouprecords) {
+ $groups = array();
+ foreach ($grouprecords as $grouprecord) {
+ list($grouprecord->description, $grouprecord->descriptionformat) =
+ external_format_text($grouprecord->description, $grouprecord->descriptionformat,
+ $context->id, 'group', 'description', $grouprecord->groupid);
+ $groups[] = array('id' => $grouprecord->groupid,
+ 'name' => $grouprecord->name,
+ 'description' => $grouprecord->description,
+ 'descriptionformat' => $grouprecord->descriptionformat,
+ 'enrolmentkey' => $grouprecord->enrolmentkey,
+ 'courseid' => $grouprecord->courseid
+ );
+ }
+ $groupingarray['groups'] = $groups;
+ }
+ }
+ $groupings[] = $groupingarray;
}
return $groupings;
'courseid' => new external_value(PARAM_INT, 'id of course'),
'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
'description' => new external_value(PARAM_RAW, 'grouping description text'),
- 'descriptionformat' => new external_format_value('description')
+ 'descriptionformat' => new external_format_value('description'),
+ 'groups' => new external_multiple_structure(
+ new external_single_structure(
+ array(
+ 'id' => new external_value(PARAM_INT, 'group record id'),
+ 'courseid' => new external_value(PARAM_INT, 'id of course'),
+ 'name' => new external_value(PARAM_TEXT, 'multilang compatible name, course unique'),
+ 'description' => new external_value(PARAM_RAW, 'group description text'),
+ 'descriptionformat' => new external_format_value('description'),
+ 'enrolmentkey' => new external_value(PARAM_RAW, 'group enrol secret phrase')
+ )
+ ),
+ 'optional groups', VALUE_OPTIONAL)
)
)
);
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
require_once($CFG->dirroot . '/group/externallib.php');
+require_once($CFG->dirroot . '/group/lib.php');
class core_group_external_testcase extends externallib_advanced_testcase {
$this->setExpectedException('required_capability_exception');
$froups = core_group_external::delete_groups(array($group3->id));
}
+
+ /**
+ * Test get_groupings
+ */
+ public function test_get_groupings() {
+ global $DB;
+
+ $this->resetAfterTest(true);
+
+ $course = self::getDataGenerator()->create_course();
+
+ $groupingdata = array();
+ $groupingdata['courseid'] = $course->id;
+ $groupingdata['name'] = 'Grouping Test';
+ $groupingdata['description'] = 'Grouping Test description';
+ $groupingdata['descriptionformat'] = FORMAT_MOODLE;
+
+ $grouping = self::getDataGenerator()->create_grouping($groupingdata);
+
+ // Set the required capabilities by the external function.
+ $context = context_course::instance($course->id);
+ $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id);
+ $this->assignUserCapability('moodle/course:view', $context->id, $roleid);
+
+ // Call the external function without specifying the optional parameter.
+ $groupings = core_group_external::get_groupings(array($grouping->id));
+ // We need to execute the return values cleaning process to simulate the web service server.
+ $groupings = external_api::clean_returnvalue(core_group_external::get_groupings_returns(), $groupings);
+
+ $this->assertEquals(1, count($groupings));
+
+ $group1data = array();
+ $group1data['courseid'] = $course->id;
+ $group1data['name'] = 'Group Test 1';
+ $group1data['description'] = 'Group Test 1 description';
+ $group1data['descriptionformat'] = FORMAT_MOODLE;
+ $group2data = array();
+ $group2data['courseid'] = $course->id;
+ $group2data['name'] = 'Group Test 2';
+ $group2data['description'] = 'Group Test 2 description';
+ $group2data['descriptionformat'] = FORMAT_MOODLE;
+
+ $group1 = self::getDataGenerator()->create_group($group1data);
+ $group2 = self::getDataGenerator()->create_group($group2data);
+
+ groups_assign_grouping($grouping->id, $group1->id);
+ groups_assign_grouping($grouping->id, $group2->id);
+
+ // Call the external function specifying that groups are returned.
+ $groupings = core_group_external::get_groupings(array($grouping->id), true);
+ // We need to execute the return values cleaning process to simulate the web service server.
+ $groupings = external_api::clean_returnvalue(core_group_external::get_groupings_returns(), $groupings);
+ $this->assertEquals(1, count($groupings));
+ $this->assertEquals(2, count($groupings[0]['groups']));
+ foreach ($groupings[0]['groups'] as $group) {
+ $dbgroup = $DB->get_record('groups', array('id' => $group['id']), '*', MUST_EXIST);
+ $dbgroupinggroups = $DB->get_record('groupings_groups',
+ array('groupingid' => $groupings[0]['id'],
+ 'groupid' => $group['id']),
+ '*', MUST_EXIST);
+ switch ($dbgroup->name) {
+ case $group1->name:
+ $groupdescription = $group1->description;
+ $groupcourseid = $group1->courseid;
+ break;
+ case $group2->name:
+ $groupdescription = $group2->description;
+ $groupcourseid = $group2->courseid;
+ break;
+ default:
+ throw new moodle_exception('unknowgroupname');
+ break;
+ }
+ $this->assertEquals($dbgroup->description, $groupdescription);
+ $this->assertEquals($dbgroup->courseid, $groupcourseid);
+ }
+ }
}