【问题标题】:Sending Grade Data back to LMS using LTI使用 LTI 将成绩数据发送回 LMS
【发布时间】:2015-04-22 19:01:42
【问题描述】:

我创建了一个支持 LTI 的工具,但在将数据发送回 Desire2Learn 等 LMS 时遇到了一些问题。仅根据我的理解,您生成了一个包含成绩项目本身的 XML 有效负载,并使用 cURL 通过 POST 将其发送回 LMS。我遇到的问题是我的 $result 变量返回 false,我现在无法弄清楚。这是我的代码:

session_start();

require_once 'blti/blti.php';
require_once 'blti/blti_util.php';

define('OAUTH_CONSUMER_KEY', 'key');
define('OAUTH_CONSUMER_SECRET', 'secret');

$blti = new BLTI(OAUTH_CONSUMER_SECRET, true, false);
if ($blti->valid) {
    $_SESSION['lis_outcome_service_url'] = $_REQUEST['lis_outcome_service_url'];
    $_SESSION['lis_result_sourcedid']    = $_REQUEST['lis_result_sourcedid'];
    $_SESSION['lis_person_name_given']   = $_REQUEST['lis_person_name_given'];
    $_SESSION['oauth_consumer_key']      = $_REQUEST['oauth_consumer_key'];
    $_SESSION['oauth_consumer_secret']   = OAUTH_CONSUMER_SECRET;

    sendGradeBackToLMS();
}else {
    exit($blti->message);
}

function sendGradeBackToLMS() {
    $ch = curl_init();
    if (!$ch) { exit('curl is not supported!'); }

    $url = 'http://localhost/endpoint.php';

    $xmldata = getPOXRequest();
    $xml = str_replace(
        array('MESSAGE_IDENTIFIER', 'SOURCEDID', 'GRADE'),
        array(uniqid(), $_SESSION['lis_result_sourcedid'], 0.75),
        $xmldata);
    $request_headers = array();
    $request_headers[] = 'User-Agent: '. $_SERVER['HTTP_USER_AGENT'];
    $request_headers[] = 'Accept:     text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';

    curl_setopt_array($ch, array(
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => $request_headers,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $xml
    ));

    $results = curl_exec($ch);
    curl_close($ch);

    echo $results;
}

function getPOXRequest() {
    return <<<XML
    <?xml version = "1.0" encoding = "UTF-8"?>
    <imsx_POXEnvelopeRequest xmlns = "http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0">
      <imsx_POXHeader>
        <imsx_POXRequestHeaderInfo>
          <imsx_version>V1.0</imsx_version>
          <imsx_messageIdentifier>MESSAGE_IDENTIFIER</imsx_messageIdentifier>
        </imsx_POXRequestHeaderInfo>
      </imsx_POXHeader>
      <imsx_POXBody>
        <replaceResultRequest>
          <resultRecord>
            <sourcedGUID>
              <sourcedId>SOURCEDID</sourcedId>
            </sourcedGUID>
            <result>
              <resultScore>
                <language>en</language>
                <textString>GRADE</textString>
              </resultScore>
            </result>
          </resultRecord>
        </replaceResultRequest>
      </imsx_POXBody>
    </imsx_POXEnvelopeRequest>
XML;
}

总结一下,$blti 是一个检查它是否是有效的基本 LTI 启动的实例。如果这是真的,我通过将 LTI 请求变量存储到 SESSION 变量中来初始化 SESSION。接下来在 sendGradeBackToLMS() 函数中,我将包含成绩项目的 XML 数据块发送到 $url 中给出的路径。

任何类型的输入都会有所帮助! 谢谢!

【问题讨论】:

    标签: php lti


    【解决方案1】:
    Try this code,
    
    require_once("ims-blti/OAuthBody.php");
    
    if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
     error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
    } else { 
     error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
    }
    
    $method="POST";
    $oauth_consumer_secret = $_REQUEST['secret'];
    
    $sourcedid = $_REQUEST['lis_result_sourcedid'];
    if (get_magic_quotes_gpc()) $sourcedid = stripslashes($sourcedid);
    $oauth_consumer_key = $_REQUEST['key'];
    $endpoint = $_REQUEST['lis_outcome_service_url'];
    $content_type = "application/xml";
    
    $body = '<?xml version = "1.0" encoding = "UTF-8"?>  
    <imsx_POXEnvelopeRequest xmlns = "http://www.imsglobal.org/lis/oms1p0/pox">      
        <imsx_POXHeader>         
            <imsx_POXRequestHeaderInfo>            
                <imsx_version>V1.0</imsx_version>  
                <imsx_messageIdentifier>MESSAGE</imsx_messageIdentifier>         
            </imsx_POXRequestHeaderInfo>      
        </imsx_POXHeader>      
        <imsx_POXBody>         
            <OPERATION>            
                <resultRecord>
                    <sourcedGUID>
                        <sourcedId>SOURCEDID</sourcedId>
                    </sourcedGUID>
                    <result>
                        <resultScore>
                            <language>en-us</language>
                            <textString>GRADE</textString>
                        </resultScore>
                    </result>
                </resultRecord>       
            </OPERATION>      
        </imsx_POXBody>   
    </imsx_POXEnvelopeRequest>';
    
    if (isset($_REQUEST['grade'])) {
        $operation = 'replaceResultRequest';
        $postBody = str_replace(
        array('SOURCEDID', 'GRADE', 'OPERATION','MESSAGE'), 
        array($sourcedid, $_REQUEST['grade'], $operation, uniqid()),
        $body);
    } else {
        exit();
    }
    
    $response = sendOAuthBodyPOST($method, $endpoint, $oauth_consumer_key, $oauth_consumer_secret, $content_type, $postBody);
    

    看看这个,

    git 克隆https://github.com/ebinezar/ims-lti.git

    【讨论】:

    • @epippawin 感谢您的回复。但是,我不确定你在这里放了几件事。 1. 第3行,什么是“ims-blti/OAuthBody.php”?其次,在第 15 行更改 $sourcedid 有什么意义?谢谢。
    猜你喜欢
    • 2016-08-22
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多