3namespace ceLTIc\LTI\ApiHook\moodle;
23 private static $DEFAULT_PER_PAGE = 50;
33 private $token =
null;
38 private $courseId =
null;
43 private $sourceObject =
null;
52 $platform = $this->sourceObject->getPlatform();
54 return !empty($platform->getSetting(
'moodle.url')) && !empty($platform->getSetting(
'moodle.token'));
64 private function get($withGroups)
66 $platform = $this->sourceObject->getPlatform();
67 $this->url = $platform->getSetting(
'moodle.url');
68 $this->token = $platform->getSetting(
'moodle.token');
69 $perPage = $platform->getSetting(
'moodle.per_page',
'');
70 if (!is_numeric($perPage)) {
71 $perPage = self::$DEFAULT_PER_PAGE;
73 $perPage = intval($perPage);
75 $prefix = $platform->getSetting(
'moodle.grouping_prefix');
76 if ($this->url && $this->token && $this->courseId) {
78 $this->setGroupings($prefix);
80 $users = $this->getUsers($perPage, $withGroups);
81 if ($users && $withGroups) {
82 $this->setGroups($users);
98 private function setGroupings($prefix)
101 $this->sourceObject->groupSets = array();
102 $this->sourceObject->groups = array();
104 'courseid' => $this->courseId
106 $courseGroupings = $this->callMoodleApi(
'core_group_get_course_groupings', $params);
107 if (is_array($courseGroupings)) {
108 $groupingIds = array_map(
function($grouping) {
109 return $grouping->id;
110 }, $courseGroupings);
111 if (empty($groupingIds)) {
115 'groupingids' => $groupingIds,
118 $groupings = $this->callMoodleApi(
'core_group_get_groupings', $params);
119 if (is_array($groupings)) {
121 foreach ($groupings as $grouping) {
122 if (!empty($grouping->groups) && (empty($prefix) || (strpos($grouping->name, $prefix) === 0))) {
123 $groupingId = strval($grouping->id);
124 $this->sourceObject->groupSets[$groupingId] = array(
'title' => $grouping->name,
'groups' => array(),
125 'num_members' => 0,
'num_staff' => 0,
'num_learners' => 0);
126 foreach ($grouping->groups as $group) {
127 $groupId = strval($group->id);
128 $this->sourceObject->groupSets[$groupingId][
'groups'][] = $groupId;
129 if (!isset($this->sourceObject->groups[$groupId])) {
130 $this->sourceObject->groups[$groupId] = array(
'title' => $group->name,
'set' => $groupingId);
131 } elseif (!is_array($this->sourceObject->groups[$groupId][
'set'])) {
132 $this->sourceObject->groups[$groupId][
'set'] = array($this->sourceObject->groups[$groupId][
'set'], $groupingId);
134 $this->sourceObject->groups[$groupId][
'set'][] = $groupingId;
154 private function getUsers($perPage, $withGroups)
159 'courseid' => $this->courseId,
162 'name' =>
'onlyactive',
166 'name' =>
'userfields',
170 'name' =>
'withcapability',
171 'value' =>
'mod/lti:manage'
176 $enrolments = $this->callMoodleApi(
'core_enrol_get_enrolled_users', $params);
177 if (is_array($enrolments)) {
178 foreach ($enrolments as $enrolment) {
179 $teachers[] = $enrolment->id;
182 $userFields =
'id, username, idnumber, firstname, lastname, fullname, email, roles';
184 $userFields .=
', groups';
187 'courseid' => $this->courseId,
190 'name' =>
'onlyactive',
194 'name' =>
'userfields',
195 'value' => $userFields
200 array_push($params[
'options'],
202 'name' =>
'limitnumber',
210 array_push($params[
'options'],
212 'name' =>
'limitfrom',
217 $enrolments = $this->callMoodleApi(
'core_enrol_get_enrolled_users', $params);
218 if (is_array($enrolments)) {
219 foreach ($enrolments as $enrolment) {
220 $userId = strval($enrolment->id);
221 if (is_a($this->sourceObject,
'ceLTIc\LTI\ResourceLink')) {
224 $user =
new UserResult();
225 $user->ltiUserId = $userId;
227 $user->setEmail($enrolment->email, $this->sourceObject->getPlatform()->defaultEmail);
228 $user->setNames($enrolment->firstname, $enrolment->lastname, $enrolment->fullname);
229 $user->username = $enrolment->username;
230 if (!empty($enrolment->idnumber)) {
231 $user->sourcedId = $enrolment->idnumber;
233 $user->sourcedId =
null;
235 if (!empty($enrolment->groups)) {
236 foreach ($enrolment->groups as $group) {
237 $groupId = strval($group->id);
238 if (array_key_exists($groupId, $this->sourceObject->groups)) {
239 $user->groups[] = $groupId;
244 if (in_array($enrolment->id, $teachers)) {
245 $user->roles[] =
'urn:lti:role:ims/lis/Instructor';
247 $user->roles[] =
'urn:lti:role:ims/lis/Learner';
249 $users[$userId] = $user;
252 $n += count($enrolments);
253 array_pop($params[
'options']);
259 }
while (is_array($enrolments) && !empty($enrolments));
269 private function setGroups($users)
271 foreach ($users as $user) {
273 foreach ($user->groups as $group) {
274 if (array_key_exists($group, $this->sourceObject->groups) && !empty($this->sourceObject->groups[$group][
'set'])) {
275 $setIds = $this->sourceObject->groups[$group][
'set'];
276 if (!is_array($setIds)) {
277 $setIds = array($setIds);
279 foreach ($setIds as $setId) {
281 if (in_array($setId, $sets)) {
283 foreach ($this->sourceObject->groupSets[$setId][
'groups'] as $groupId) {
284 if (!is_array($this->sourceObject->groups[$groupId][
'set']) && ($this->sourceObject->groups[$groupId][
'set'] === $setId)) {
285 unset($this->sourceObject->groups[$groupId][
'set']);
286 }
else if (is_array($this->sourceObject->groups[$groupId][
'set']) && in_array($setId,
287 $this->sourceObject->groups[$groupId][
'set'])) {
288 $pos = array_search($setId, $this->sourceObject->groups[$groupId][
'set']);
289 unset($this->sourceObject->groups[$groupId][
'set'][$pos]);
290 if (empty($this->sourceObject->groups[$groupId][
'set'])) {
291 unset($this->sourceObject->groups[$groupId][
'set']);
295 } elseif (array_key_exists($group, $this->sourceObject->groups)) {
296 $this->sourceObject->groupSets[$setId][
'num_members']++;
297 if ($user->isStaff()) {
298 $this->sourceObject->groupSets[$setId][
'num_staff']++;
300 if ($user->isLearner()) {
301 $this->sourceObject->groupSets[$setId][
'num_learners']++;
319 private function callMoodleApi($method, $params)
322 $serviceUrl = $this->url .
'/webservice/rest/server.php';
323 $params = array_merge(array(
324 'wstoken' => $this->token,
325 'wsfunction' => $method,
326 'moodlewsrestformat' =>
'json'
328 $http =
new HttpMessage($serviceUrl,
'POST', $params);
332 $http->ok = !is_null($json) && is_array($json);
334 Util::logError(
"Moodle web service returned an error: {$http->response}");
Class to handle Moodle web service requests.
isConfigured()
Check if the API hook has been configured.
Class to represent an HTTP message request.
Class to represent a platform user association with a resource link.
static fromResourceLink($resourceLink, $ltiUserId)
Class constructor from resource link.
Class to implement utility methods.
static logError($message, $showSource=true)
Log an error message.
static jsonDecode($str, $associative=false)
Decode a JSON string.