226 $this->groupSets = null;
227 $this->groups = null;
228 $this->primaryResourceLinkId = null;
229 $this->shareApproved = null;
230 $this->created = null;
231 $this->updated = null;
257 $this->settingsChanged =
false;
269 public function delete()
284 if (is_null($this->consumer)) {
286 #if (!is_null($this->context) || !is_null($this->contextId)) { 287 if($this->context || $this->contextId) {
288 $this->consumer = $this->
getContext()->getConsumer();
306 $this->consumer = null;
319 if (is_null($this->context) && !is_null($this->contextId)) {
347 $this->context = null;
443 if ($value !== $old_value) {
444 if (!empty($value)) {
449 $this->settingsChanged =
true;
486 if ($this->settingsChanged) {
551 $this->extResponse = null;
554 $sourceResourceLink = $user->getResourceLink();
555 $sourcedId = $user->ltiResultSourcedId;
558 $urlLTI11 = $sourceResourceLink->getSetting(
'lis_outcome_service_url');
559 $urlExt = $sourceResourceLink->getSetting(
'ext_ims_lis_basic_outcome_url');
560 if ($urlExt || $urlLTI11) {
563 if ($urlLTI11 && ($ltiOutcome->type === self::EXT_TYPE_DECIMAL)) {
565 }
else if ($urlExt) {
567 $do =
'basic-lis-readresult';
570 case self::EXT_WRITE:
572 $do =
'replaceResult';
575 $do =
'basic-lis-updateresult';
578 case self::EXT_DELETE:
579 if ($urlLTI11 && ($ltiOutcome->type === self::EXT_TYPE_DECIMAL)) {
580 $do =
'deleteResult';
581 }
else if ($urlExt) {
583 $do =
'basic-lis-deleteresult';
589 $value = $ltiOutcome->getValue();
590 if (is_null($value)) {
595 if (
$action === self::EXT_WRITE) {
600 <language>{$ltiOutcome->language}</language>
601 <textString>{$value}</textString>
606 $sourcedId = htmlentities($sourcedId);
610 <sourcedId>{$sourcedId}</sourcedId>
617 if (!isset($this->extNodes[
'imsx_POXBody'][
"{$do}Response"][
'result'][
'resultScore'][
'textString'])) {
620 $ltiOutcome->setValue($this->extNodes[
'imsx_POXBody'][
"{$do}Response"][
'result'][
'resultScore'][
'textString']);
622 case self::EXT_WRITE:
623 case self::EXT_DELETE:
630 $params[
'sourcedid'] = $sourcedId;
631 $params[
'result_resultscore_textstring'] = $value;
632 if (!empty($ltiOutcome->language)) {
633 $params[
'result_resultscore_language'] = $ltiOutcome->language;
635 if (!empty($ltiOutcome->status)) {
636 $params[
'result_statusofresult'] = $ltiOutcome->status;
638 if (!empty($ltiOutcome->date)) {
639 $params[
'result_date'] = $ltiOutcome->date;
641 if (!empty($ltiOutcome->type)) {
642 $params[
'result_resultvaluesourcedid'] = $ltiOutcome->type;
644 if (!empty($ltiOutcome->data_source)) {
645 $params[
'result_datasource'] = $ltiOutcome->data_source;
650 if (isset($this->extNodes[
'result'][
'resultscore'][
'textstring'])) {
651 $response = $this->extNodes[
'result'][
'resultscore'][
'textstring'];
654 case self::EXT_WRITE:
655 case self::EXT_DELETE:
684 $this->extResponse = null;
693 $this->groupSets =
array();
694 $this->groups =
array();
700 if (!isset($this->extNodes[
'memberships'][
'member'])) {
702 }
else if (!isset($this->extNodes[
'memberships'][
'member'][0])) {
704 $members[0] = $this->extNodes[
'memberships'][
'member'];
706 $members = $this->extNodes[
'memberships'][
'member'];
709 for (
$i = 0;
$i < count($members);
$i++) {
714 $firstname = (isset($members[$i][
'person_name_given'])) ? $members[$i][
'person_name_given'] :
'';
715 $lastname = (isset($members[$i][
'person_name_family'])) ? $members[$i][
'person_name_family'] :
'';
716 $fullname = (isset($members[$i][
'person_name_full'])) ? $members[$i][
'person_name_full'] :
'';
717 $user->setNames($firstname, $lastname, $fullname);
720 $email = (isset($members[$i][
'person_contact_email_primary'])) ? $members[$i][
'person_contact_email_primary'] :
'';
724 if (isset($members[$i][
'roles'])) {
729 if (!isset($members[$i][
'groups'][
'group'])) {
731 }
else if (!isset($members[$i][
'groups'][
'group'][0])) {
733 $groups[0] = $members[
$i][
'groups'][
'group'];
735 $groups = $members[
$i][
'groups'][
'group'];
737 for ($j = 0; $j < count(
$groups); $j++) {
739 if (isset($group[
'set'])) {
740 $set_id = $group[
'set'][
'id'];
741 if (!isset($this->groupSets[$set_id])) {
742 $this->groupSets[$set_id] =
array(
'title' => $group[
'set'][
'title'],
'groups' =>
array(),
743 'num_members' => 0,
'num_staff' => 0,
'num_learners' => 0);
745 $this->groupSets[$set_id][
'num_members']++;
746 if ($user->isStaff()) {
747 $this->groupSets[$set_id][
'num_staff']++;
749 if ($user->isLearner()) {
750 $this->groupSets[$set_id][
'num_learners']++;
752 if (!in_array($group[
'id'], $this->groupSets[$set_id][
'groups'])) {
753 $this->groupSets[$set_id][
'groups'][] = $group[
'id'];
755 $this->groups[$group[
'id']] =
array(
'title' => $group[
'title'],
'set' => $set_id);
757 $this->groups[$group[
'id']] =
array(
'title' => $group[
'title']);
759 $user->groups[] = $group[
'id'];
763 if (isset($members[$i][
'lis_result_sourcedid'])) {
764 $user->ltiResultSourcedId = $members[
$i][
'lis_result_sourcedid'];
774 foreach ($oldUsers as
$id => $user) {
797 $this->extResponse = null;
800 $do =
'basic-lti-loadsetting';
802 case self::EXT_WRITE:
803 $do =
'basic-lti-savesetting';
805 case self::EXT_DELETE:
806 $do =
'basic-lti-deletesetting';
814 if (is_null($value)) {
822 if (isset($this->extNodes[
'setting'][
'value'])) {
823 $response = $this->extNodes[
'setting'][
'value'];
829 case self::EXT_WRITE:
830 $this->
setSetting(
'ext_ims_lti_tool_setting', $value);
834 case self::EXT_DELETE:
904 $has = !empty($this->contextId);
922 if (!empty($this->contextId)) {
923 $url = $this->
getContext()->getSetting(
'custom_context_memberships_url');
948 return $this->
getDataConnector()->getUserResultSourcedIDsResourceLink($this, $localOnly, $idScope);
977 $resourceLink->dataConnector =
$consumer->getDataConnector();
980 $resourceLink->load();
981 if (is_null($resourceLink->id) && !empty($tempId)) {
982 $resourceLink->ltiResourceLinkId = $tempId;
983 $resourceLink->load();
988 return $resourceLink;
1004 $resourceLink->setContextId(
$context->getRecordId());
1006 $resourceLink->dataConnector =
$context->getDataConnector();
1009 $resourceLink->load();
1010 if (is_null($resourceLink->id) && !empty($tempId)) {
1011 $resourceLink->ltiResourceLinkId = $tempId;
1012 $resourceLink->load();
1017 return $resourceLink;
1033 $resourceLink->load(
$id);
1035 return $resourceLink;
1071 if (empty($supportedTypes)) {
1072 $supportedTypes = explode(
',', str_replace(
' ',
'', strtolower($this->
getSetting(
'ext_ims_lis_resultvalue_sourcedids', self::EXT_TYPE_DECIMAL))));
1074 $type = $ltiOutcome->type;
1075 $value = $ltiOutcome->getValue();
1077 $ok = in_array(
$type, $supportedTypes) || (strlen($value) <= 0);
1080 if (
$type === self::EXT_TYPE_PERCENTAGE) {
1081 if (substr($value, -1) ===
'%') {
1082 $value = substr($value, 0, -1);
1084 $ok = is_numeric($value) && ($value >= 0) && ($value <= 100);
1086 $ltiOutcome->setValue($value / 100);
1087 $ltiOutcome->type = self::EXT_TYPE_DECIMAL;
1089 }
else if (
$type === self::EXT_TYPE_RATIO) {
1090 $parts = explode(
'/', $value, 2);
1091 $ok = (count($parts) === 2) && is_numeric($parts[0]) && is_numeric($parts[1]) && ($parts[0] >= 0) && ($parts[1] > 0);
1093 $ltiOutcome->setValue($parts[0] / $parts[1]);
1094 $ltiOutcome->type = self::EXT_TYPE_DECIMAL;
1097 }
else if (
$type === self::EXT_TYPE_LETTER_AF) {
1098 if (in_array(self::EXT_TYPE_LETTER_AF_PLUS, $supportedTypes)) {
1100 $ltiOutcome->type = self::EXT_TYPE_LETTER_AF_PLUS;
1101 }
else if (in_array(self::EXT_TYPE_TEXT, $supportedTypes)) {
1103 $ltiOutcome->type = self::EXT_TYPE_TEXT;
1106 }
else if (
$type === self::EXT_TYPE_LETTER_AF_PLUS) {
1107 if (in_array(self::EXT_TYPE_LETTER_AF, $supportedTypes) && (strlen($value) === 1)) {
1109 $ltiOutcome->type = self::EXT_TYPE_LETTER_AF;
1110 }
else if (in_array(self::EXT_TYPE_TEXT, $supportedTypes)) {
1112 $ltiOutcome->type = self::EXT_TYPE_TEXT;
1115 }
else if (
$type === self::EXT_TYPE_TEXT) {
1116 $ok = is_numeric($value) && ($value >= 0) && ($value <=1);
1118 $ltiOutcome->type = self::EXT_TYPE_DECIMAL;
1119 }
else if (substr($value, -1) ===
'%') {
1120 $value = substr($value, 0, -1);
1121 $ok = is_numeric($value) && ($value >= 0) && ($value <=100);
1123 if (in_array(self::EXT_TYPE_PERCENTAGE, $supportedTypes)) {
1124 $ltiOutcome->type = self::EXT_TYPE_PERCENTAGE;
1126 $ltiOutcome->setValue($value / 100);
1127 $ltiOutcome->type = self::EXT_TYPE_DECIMAL;
1151 $this->extRequest = null;
1152 $this->extRequestHeaders =
'';
1153 $this->extResponse = null;
1154 $this->extResponseHeaders =
'';
1160 if (
$http->send()) {
1161 $this->extResponse =
$http->response;
1162 $this->extResponseHeaders =
$http->responseHeaders;
1165 $this->extDoc->loadXML(
$http->response);
1166 $this->extNodes = $this->
domnodeToArray($this->extDoc->documentElement);
1167 if (isset($this->extNodes[
'statusinfo'][
'codemajor']) && ($this->extNodes[
'statusinfo'][
'codemajor'] ===
'Success')) {
1173 $this->extRequest =
$http->request;
1174 $this->extRequestHeaders =
$http->requestHeaders;
1194 $this->extRequest = null;
1195 $this->extRequestHeaders =
'';
1196 $this->extResponse = null;
1197 $this->extResponseHeaders =
'';
1200 $xmlRequest = <<<
EOD 1201 <?xml version =
"1.0" encoding =
"UTF-8"?>
1202 <imsx_POXEnvelopeRequest xmlns =
"http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0">
1204 <imsx_POXRequestHeaderInfo>
1205 <imsx_version>V1.0</imsx_version>
1206 <imsx_messageIdentifier>{
$id}</imsx_messageIdentifier>
1207 </imsx_POXRequestHeaderInfo>
1214 </imsx_POXEnvelopeRequest>
1217 $hash = base64_encode(sha1($xmlRequest,
true));
1227 $header .=
"\nContent-Type: application/xml";
1231 if (
$http->send()) {
1232 $this->extResponse =
$http->response;
1233 $this->extResponseHeaders =
$http->responseHeaders;
1236 $this->extDoc->loadXML(
$http->response);
1237 $this->extNodes = $this->
domnodeToArray($this->extDoc->documentElement);
1238 if (isset($this->extNodes[
'imsx_POXHeader'][
'imsx_POXResponseHeaderInfo'][
'imsx_statusInfo'][
'imsx_codeMajor']) &&
1239 ($this->extNodes[
'imsx_POXHeader'][
'imsx_POXResponseHeaderInfo'][
'imsx_statusInfo'][
'imsx_codeMajor'] ===
'success')) {
1245 $this->extRequest =
$http->request;
1246 $this->extRequestHeaders =
$http->requestHeaders;
1264 switch ($node->nodeType) {
1265 case XML_CDATA_SECTION_NODE:
1267 $output = trim($node->textContent);
1269 case XML_ELEMENT_NODE:
1270 for (
$i = 0;
$i < $node->childNodes->length;
$i++) {
1271 $child = $node->childNodes->item(
$i);
1273 if (isset($child->tagName)) {
1274 $t = $child->tagName;
1281 if (strlen(
$s) > 0) {
1287 if ($node->attributes->length) {
1289 foreach ($node->attributes as $attrName => $attrNode) {
1290 $a[$attrName] = (
string) $attrNode->value;
1295 if (is_array($v) && count($v)==1 &&
$t!=
'@attributes') {
static fromRecordId($id, $dataConnector)
Load the context from the database.
static from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=null)
pretty much a helper function to set up the request
if(!is_dir( $entity_dir)) exit("Fatal Error ([A-Za-z0-9]+)\+" &#(? foreach( $entity_files as $file) $output
Class to represent an OAuth Consumer.
Create styles array
The data for the language used.
Class to represent an HTTP message.
Class to represent an OAuth HMAC_SHA1 signature method.
const EOF
How fgetc() reports an End Of File.