ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
class.ilCmiXapiDataSet.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
29{
30 private array $_data = [];
31 private array $_archive = [];
32 private array $_element_db_mapping = [];
33 public array $_cmixSettingsProperties = [
34 "LrsTypeId" => ["db_col" => "lrs_type_id", "db_type" => "integer"]
35 ,
36 "ContentType" => ["db_col" => "content_type", "db_type" => "text"]
37 ,
38 "SourceType" => ["db_col" => "source_type", "db_type" => "text"]
39 ,
40 "ActivityId" => ["db_col" => "activity_id", "db_type" => "text"]
41 ,
42 "Instructions" => ["db_col" => "instructions", "db_type" => "text"]
43 // ,"OfflineStatus" => ["db_col" => "offline_status", "db_type" => "integer"]
44 ,
45 "LaunchUrl" => ["db_col" => "launch_url", "db_type" => "text"]
46 ,
47 "AuthFetchUrl" => ["db_col" => "auth_fetch_url", "db_type" => "integer"]
48 ,
49 "LaunchMethod" => ["db_col" => "launch_method", "db_type" => "text"]
50 ,
51 "LaunchMode" => ["db_col" => "launch_mode", "db_type" => "text"]
52 ,
53 "MasteryScore" => ["db_col" => "mastery_score", "db_type" => "float"]
54 ,
55 "KeepLp" => ["db_col" => "keep_lp", "db_type" => "integer"]
56 ,
57 "PrivacyIdent" => ["db_col" => "privacy_ident", "db_type" => "integer"]
58 ,
59 "PrivacyName" => ["db_col" => "privacy_name", "db_type" => "integer"]
60 ,
61 "UsrPrivacyComment" => ["db_col" => "usr_privacy_comment", "db_type" => "text"]
62 ,
63 "ShowStatements" => ["db_col" => "show_statements", "db_type" => "integer"]
64 ,
65 "XmlManifest" => ["db_col" => "xml_manifest", "db_type" => "text"]
66 ,
67 "Version" => ["db_col" => "version", "db_type" => "integer"]
68 ,
69 "HighscoreEnabled" => ["db_col" => "highscore_enabled", "db_type" => "integer"]
70 ,
71 "HighscoreAchievedTs" => ["db_col" => "highscore_achieved_ts", "db_type" => "integer"]
72 ,
73 "HighscorePercentage" => ["db_col" => "highscore_percentage", "db_type" => "integer"]
74 ,
75 "HighscoreWtime" => ["db_col" => "highscore_wtime", "db_type" => "integer"]
76 ,
77 "HighscoreOwnTable" => ["db_col" => "highscore_own_table", "db_type" => "integer"]
78 ,
79 "HighscoreTopTable" => ["db_col" => "highscore_top_table", "db_type" => "integer"]
80 ,
81 "HighscoreTopNum" => ["db_col" => "highscore_top_num", "db_type" => "integer"]
82 ,
83 "BypassProxy" => ["db_col" => "bypass_proxy", "db_type" => "integer"]
84 ,
85 "OnlyMoveon" => ["db_col" => "only_moveon", "db_type" => "integer"]
86 ,
87 "Achieved" => ["db_col" => "achieved", "db_type" => "integer"]
88 ,
89 "Answered" => ["db_col" => "answered", "db_type" => "integer"]
90 ,
91 "Completed" => ["db_col" => "completed", "db_type" => "integer"]
92 ,
93 "Failed" => ["db_col" => "failed", "db_type" => "integer"]
94 ,
95 "Initialized" => ["db_col" => "initialized", "db_type" => "integer"]
96 ,
97 "Passed" => ["db_col" => "passed", "db_type" => "integer"]
98 ,
99 "Progressed" => ["db_col" => "progressed", "db_type" => "integer"]
100 ,
101 "Satisfied" => ["db_col" => "satisfied", "db_type" => "integer"]
102 ,
103 "Terminated" => ["db_col" => "c_terminated", "db_type" => "integer"]
104 ,
105 "HideData" => ["db_col" => "hide_data", "db_type" => "integer"]
106 ,
107 "Timestamp" => ["db_col" => "c_timestamp", "db_type" => "integer"]
108 ,
109 "Duration" => ["db_col" => "duration", "db_type" => "integer"]
110 ,
111 "NoSubstatements" => ["db_col" => "no_substatements", "db_type" => "integer"]
112 ,
113 "PublisherId" => ["db_col" => "publisher_id", "db_type" => "text"]
114 ,
115 "AnonymousHomepage" => ["db_col" => "anonymous_homepage", "db_type" => "integer"]
116 ,
117 "MoveOn" => ["db_col" => "moveon", "db_type" => "text"]
118 ,
119 "LaunchParameters" => ["db_col" => "launch_parameters", "db_type" => "text"]
120 ,
121 "EntitlementKey" => ["db_col" => "entitlement_key", "db_type" => "text"]
122 ,
123 "SwitchToReview" => ["db_col" => "switch_to_review", "db_type" => "integer"]
124 ,
125 "DeleteData" => ["db_col" => "delete_data", "db_type" => "integer"]
126 ];
127
132 public function __construct(int $a_id = 0, bool $a_reference = true)
133 {
134 global $DIC;
138
139 foreach ($this->_cmixSettingsProperties as $key => $value) {
140 $this->_element_db_mapping [$value["db_col"]] = $key;
141 }
142 }
143
148 protected function getDependencies(
149 string $a_entity,
150 string $a_version,
151 ?array $a_rec = null,
152 ?array $a_ids = null
153 ): array {
154 return [];
155 }
156 public function getCmiXapiXmlRepresentation(
157 string $a_entity,
158 string $a_schema_version,
159 array $a_ids,
160 string $a_field = "",
161 bool $a_omit_header = false,
162 bool $a_omit_types = false
163 ): string {
164 global $DIC;
167 $GLOBALS["ilLog"]->write(json_encode($this->getTypes("cmix", "5.1.0"), JSON_PRETTY_PRINT));
168
169 $this->dircnt = 1;
170
171 $this->readData($a_entity, $a_schema_version, $a_ids);
172
173 $id = (int) $this->data["Id"];
174
175 // prepare archive skeleton
176 $objTypeAndId = "cmix_" . $id;
177 $this->_archive['directories'] = [
178 "exportDir" => ilExport::_getExportDirectory($id)
179 ,
180 "archiveDir" => time() . "__" . IL_INST_ID . "__" . $objTypeAndId
181 ,
182 "moduleDir" => "cmix_" . $id
183 ];
184
185 $this->_archive['files'] = [
186 "properties" => "properties.xml",
187 "metadata" => "metadata.xml",
188 "manifest" => 'manifest.xml',
189 ];
190 if (false !== strpos($this->data['SourceType'], 'local')) {
191 $this->_archive['files']['content'] = "content.zip";
192 }
193
194 $exportArchiveDir = ilExport::_getExportDirectory($id) . "/" . $this->_archive['directories']['archiveDir'] . "/";
195
196 // build metadata xml file //TODO Check
197 // file_put_contents(
198 // $exportArchiveDir . $this->_archive['files']['metadata'],
199 // $this->buildMetaData($id)
200 // );
201
202 // build content zip file
203 if (isset($this->_archive['files']['content'])) {
204 $lmDir = './' . ILIAS_WEB_DIR . "/" . CLIENT_ID . "/lm_data/lm_" . $id;
205 $DIC->legacyArchives()->zip(
206 $lmDir,
207 $exportArchiveDir . $this->_archive['files']['content'],
208 false
209 );
210 }
211
212 // build property xml file
213
214 file_put_contents(
215 $exportArchiveDir . $this->_archive['files']['properties'],
216 $this->buildProperties($a_entity, $a_omit_header)
217 );
218
219
220 $fileName = $this->_archive['directories']['exportDir'] . "/" . $this->_archive['directories']['archiveDir'] . ".zip";
221
222 return $fileName;
223 }
224
231 protected function getTypes(string $a_entity, string $a_version): array
232 {
233 $types = [];
234 foreach ($this->_cmixSettingsProperties as $key => $value) {
235 $types[$key] = $value["db_type"];
236 }
237
238 if ($a_entity == "cmix") {
239 switch ($a_version) {
240 case "5.1.0":
241 $types = [];
242 foreach ($this->_cmixSettingsProperties as $key => $value) {
243 $types[$key] = $value["db_type"];
244 }
245 //return $types;
246 break;
247 }
248 }
249 return $types;
250 }
251
252 public function readData(string $a_entity, string $a_version, array $a_ids): void
253 {
254 global $DIC;
255
256 if (!is_array($a_ids)) {
257 $a_ids = array($a_ids);
258 }
259
260 //var_dump([$a_entity, $a_version, $a_id]); exit;
261 if ($a_entity == "cmix") {
262 switch ($a_version) {
263 case "5.1.0":
264 $this->getDirectDataFromQuery("SELECT obj_id id, title, description " .
265 " FROM object_data " .
266 "WHERE " .
267 $DIC->database()->in("obj_id", $a_ids, false, "integer"));
268 break;
269 } // EOF switch
270 } // EOF if( $a_entity == "cmix" )
271
272 foreach ($this->data as $key => $data) {
273 $query = "SELECT " . implode(",", array_keys($this->_element_db_mapping)) . " ";
274 $query .= "FROM `cmix_settings` ";
275 $query .= "WHERE " . $DIC->database()->in("obj_id", $a_ids, false, "integer");
276 $result = $DIC->database()->query($query);
277 //$this->data = [];
278 if ($dataset = $DIC->database()->fetchAssoc($result)) {
279 $this->_data = $dataset;
280 }
281
282 //foreach( $this->_data AS $key => $data ) {
283 foreach ($this->_data as $dbColName => $value) {
284 $attr = $this->_element_db_mapping[$dbColName];
285 $this->data[$key][$attr] = $value;
286 //$this->data[$key][$dbColName] = $value;
287 } // EOF foreach ($this->_dataSetMapping as $dbColName => $value)
288 } // EOF foreach( $this->_data AS $key => $data )
289 $this->data = $this->data[0];
290 //var_dump($this->data); exit;
291 }
292
293 // public function buildMetaData(int $id): string
294 // {
295 // $md2xml = new ilMD2XML($id, $id, "cmix");
296 // $md2xml->startExport();
297 // return $md2xml->getXML();
298 // }
299
300 private function buildManifest(): string
301 {
302 $manWriter = new ilXmlWriter();
303 $manWriter->xmlHeader();
304 foreach ($this->_archive['files'] as $key => $value) {
305 $manWriter->xmlElement($key, null, $value, true, true);
306 }
307 #$manWriter->appendXML ("</content>\n");
308 return $manWriter->xmlDumpMem(true);
309 }
310
311 private function buildProperties(mixed $a_entity, bool $a_omit_header = false): string
312 {
313 $atts = array(
314 "InstallationId" => IL_INST_ID,
315 "InstallationUrl" => ILIAS_HTTP_PATH,
316 "TopEntity" => $a_entity
317 );
318
319 $writer = new ilXmlWriter();
320
321 $writer->xmlStartTag('DataSet', $atts);
322
323 if (!$a_omit_header) {
324 $writer->xmlHeader();
325 }
326
327 foreach ($this->data as $key => $value) {
328 $writer->xmlElement($key, null, $value, true, true);
329 }
330
331 $writer->xmlEndTag("DataSet");
332
333 return $writer->xmlDumpMem(true);
334 }
335
336 public function importRecord(
337 string $a_entity,
338 array $a_types,
339 array $a_rec,
340 ilImportMapping $a_mapping,
341 string $a_schema_version
342 ): void {
343 //var_dump( [$a_entity, $a_types, $a_rec, $a_mapping, $a_schema_version] ); exit;
344 switch ($a_entity) {
345 case "cmix":
346
347 if ($new_id = $a_mapping->getMapping('components/ILIAS/Container', 'objs', $a_rec['Id'])) {
348 $newObj = ilObjectFactory::getInstanceByObjId((int) $new_id, false);
349 } else {
350 $newObj = new ilObjCmiXapi();
351 $newObj->setType("cmix");
352 $newObj->create(true);
353 }
354
355 $newObj->setTitle($a_rec["Title"]);
356 $newObj->setDescription($a_rec["Description"]);
357 $newObj->update();
358
359 //$this->current_obj = $newObj;
360 $a_mapping->addMapping("components/ILIAS/CmiXapi", "cmix", $a_rec["Id"], (string) $newObj->getId());
361 $a_mapping->addMapping(
362 "components/ILIAS/MetaData",
363 "md",
364 $a_rec["Id"] . ":0:cmix",
365 $newObj->getId() . ":0:cmix"
366 );
367 break;
368 }
369 }
370
375 public function getSupportedVersions(): array
376 {
377 return array("5.1.0");
378 }
379
383 public function getXmlNamespace(string $a_entity, string $a_schema_version): string
384 {
385 return "http://www.ilias.de/xml/Modules/CmiXapi/" . $a_entity;
386 }
387}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
getSupportedVersions()
Get supported versions.
getXmlNamespace(string $a_entity, string $a_schema_version)
Get xml namespace.
readData(string $a_entity, string $a_version, array $a_ids)
Read data from DB.
getTypes(string $a_entity, string $a_version)
Get field types for entity.
buildProperties(mixed $a_entity, bool $a_omit_header=false)
getDependencies(string $a_entity, string $a_version, ?array $a_rec=null, ?array $a_ids=null)
Determine the dependent sets of data.
importRecord(string $a_entity, array $a_types, array $a_rec, ilImportMapping $a_mapping, string $a_schema_version)
Needs to be overwritten for import use case.
A dataset contains in data in a common structure that can be shared and transformed for different pur...
static _getExportDirectory(int $a_obj_id, string $a_type="xml", string $a_obj_type="", string $a_entity="")
@depricated Get export directory for an repository object
addMapping(string $a_comp, string $a_entity, string $a_old_id, string $a_new_id)
getMapping(string $a_comp, string $a_entity, string $a_old_id)
static getInstanceByObjId(?int $obj_id, bool $stop_on_error=true)
get an instance of an Ilias object by object id
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const CLIENT_ID
Definition: constants.php:41
const ILIAS_WEB_DIR
Definition: constants.php:45
const IL_INST_ID
Definition: constants.php:40
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26
$GLOBALS["DIC"]
Definition: wac.php:54