32 public static $SCOPE =
'https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly';
44 private $source =
null;
73 public function __construct($source,
$endpoint, $format = self::MEDIA_TYPE_MEMBERSHIPS_V1, $limit =
null, $pagingMode =
false)
75 $platform = $source->getPlatform();
76 parent::__construct($platform,
$endpoint);
78 $this->mediaType = $format;
79 $this->source = $source;
80 $this->limit = $limit;
81 $this->pagingMode = $pagingMode;
92 public function get($role =
null, $limit =
null)
94 return $this->getMembers(
false, $role, $limit);
107 return $this->getMembers(
true, $role, $limit);
119 private function getMembers($withGroups, $role =
null, $limit =
null)
121 $isLink = is_a($this->source,
'ceLTIc\LTI\ResourceLink');
122 $parameters = array();
124 $parameters[
'role'] = $role;
126 if (is_null($limit)) {
127 $limit = $this->limit;
129 if (is_null($limit)) {
132 if (!empty($limit)) {
133 $parameters[
'limit'] = strval($limit);
136 $context = $this->source->getContext();
137 if (!empty($this->source->getId())) {
138 $parameters[
'rlid'] = $this->source->getId();
140 if ($withGroups && ($this->mediaType === self::MEDIA_TYPE_MEMBERSHIPS_NRPS) && !empty($context)) {
141 $context->getGroups();
142 $this->source->groupSets = $context->groupSets;
143 $this->source->groups = $context->groups;
144 $parameters[
'groups'] =
'true';
146 } elseif ($withGroups && ($this->mediaType === self::MEDIA_TYPE_MEMBERSHIPS_NRPS)) {
147 $this->source->getGroups();
148 $parameters[
'groups'] =
'true';
150 $userResults = array();
151 $memberships = array();
154 $http = $this->
send(
'GET', $parameters);
156 if (!empty($http) && $http->ok) {
158 if (isset($http->responseJson->pageOf) && isset($http->responseJson->pageOf->membershipSubject) &&
159 isset($http->responseJson->pageOf->membershipSubject->membership)) {
161 $memberships = array_merge($memberships, $http->responseJson->pageOf->membershipSubject->membership);
162 if (!empty($http->responseJson->nextPage) && !empty($http->responseJson->pageOf->membershipSubject->membership)) {
163 $http->relativeLinks[
'next'] = $http->responseJson->nextPage;
165 } elseif (isset($http->responseJson->members)) {
166 $memberships = array_merge($memberships, $http->responseJson->members);
168 if (!$this->pagingMode && $http->hasRelativeLink(
'next')) {
169 $url = $http->getRelativeLink(
'next');
170 $this->endpoint = $url;
171 $parameters = array();
174 $userResults =
false;
178 if ($userResults !==
false) {
182 foreach ($memberships as $membership) {
184 $member = $membership->member;
186 $userresult = LTI\UserResult::fromResourceLink($this->source, $member->userId);
188 $userresult =
new LTI\UserResult();
189 $userresult->ltiUserId = $member->userId;
193 $firstname = (isset($member->givenName)) ? $member->givenName :
'';
194 $middlename = (isset($member->middleName)) ? $member->middleName :
'';
195 $lastname = (isset($member->familyName)) ? $member->familyName :
'';
196 $fullname = (isset($member->name)) ? $member->name :
'';
197 $userresult->setNames($firstname, $lastname, $fullname);
200 if (isset($member->sourcedId)) {
201 $userresult->sourcedId = $member->sourcedId;
205 if (isset($member->ext_username)) {
206 $userresult->username = $member->ext_username;
207 } elseif (isset($member->ext_user_username)) {
208 $userresult->username = $member->ext_user_username;
209 } elseif (isset($member->custom_username)) {
210 $userresult->username = $member->custom_username;
211 } elseif (isset($member->custom_user_username)) {
212 $userresult->username = $member->custom_user_username;
216 $email = (isset($member->email)) ? $member->email :
'';
217 $userresult->setEmail($email, $this->source->getPlatform()->defaultEmail);
220 if (isset($membership->role)) {
222 $userresult->roles = LTI\Tool::parseRoles($roles, $this->
getPlatform()->ltiVersion);
228 if (isset($membership->message)) {
229 foreach ($membership->message as $message) {
230 if (isset($message->message_type) && (($message->message_type ===
'basic-lti-launch-request') || ($message->message_type) ===
'LtiResourceLinkRequest')) {
231 if (isset($message->lis_result_sourcedid)) {
232 if (empty($userresult->ltiResultSourcedId) || ($userresult->ltiResultSourcedId !== $message->lis_result_sourcedid)) {
233 $userresult->ltiResultSourcedId = $message->lis_result_sourcedid;
236 } elseif ($userresult->isLearner() && empty($userresult->created)) {
237 $userresult->ltiResultSourcedId =
'';
240 if (isset($message->ext)) {
241 if (empty($userresult->username)) {
242 if (!empty($message->ext->username)) {
243 $userresult->username = $message->ext->username;
244 } elseif (!empty($message->ext->user_username)) {
245 $userresult->username = $message->ext->user_username;
249 if (isset($message->custom)) {
250 if (empty($userresult->username)) {
251 if (!empty($message->custom->username)) {
252 $userresult->username = $message->custom->username;
253 } elseif (!empty($message->custom->user_username)) {
254 $userresult->username = $message->custom->user_username;
261 } elseif ($userresult->isLearner() && empty($userresult->created)) {
262 $userresult->ltiResultSourcedId =
'';
265 if (!$doSave && isset($member->resultSourcedId)) {
266 $userresult->setResourceLinkId($this->source->getId());
267 $userresult->ltiResultSourcedId = $member->resultSourcedId;
274 $userResults[] = $userresult;
281 $member = $membership;
283 $userresult = LTI\UserResult::fromResourceLink($this->source, $member->user_id);
285 $userresult =
new LTI\UserResult();
286 $userresult->ltiUserId = $member->user_id;
290 $firstname = (isset($member->given_name)) ? $member->given_name :
'';
291 $middlename = (isset($member->middle_name)) ? $member->middle_name :
'';
292 $lastname = (isset($member->family_name)) ? $member->family_name :
'';
293 $fullname = (isset($member->name)) ? $member->name :
'';
294 $userresult->setNames($firstname, $lastname, $fullname);
297 if (isset($member->lis_person_sourcedid)) {
298 $userresult->sourcedId = $member->lis_person_sourcedid;
302 $email = (isset($member->email)) ? $member->email :
'';
303 $userresult->setEmail($email, $this->source->getPlatform()->defaultEmail);
306 if (isset($member->roles)) {
307 $userresult->roles = LTI\Tool::parseRoles($member->roles, $this->getPlatform()->ltiVersion);
313 if (isset($member->message)) {
314 $messages = $member->message;
315 if (!is_array($messages)) {
316 $messages = array($member->message);
318 foreach ($messages as $message) {
319 if (isset($message->{
'https://purl.imsglobal.org/spec/lti/claim/message_type'}) && (($message->{
'https://purl.imsglobal.org/spec/lti/claim/message_type'} ===
'basic-lti-launch-request') || ($message->{
'https://purl.imsglobal.org/spec/lti/claim/message_type'}) ===
'LtiResourceLinkRequest')) {
320 if (isset($message->{
'https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome'}) &&
321 isset($message->{
'https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome'}->lis_result_sourcedid)) {
322 $userresult->ltiResultSourcedId = $message->{
'https://purl.imsglobal.org/spec/lti-bo/claim/basicoutcome'}->lis_result_sourcedid;
324 } elseif ($userresult->isLearner() && empty($userresult->created)) {
325 $userresult->ltiResultSourcedId =
'';
328 if (isset($message->{
'https://purl.imsglobal.org/spec/lti/claim/ext'})) {
329 if (empty($userresult->username)) {
330 if (!empty($message->{
'https://purl.imsglobal.org/spec/lti/claim/ext'}->username)) {
331 $userresult->username = $message->{
'https://purl.imsglobal.org/spec/lti/claim/ext'}->username;
332 } elseif (!empty($message->{
'https://purl.imsglobal.org/spec/lti/claim/ext'}->user_username)) {
333 $userresult->username = $message->{
'https://purl.imsglobal.org/spec/lti/claim/ext'}->user_username;
337 if (isset($message->{
'https://purl.imsglobal.org/spec/lti/claim/custom'})) {
338 if (empty($userresult->username)) {
339 if (!empty($message->{
'https://purl.imsglobal.org/spec/lti/claim/custom'}->username)) {
340 $userresult->username = $message->{
'https://purl.imsglobal.org/spec/lti/claim/custom'}->username;
341 } elseif (!empty($message->{
'https://purl.imsglobal.org/spec/lti/claim/custom'}->user_username)) {
342 $userresult->username = $message->{
'https://purl.imsglobal.org/spec/lti/claim/custom'}->user_username;
349 } elseif ($userresult->isLearner() && empty($userresult->created)) {
350 $userresult->ltiResultSourcedId =
'';
357 $userResults[] = $userresult;
358 if (isset($member->group_enrollments)) {
359 $userresult->groups = array();
360 foreach ($member->group_enrollments as $group) {
361 $groupId = $group->group_id;
362 if (empty($this->source->groups) || !array_key_exists($groupId, $this->source->groups)) {
363 $this->source->groups[$groupId] = array(
'title' =>
"Group {$groupId}");
365 if (!empty($this->source->groups[$groupId][
'set'])) {
366 $this->source->groupSets[$this->source->groups[$groupId][
'set']][
'num_members']++;
367 if ($userresult->isStaff()) {
368 $this->source->groupSets[$this->source->groups[$groupId][
'set']][
'num_staff']++;
370 if ($userresult->isLearner()) {
371 $this->source->groupSets[$this->source->groups[$groupId][
'set']][
'num_learners']++;
374 $userresult->groups[] = $groupId;
380 unset($oldUsers[$userresult->getId(LTI\Tool::ID_SCOPE_RESOURCE)]);
386 if ($isLink && !$this->pagingMode) {
387 foreach ($oldUsers as $id => $userresult) {
388 $userresult->delete();
Class to represent a platform context.
Class to represent a platform resource link.
Class to implement the Membership service.
static $defaultLimit
Default limit on size of container to be returned from requests.
getWithGroups($role=null, $limit=null)
Get the memberships.
__construct($source, $endpoint, $format=self::MEDIA_TYPE_MEMBERSHIPS_V1, $limit=null, $pagingMode=false)
Class constructor.
const MEDIA_TYPE_MEMBERSHIPS_V1
Media type for version 1 of Memberships service.
static $SCOPE
Access scope.
const MEDIA_TYPE_MEMBERSHIPS_NRPS
Media type for Names and Role Provisioning service.
Class to implement a service.
send($method, $parameters=array(), $body=null)
Send a service request.
getPlatform()
Get platform.
$endpoint
Service endpoint.
parseContextsInArray($contexts, $arr)
Parse the JSON for context references.