/** * Performs membership service request using an LTI Context object. * * If the context has a 'custom_context_memberships_url' setting, we use this to perform the membership service request. * Otherwise, if a context is associated with resource link, we try first to get the members using the * ResourceLink::doMembershipsService() method. * If we're still unable to fetch members from the resource link, we try to build a memberships URL from the memberships URL * endpoint template that is defined in the ToolConsumer profile and substitute the parameters accordingly. * * @param Context $context The context object. * @param ResourceLink $resourcelink The resource link object. * @param string $membershipsurltemplate The memberships endpoint URL template. * @return bool|User[] Array of User objects upon successful membership service request. False, otherwise. */ protected function do_context_membership_request(Context $context, ResourceLink $resourcelink = null, $membershipsurltemplate = '') { $dataconnector = $this->dataconnector; // Flag to indicate whether to save the context later. $contextupdated = false; // If membership URL is not set, try to generate using the default membership URL from the consumer profile. if (!$context->hasMembershipService()) { if (empty($membershipsurltemplate)) { mtrace("Skipping - No membership service available.\n"); return false; } if ($resourcelink === null) { $resourcelink = $dataconnector->get_resourcelink_from_context($context); } if ($resourcelink !== null) { // Try to perform a membership service request using this resource link. $resourcelinkmembers = $this->do_resourcelink_membership_request($resourcelink); if ($resourcelinkmembers) { // If we're able to fetch members using this resource link, return these. return $resourcelinkmembers; } } // If fetching memberships through resource link failed and we don't have a memberships URL, build one from template. mtrace("'custom_context_memberships_url' not set. Fetching default template: {$membershipsurltemplate}"); $membershipsurl = $membershipsurltemplate; // Check if we need to fetch tool code. $needstoolcode = strpos($membershipsurl, '{tool_code}') !== false; if ($needstoolcode) { $toolcode = false; // Fetch tool code from the resource link data. $lisresultsourcedidjson = $resourcelink->getSetting('lis_result_sourcedid'); if ($lisresultsourcedidjson) { $lisresultsourcedid = json_decode($lisresultsourcedidjson); if (isset($lisresultsourcedid->data->typeid)) { $toolcode = $lisresultsourcedid->data->typeid; } } if ($toolcode) { // Substitute fetched tool code value. $membershipsurl = str_replace('{tool_code}', $toolcode, $membershipsurl); } else { // We're unable to determine the tool code. End this processing. return false; } } // Get context_id parameter and substitute, if applicable. $membershipsurl = str_replace('{context_id}', $context->getId(), $membershipsurl); // Get context_type and substitute, if applicable. if (strpos($membershipsurl, '{context_type}') !== false) { $contexttype = $context->type !== null ? $context->type : 'CourseSection'; $membershipsurl = str_replace('{context_type}', $contexttype, $membershipsurl); } // Save this URL for the context's custom_context_memberships_url setting. $context->setSetting('custom_context_memberships_url', $membershipsurl); $contextupdated = true; } // Perform membership service request. $url = $context->getSetting('custom_context_memberships_url'); mtrace("Performing membership service request from context with URL {$url}."); $members = $context->getMembership(); // Save the context if membership request succeeded and if it has been updated. if ($members && $contextupdated) { $context->save(); } return $members; }