文章目錄
在上一篇中,我們介紹了SLK中的驗證機制。今天將繼續為大家介紹作為SLK重要組成部分的查詢、視圖以及支援的課件類型。
查詢與視圖
SLK中設立查詢與視圖的目的:
- 提供一種靈活的方式來在ALWP中顯示使用者課程記錄的過濾列表
- 允許管理員修改或建立新的資料庫查詢過濾條件並將結果顯示在ALWP中
- 具有一個webpart屬性來決定哪些查詢或查詢集對使用者有效,實現這一點並不需要瞭解查詢和查詢集是如何定義的
- 允許集中管理查詢和查詢集的定義,而特定的webpart卻可以選擇使用哪一個查詢或查詢集
定義
SLK查詢(SLK Query) —— 對課程記錄資料表的一個查詢,包含返回的欄,要滿足的條件等。
- 唯一的名稱- (跨所有查詢和查詢集)不允許有空格
- 該查詢的標題 - 容易閱讀的本地化的標題
- 基礎 Learning Store視圖
- 需要滿足的條件
- 需要顯示的欄
- 格式化屬性用於顯示(可選)
- 欄排序(可選)
一個SLK查詢由一個基礎學習儲存(learning store)視圖開始。通過在查詢結果定義中指定的查詢條件對該視圖進行過濾,最終決定顯示在課程記錄列表中的記錄。最後,對於每條記錄,查詢定義了哪些資料將被顯示在欄中,以及以什麼樣的格式來顯示。
比如,LearnerOverdue查詢會顯示當前學習者所有逾期未完成的課程記錄,並在課程記錄列表欄中顯示所屬的網站,課程名稱,到期日,狀態和分數。每一欄都可以指定不同的文字格式設定。
SLK 查詢集(Query Set)—— SLK查詢的一個集合,通過一段xml的形式定義在SLK設定檔中。其中指定了:
- 唯一的名稱- (跨所有查詢和查詢集)不允許有空格
- 該查詢集的標題 - 容易閱讀的本地化的標題
- SLK查詢的集合。以在ALWP摘要列表中顯示的順序排列。
- 為該查詢集設定一個預設SLK查詢。用於首次在ALWP中載入該查詢集時的預設顯示。
ALWP以查詢集來定義哪些查詢要顯示在摘要列表中,以及其中哪個查詢是ALWP載入時預設選中的。在ALWP規範文檔中有詳細的使用方式。另外,關於“查詢與視圖”更詳細的資訊也請大家參考ALWP規範。
LearningStore視圖與SLK查詢
LearningStore視圖是由SLK資料庫中資料的一個子集組成的虛擬表。它們通過SQL SELECT語句的形式定義在slk架構(schema.xml)中。通過它可以從多個條目中返回資料,計算值,並提供條目級安全。LearningStore視圖會根據視圖定義處理使用者的授權,僅返回目前使用者有權訪問的資料。所有的視圖都定義在MLC資料庫的架構中。
比如,其中名為LearnerAssignmentListForLearners的 LearningStore視圖將會僅返回目前使用者在指派流程中作為一個學習者所對應的課程記錄。而且,一些資料在被視圖返回之前就處理過了。例如,最終點數僅在該課程記錄已經被指導員“返回”後才會顯示給該學習者。對應這種情況,LearnerAssignmentListForLearners定義中會指定當學習者的課程選項組小於”final”時,最終點數返回null。
而SLK查詢是定義在SLK配置xml檔案中。用於提供一種靈活的方式來組織從一個LearningStore得到的資料。SLK查詢將一個LearningStore視圖進行進一步過濾並以特定格式顯示特定的一些欄。
通常LearningStore視圖用於從資料庫中返回合適的結果集,然後通過SLK使用來定製展現。
內容
SLK支援的內容格式如下:
- SCORM 2004 ——SLK的運行時引擎支援包含完整的排序和導航(sequencing and navigation)功能的SCORM 2004內容。SLK符合SCORM 2004第二版,版本號碼1.3.1,其中包含SCORM 2004 2nd Edition Addendum Version 1.2。
- SCORM 1.2 —— SLK – SLK的運行時引擎也支援SCORM 1.2格式的學習內容。SLK符合SCORM 1.2 ,其中包含SCORM 1.2 Addendum Version 2.0。
- Class Server(LRM/IMS+) – SLK支援除以下兩種情況外的Class Server學習資源:
- 遠程內容 –用於執行Class Server學習資源的運行時不支援使用遠程內容。Class Server 3和4都支援一種遠程內容協議,它允許發行者在e-learning包外面宿主特定的內容。但此功能在Class Server中並不常用,因此MS在SLK中將其移除,以降低複雜度。
- 包含許可證的LRM內容 – Class Server中的此項功能允許發行者將執行學習內容所必需的授權資訊包含到內容中。SLK沒有實現該功能,因此這類內容無法直接在SLK中使用。內容發行者只需將許可證移除就可以用於SLK了。
- 非e-Learning內容 —— SLK支援非e-learning內容(如,Word文檔,PowerPoint簡報等)的指派。一般類型的文檔都沒問題,只要能存到SharePoint文件庫裡就行。在SLKSettings.xml中包含了SLK中用到的MIME類型映射的清單。我們可以根據需要添加新的MIME類型,進而擴充SLK對特定文檔的支援。
非e-learning內容與e-learning內容的管理和流轉方式都是一樣的。但是,非e-learning內容在SLK資料庫中不存在學習和互動資料。eLearning內容可以利用JScript運行時環境提供的CMI資料模型來支援豐富的狀態跟蹤,評分,日期與進度等功能。而非eLearning內容只提供狀態,最終點數(或稱為得分),和指導員評語。當一個學習者點擊“開始學習”連結時,該內容會在相應的用戶端應用或外掛程式中開啟。
當完成學習後需要返回給指導員批閱時,學習者必須將文檔儲存一份到本地,然後根據文檔中指導員的要求以檔案的形式“提交”他/她的作業。SLK並沒有提供類似自動儲存的功能。通過頁面“提交”本次學習,學習者可以告訴指導員他們已經完成了相應的學習。
有很多使用者要求提高SLK對非eLearning內容的支援,特別是在日期(被指派,被開始,被完成)和結果資訊的提交(aka drop box 對於變更的內容)。解決該問題的一條途徑是啟用對非eLearning內容的CMI 跟蹤。因為在CMI資料模型中已經包含了大量類似的資訊並且在現在版本的SLK中已經實現。
建立指派並儲存關於該指派相關課程記錄資料的SQL架構:
這個架構是如何工作的?
當我們通過一個文件庫來指派一個文檔時,一個eLearning操作被調用,該文檔對應的一條指派(AssignmentItem)記錄被建立,對於每個學習者會建立一條課程(LearnerAssignmentItem)記錄,也對應到該文檔。
對於eLearning內容,當學習者開始學習時,對應該課程記錄會建立一條嘗試記錄(AttemptItem)。對於eLearning內容中每個活動(Activity,可能有多個),當該活動結束時,會建立一條新的活動嘗試記錄(ActiveAttemptItem)來儲存其對應的CMI資料。
對於非eLearning內容,當學習者開始學習時,LearnerAssignmentItem.NonElearningStatus寫一個值。指導員在批閱已完成的學習時,可以設定一個最終點數和一個評語。整個過程並沒有嘗試記錄或活動嘗試記錄的建立。所以也沒有地方可以儲存CMI資料。
SLK大牛們分析了使用SLK API來為非eLearing內容建立嘗試記錄和活動嘗試記錄的可能性。大致想法為:
- 將LearnerAssignmentId傳遞到非eLearning內容
- 建立一個與SLK並行的Web服務。使用類似如下的一個調用來從非eLearning內容中提交CMI狀態到SLK:
trackingService.Submit(learnerAssignmentId,cmiData);
- 當web服務接收到傳來的調用時,它會調用:
StoredLearningSession slc=slkStore.StartAttemptOnLearnerAssignment(learnerAssignmentId);
Slc.CurrentActivityDataModel…=cmiData;
然而這條途徑走不通。對應StoredLearningSession在SLK API中有太多的邏輯了,並且它與SCOMR和Class Server內容所提供的豐富資料緊密整合在一起。他們曾經考慮過“類比”這些資料,以便當檢測到非eLearning內容時,建立一個最簡化版本的pseudo-data,將其寫入資料庫(類似AssignmentItem.RootActivityId=0),以便可以針對非eLearning內容通過欺騙的方式來使用SLK API。但思路還是不太容易理清。
後來乾脆,從CMITracing Service等待一個傳入的調用開始,當調用過來後,該服務會直接操作資料表(AttemptItem和ActiveAttemptItem)來插入記錄並關聯到該非eLearning內容對應的課程記錄(LearnerAssignmentItem)。如果他們不存在,將會為該指派(Assignment)建立一條PackageItem(manifest為空白,PackageFormat為'Document’)和一個ActivityPackageItem。這樣我們就可以利用相同的資料庫結構描述了。實質上,我們為上面提到的內容產生了一個“SCORM 偽裝”。非eLearning內容因為沒有manifest,所以被限制為每個包僅一個活動。
流程圖
安全性
由於非eLearning內容並不能假定就能在瀏覽器中運行,因此它不能像SCORM和Class Server內容一樣共用安全上下文。因此我們考慮使用基於web服務的REST/POX來支援資料的上傳,以使開發啟用CMI資料的內容變得簡單。我們不能依賴像Windows驗證或WS/Security這樣的安全機制來自動得到一個安全上下文。
大多數基於REST/POX的web服務使用一個共用的令牌來保證調用的安全。它的實現是通過傳輸一個很長的由電腦產生的令牌,而且令牌的分發是基於會話的。在SLK裡已經有一個這樣的基於會話的令牌了,那就是LearnerAssignmentId。不幸的是,迄今為止它是一個遞增的長整型數字,非常好猜。將來會變成一個隨機產生的GUID,到時就可以大大提高這種方法的安全性了。然而,這個變更現在將會被postponed,因此我們可以在不需要進行昂貴的架構變更的情況下啟用該功能。
更高層的設計
- LearnerAssignmentId被從SLK傳遞到內容的方式是:當開始學習時,通過HTTP參數(如 http://MySLK/Lessons/MyLesson.htm?LearnerAssignmentId=12)
- Windows Communications Foundation基於Web Service並使用WebHttpBinding(如 REST/POX)來實現與內容的最大交換能力
- System.Runtime.Serialization DataContracts將represent the CMI資料,使其通過C#來建立/consume變得簡單。同時相容簡單的XML 解析。
希望這些在新版本中可以實現。更多資訊參考http://slk.codeplex.com/wikipage?title=Enabling%20CMI%20Tracking%20for%20non-eLearning%20content