ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilCmiXapiImporter.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
31{
32 private array $_moduleProperties = [];
33 private \ILIAS\Filesystem\Util\Archive\LegacyArchives $archives;
34
35 public array $manifest = [];
36
37 private \ilCmiXapiDataSet $_dataset;
38
40
41 private ?string $_newId = null;
42
43 private string $_import_objId;
44
45 private \ilImportMapping $_mapping;
46
47 private ?string $_relWebDir = 'lm_data/lm_';
48
49 private string $_relImportDir = '';
50
51 private bool $_isSingleImport = false;
52
53 private \ILIAS\DI\Container $dic;
54
55 private \ILIAS\Filesystem\Filesystem $filesystemWeb;
56
57 private \ILIAS\Filesystem\Filesystem $filesystemTemp;
61 public function __construct()
62 {
64 global $DIC;
65 $this->dic = $DIC;
66 $this->filesystemWeb = $DIC->filesystem()->web();
67 $this->filesystemTemp = $DIC->filesystem()->temp();
68 $this->archives = $DIC->legacyArchives();
69 $this->_dataset = new ilCmiXapiDataSet();
70 $this->_dataset->_cmixSettingsProperties['Title'] = '';
71 $this->_dataset->_cmixSettingsProperties['Description'] = '';
72 //todo: at the moment restricted to one module in xml file, extend?
73 }
74
80 public function importXmlRepresentation(string $a_entity, string $a_id, string $a_xml, ilImportMapping $a_mapping): void
81 {
82 $this->_import_objId = $a_id;
83 $this->_mapping = $a_mapping;
84
85 if ($this->_newId = $a_mapping->getMapping('components/ILIAS/Container', 'objs', (string) $this->_import_objId)) {
86 // container content
89 } else {
90 // single object
91 $this->prepareSingleObject();
93 $this->_isSingleImport = true;
94 }
97 $this->updateNewObj();
98 }
99
103 private function prepareSingleObject(): self
104 {
105 // create new cmix object
106 $this->_cmixObj = new ilObjCmiXapi();
107 // set type of questionpool object
108 $this->_cmixObj->setType('cmix');
109 // set title of questionpool object to "dummy"
110 $this->_cmixObj->setTitle("dummy");
111 // set description of questionpool object
112 $this->_cmixObj->setDescription("test import");
113 // create the questionpool class in the ILIAS database (object_data table)
114 $this->_cmixObj->create(true);
115 $this->_newId = (string) $this->_cmixObj->getId();
116 $this->_mapping->addMapping('components/ILIAS/CmiXapi', 'cmix', (string) $this->_import_objId, (string) $this->_newId);
117 //$this->getImport();
118 $this->_cmixObj->update();
119
120 return $this;
121 }
122
126 private function prepareContainerObject(): void
127 {
128 $this->_newId = $this->_mapping->getMapping('components/ILIAS/Container', 'objs', (string) $this->_import_objId);
129 if (!is_null($this->_newId) && $this->_newId != "") {
130 // container content
131 $this->_cmixObj = ilObjectFactory::getInstanceByObjId((int) $this->_newId, false);
132 //$_SESSION['tst_import_subdir'] = $this->getImportPackageName();
133 $this->_cmixObj->save(); // this generates test id first time
134 //var_dump([$this->getImportDirectory(), $this->_import_dirname]); exit;
135 $this->_mapping->addMapping("components/ILIAS/CmiXapi", "cmix", (string) $this->_import_objId, $this->_newId);
136 }
137 $this->_cmixObj->save();
138 $this->_cmixObj->update();
139 }
140
146 private function prepareLocalSourceStorage(): self
147 {
148 if (true === $this->filesystemTemp->has($this->_relImportDir . '/content.zip')) {
149 // $this->_hasContent = true;
150 $this->_relWebDir = $this->_relWebDir . $this->_cmixObj->getId();
151 if (false === $this->filesystemWeb->has($this->_relWebDir)) {
152 $this->filesystemWeb->createDir($this->_relWebDir);
153 $this->filesystemWeb->put($this->_relWebDir . '/content.zip', $this->filesystemTemp->read($this->_relImportDir . '/content.zip'));
154 $webDataDir = ilFileUtils::getWebspaceDir();
155 $this->archives->unzip($webDataDir . "/" . $this->_relWebDir . "/content.zip");
156 $this->filesystemWeb->delete($this->_relWebDir . '/content.zip');
157 }
158 }
159 return $this;
160 }
161
168 private function parseXmlFileProperties(): self
169 {
170 $xmlRoot = null;
171 $xml = $this->filesystemTemp->readStream($this->_relImportDir . '/properties.xml');
172 if ($xml != false) {
173 $use_internal_errors = libxml_use_internal_errors(true);
174 $xmlRoot = simplexml_load_string((string) $xml);
175 libxml_use_internal_errors($use_internal_errors);
176 }
177 foreach ($this->_dataset->_cmixSettingsProperties as $key => $property) {
178 $this->_moduleProperties[$key] = trim($xmlRoot->$key->__toString());
179 }
180 return $this;
181 }
182
187 private function updateNewObj(): void
188 {
189 $this->_cmixObj->setTitle($this->_moduleProperties['Title'] . " " . $this->dic->language()->txt("copy_of_suffix"));
190 $this->_cmixObj->setDescription($this->_moduleProperties['Description']);
191 $this->_cmixObj->update();
192
193 if ($this->_moduleProperties['LrsTypeId']) {
194 $this->_cmixObj->setLrsTypeId((int) $this->_moduleProperties['LrsTypeId']);
195 $this->_cmixObj->setLrsType(new ilCmiXapiLrsType((int) $this->_moduleProperties['LrsTypeId']));
196 }
197 $this->_cmixObj->setContentType((string) $this->_moduleProperties['ContentType']);
198 $this->_cmixObj->setSourceType((string) $this->_moduleProperties['SourceType']);
199 $this->_cmixObj->setActivityId((string) $this->_moduleProperties['ActivityId']);
200 $this->_cmixObj->setInstructions((string) $this->_moduleProperties['Instructions']);
201 // $this->_cmixObj->setOfflineStatus($this->_moduleProperties['OfflineStatus']);
202 $this->_cmixObj->setLaunchUrl((string) $this->_moduleProperties['LaunchUrl']);
203 $this->_cmixObj->setAuthFetchUrlEnabled((bool) $this->_moduleProperties['AuthFetchUrl']);
204 $this->_cmixObj->setLaunchMethod((string) $this->_moduleProperties['LaunchMethod']);
205 $this->_cmixObj->setLaunchMode((string) $this->_moduleProperties['LaunchMode']);
206 $this->_cmixObj->setMasteryScore((float) $this->_moduleProperties['MasteryScore']);
207 $this->_cmixObj->setKeepLpStatusEnabled((bool) $this->_moduleProperties['KeepLp']);
208 $this->_cmixObj->setPrivacyIdent((int) $this->_moduleProperties['PrivacyIdent']);
209 $this->_cmixObj->setPrivacyName((int) $this->_moduleProperties['PrivacyName']);
210 $this->_cmixObj->setUserPrivacyComment((string) $this->_moduleProperties['UsrPrivacyComment']);
211 $this->_cmixObj->setStatementsReportEnabled((bool) $this->_moduleProperties['ShowStatements']);
212 $this->_cmixObj->setXmlManifest((string) $this->_moduleProperties['XmlManifest']);
213 $this->_cmixObj->setVersion((int) $this->_moduleProperties['Version']);
214 $this->_cmixObj->setHighscoreEnabled((bool) $this->_moduleProperties['HighscoreEnabled']);
215 $this->_cmixObj->setHighscoreAchievedTS((bool) $this->_moduleProperties['HighscoreAchievedTs']);
216 $this->_cmixObj->setHighscorePercentage((bool) $this->_moduleProperties['HighscorePercentage']);
217 $this->_cmixObj->setHighscoreWtime((bool) $this->_moduleProperties['HighscoreWtime']);
218 $this->_cmixObj->setHighscoreOwnTable((bool) $this->_moduleProperties['HighscoreOwnTable']);
219 $this->_cmixObj->setHighscoreTopTable((bool) $this->_moduleProperties['HighscoreTopTable']);
220 $this->_cmixObj->setHighscoreTopNum((int) $this->_moduleProperties['HighscoreTopNum']);
221 $this->_cmixObj->setBypassProxyEnabled((bool) $this->_moduleProperties['BypassProxy']);
222 $this->_cmixObj->setOnlyMoveon((bool) $this->_moduleProperties['OnlyMoveon']);
223 $this->_cmixObj->setAchieved((bool) $this->_moduleProperties['Achieved']);
224 $this->_cmixObj->setAnswered((bool) $this->_moduleProperties['Answered']);
225 $this->_cmixObj->setCompleted((bool) $this->_moduleProperties['Completed']);
226 $this->_cmixObj->setFailed((bool) $this->_moduleProperties['Failed']);
227 $this->_cmixObj->setInitialized((bool) $this->_moduleProperties['Initialized']);
228 $this->_cmixObj->setPassed((bool) $this->_moduleProperties['Passed']);
229 $this->_cmixObj->setProgressed((bool) $this->_moduleProperties['Progressed']);
230 $this->_cmixObj->setSatisfied((bool) $this->_moduleProperties['Satisfied']);
231 $this->_cmixObj->setTerminated((bool) $this->_moduleProperties['Terminated']);
232 $this->_cmixObj->setHideData((bool) $this->_moduleProperties['HideData']);
233 $this->_cmixObj->setTimestamp((bool) $this->_moduleProperties['Timestamp']);
234 $this->_cmixObj->setDuration((bool) $this->_moduleProperties['Duration']);
235 $this->_cmixObj->setNoSubstatements((bool) $this->_moduleProperties['NoSubstatements']);
236 $this->_cmixObj->setPublisherId((string) $this->_moduleProperties['PublisherId']);
237 // $this->_cmixObj->setAnonymousHomepage($this->_moduleProperties['AnonymousHomepage']);
238 $this->_cmixObj->setMoveOn((string) $this->_moduleProperties['MoveOn']);
239 $this->_cmixObj->setLaunchParameters((string) $this->_moduleProperties['LaunchParameters']);
240 $this->_cmixObj->setEntitlementKey((string) $this->_moduleProperties['EntitlementKey']);
241 $this->_cmixObj->setSwitchToReviewEnabled((bool) $this->_moduleProperties['SwitchToReview']);
242 if(isset($this->_moduleProperties['DeleteData'])) {
243 $this->_cmixObj->setDeleteData((int) $this->_moduleProperties['DeleteData']);
244 }
245 $this->_cmixObj->save();
246 $this->_cmixObj->updateMetaData();
247
248 }
249
255 private function deleteImportDirectiry(): self
256 {
257 $this->filesystemTemp->delete($this->_relImportDir);
258 return $this;
259 }
260
265 private function getImportDirectorySingle(): self
266 {
267 $importTempDir = $this->getImportDirectory();
268 $dirArr = array_reverse(explode('/', $importTempDir));
269 $this->_relImportDir = $dirArr[1] . '/' . $dirArr[0];
270 return $this;
271 }
272
277 private function getImportDirectoryContainer(): self
278 {
279 $importTempDir = $this->getImportDirectory();
280 $dirArr = array_reverse(explode('/', $importTempDir));
281 $this->_relImportDir = $dirArr[3] . '/' . $dirArr[2] . '/' . $dirArr[1] . '/' . $dirArr[0];
282
283 return $this;
284 }
285
287 public function init(): void
288 {
289 }
290
294 public function __destruct()
295 {
296 if ($this->_isSingleImport) {
297 $this->deleteImportDirectiry();
298 }
299 }
300}
ILIAS Filesystem Filesystem $filesystemTemp
ILIAS DI Container $dic
ilCmiXapiDataSet $_dataset
updateNewObj()
Finalize the new CmiXapi Object.
ILIAS Filesystem Filesystem $filesystemWeb
getImportDirectorySingle()
Gets the relative path to the Filesystem::temp Folder.
getImportDirectoryContainer()
Gets the relative path to the Filesystem::temp Folder.
deleteImportDirectiry()
Delete the import directory.
__construct()
ilCmiXapiImporter constructor.
ILIAS Filesystem Util Archive LegacyArchives $archives
prepareLocalSourceStorage()
Creates a folder in the data directory of the document root.
parseXmlFileProperties()
Parse xml file and set properties.
importXmlRepresentation(string $a_entity, string $a_id, string $a_xml, ilImportMapping $a_mapping)
Init the object creation from import.
prepareContainerObject()
Builds the CmiXapi Object.
__destruct()
if single import then deleteImportDirectiry
prepareSingleObject()
Builds the CmiXapi Object.
static getWebspaceDir(string $mode="filesystem")
get webspace directory
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
Class ilObject Basic functions for all objects.
Xml importer class.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26