function domnode_to_array($node) { $output = array(); switch ($node->nodeType) { case XML_CDATA_SECTION_NODE: case XML_TEXT_NODE: $output = trim($node->textContent); break; case XML_ELEMENT_NODE: for ($i = 0, $m = $node->childNodes->length; $i < $m; $i++) { $child = $node->childNodes->item($i); $v = domnode_to_array($child); if (isset($child->tagName)) { $t = $child->tagName; if (!isset($output[$t])) { $output[$t] = array(); } $output[$t][] = $v; } elseif ($v || $v === '0') { $output = (string) $v; } } if ($node->attributes->length && !is_array($output)) { //Has attributes but isn't an array $output = array('@content' => $output); //Change output into an array. } if (is_array($output)) { if ($node->attributes->length) { $a = array(); foreach ($node->attributes as $attrName => $attrNode) { $a[$attrName] = (string) $attrNode->value; } $output['@attributes'] = $a; } foreach ($output as $t => $v) { if (is_array($v) && count($v) == 1 && $t != '@attributes') { $output[$t] = $v[0]; } } } break; } return $output; }
function immediate_update_outcome_in_canvas($oauth_consumer_key, $secret, $lti_sourced_id, $lis_outcome_service_url, $score) { set_time_limit(180); $xmlRequest = "<?xml version = \"1.0\" encoding = \"UTF-8\"?>\n<imsx_POXEnvelopeRequest xmlns=\"http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0\">\n <imsx_POXHeader>\n <imsx_POXRequestHeaderInfo>\n <imsx_version>V1.0</imsx_version>\n <imsx_messageIdentifier>999999123</imsx_messageIdentifier>\n </imsx_POXRequestHeaderInfo>\n </imsx_POXHeader>\n <imsx_POXBody>\n <replaceResultRequest>\n <resultRecord>\n <sourcedGUID>\n <sourcedId>{$lti_sourced_id}</sourcedId>\n </sourcedGUID>\n <result>\n <resultScore>\n <language>en</language>\n <textString>" . $score . "</textString>\n </resultScore>\n </result>\n </resultRecord>\n </replaceResultRequest>\n </imsx_POXBody>\n</imsx_POXEnvelopeRequest>"; $hash = base64_encode(sha1($xmlRequest, TRUE)); $params = array('oauth_body_hash' => $hash); $hmac_method = new OAuthSignatureMethod_HMAC_SHA1(); $consumer = new OAuthConsumer($oauth_consumer_key, $secret, NULL); $req = OAuthRequest::from_consumer_and_token($consumer, NULL, 'POST', $lis_outcome_service_url, $params); $req->sign_request($hmac_method, $consumer, NULL); $params = $req->get_parameters(); $header = $req->to_header(); $header .= "\nContent-type: application/xml"; $ext_response = do_post_request($lis_outcome_service_url, $xmlRequest, $header); $ext_doc = new DOMDocument(); set_error_handler(array($this, 'HandleXmlError')); $ext_doc->loadXML($ext_response); restore_error_handler(); $ext_nodes = domnode_to_array($ext_doc->documentElement); if (!isset($ext_nodes['imsx_POXHeader']['imsx_POXResponseHeaderInfo']['imsx_statusInfo']['imsx_codeMajor'])) { throw new Exception("No imsx_codeMajor from outcome service for " . $lti_sourced_id); } if ($ext_nodes['imsx_POXHeader']['imsx_POXResponseHeaderInfo']['imsx_statusInfo']['imsx_codeMajor'] != 'success' && isset($ext_nodes['imsx_POXHeader']['imsx_POXResponseHeaderInfo']['imsx_statusInfo']['imsx_description']) && $ext_nodes['imsx_POXHeader']['imsx_POXResponseHeaderInfo']['imsx_statusInfo']['imsx_description'] != 'User is no longer in course') { throw new Exception("No success code from outcome service for " . $lti_sourced_id); } }
/** * convert an XML structure string into an array * @param string $xmlstr * @return multitype: */ public static function xmlstr_to_array($xmlstr) { if ($xmlstr == null || empty($xmlstr)) { return array(); } $doc = new \DOMDocument(); $doc->loadXML(utf8_encode($xmlstr)); return domnode_to_array($doc->documentElement); }