ILIAS  trunk Revision v12.0_alpha-377-g3641b37b9db
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 } else {
159 exit($this->_relImportDir . 'not found');
160 }
161 return $this;
162 }
163
170 private function parseXmlFileProperties(): self
171 {
172 $xmlRoot = null;
173 $xml = $this->filesystemTemp->readStream($this->_relImportDir . '/properties.xml');
174 if ($xml != false) {
175 $use_internal_errors = libxml_use_internal_errors(true);
176 $xmlRoot = simplexml_load_string((string) $xml);
177 libxml_use_internal_errors($use_internal_errors);
178 }
179 foreach ($this->_dataset->_cmixSettingsProperties as $key => $property) {
180 $this->_moduleProperties[$key] = trim($xmlRoot->$key->__toString());
181 }
182 return $this;
183 }
184
189 private function updateNewObj(): void
190 {
191 $this->_cmixObj->setTitle($this->_moduleProperties['Title'] . " " . $this->dic->language()->txt("copy_of_suffix"));
192 $this->_cmixObj->setDescription($this->_moduleProperties['Description']);
193 $this->_cmixObj->update();
194
195 if ($this->_moduleProperties['LrsTypeId']) {
196 $this->_cmixObj->setLrsTypeId((int) $this->_moduleProperties['LrsTypeId']);
197 $this->_cmixObj->setLrsType(new ilCmiXapiLrsType((int) $this->_moduleProperties['LrsTypeId']));
198 }
199 $this->_cmixObj->setContentType((string) $this->_moduleProperties['ContentType']);
200 $this->_cmixObj->setSourceType((string) $this->_moduleProperties['SourceType']);
201 $this->_cmixObj->setActivityId((string) $this->_moduleProperties['ActivityId']);
202 $this->_cmixObj->setInstructions((string) $this->_moduleProperties['Instructions']);
203 // $this->_cmixObj->setOfflineStatus($this->_moduleProperties['OfflineStatus']);
204 $this->_cmixObj->setLaunchUrl((string) $this->_moduleProperties['LaunchUrl']);
205 $this->_cmixObj->setAuthFetchUrlEnabled((bool) $this->_moduleProperties['AuthFetchUrl']);
206 $this->_cmixObj->setLaunchMethod((string) $this->_moduleProperties['LaunchMethod']);
207 $this->_cmixObj->setLaunchMode((string) $this->_moduleProperties['LaunchMode']);
208 $this->_cmixObj->setMasteryScore((float) $this->_moduleProperties['MasteryScore']);
209 $this->_cmixObj->setKeepLpStatusEnabled((bool) $this->_moduleProperties['KeepLp']);
210 $this->_cmixObj->setPrivacyIdent((int) $this->_moduleProperties['PrivacyIdent']);
211 $this->_cmixObj->setPrivacyName((int) $this->_moduleProperties['PrivacyName']);
212 $this->_cmixObj->setUserPrivacyComment((string) $this->_moduleProperties['UsrPrivacyComment']);
213 $this->_cmixObj->setStatementsReportEnabled((bool) $this->_moduleProperties['ShowStatements']);
214 $this->_cmixObj->setXmlManifest((string) $this->_moduleProperties['XmlManifest']);
215 $this->_cmixObj->setVersion((int) $this->_moduleProperties['Version']);
216 $this->_cmixObj->setHighscoreEnabled((bool) $this->_moduleProperties['HighscoreEnabled']);
217 $this->_cmixObj->setHighscoreAchievedTS((bool) $this->_moduleProperties['HighscoreAchievedTs']);
218 $this->_cmixObj->setHighscorePercentage((bool) $this->_moduleProperties['HighscorePercentage']);
219 $this->_cmixObj->setHighscoreWtime((bool) $this->_moduleProperties['HighscoreWtime']);
220 $this->_cmixObj->setHighscoreOwnTable((bool) $this->_moduleProperties['HighscoreOwnTable']);
221 $this->_cmixObj->setHighscoreTopTable((bool) $this->_moduleProperties['HighscoreTopTable']);
222 $this->_cmixObj->setHighscoreTopNum((int) $this->_moduleProperties['HighscoreTopNum']);
223 $this->_cmixObj->setBypassProxyEnabled((bool) $this->_moduleProperties['BypassProxy']);
224 $this->_cmixObj->setOnlyMoveon((bool) $this->_moduleProperties['OnlyMoveon']);
225 $this->_cmixObj->setAchieved((bool) $this->_moduleProperties['Achieved']);
226 $this->_cmixObj->setAnswered((bool) $this->_moduleProperties['Answered']);
227 $this->_cmixObj->setCompleted((bool) $this->_moduleProperties['Completed']);
228 $this->_cmixObj->setFailed((bool) $this->_moduleProperties['Failed']);
229 $this->_cmixObj->setInitialized((bool) $this->_moduleProperties['Initialized']);
230 $this->_cmixObj->setPassed((bool) $this->_moduleProperties['Passed']);
231 $this->_cmixObj->setProgressed((bool) $this->_moduleProperties['Progressed']);
232 $this->_cmixObj->setSatisfied((bool) $this->_moduleProperties['Satisfied']);
233 $this->_cmixObj->setTerminated((bool) $this->_moduleProperties['Terminated']);
234 $this->_cmixObj->setHideData((bool) $this->_moduleProperties['HideData']);
235 $this->_cmixObj->setTimestamp((bool) $this->_moduleProperties['Timestamp']);
236 $this->_cmixObj->setDuration((bool) $this->_moduleProperties['Duration']);
237 $this->_cmixObj->setNoSubstatements((bool) $this->_moduleProperties['NoSubstatements']);
238 $this->_cmixObj->setPublisherId((string) $this->_moduleProperties['PublisherId']);
239 // $this->_cmixObj->setAnonymousHomepage($this->_moduleProperties['AnonymousHomepage']);
240 $this->_cmixObj->setMoveOn((string) $this->_moduleProperties['MoveOn']);
241 $this->_cmixObj->setLaunchParameters((string) $this->_moduleProperties['LaunchParameters']);
242 $this->_cmixObj->setEntitlementKey((string) $this->_moduleProperties['EntitlementKey']);
243 $this->_cmixObj->setSwitchToReviewEnabled((bool) $this->_moduleProperties['SwitchToReview']);
244 if (isset($this->_moduleProperties['DeleteData'])) {
245 $this->_cmixObj->setDeleteData((int) $this->_moduleProperties['DeleteData']);
246 }
247 $this->_cmixObj->save();
248 $this->_cmixObj->updateMetaData();
249
250 }
251
257 private function deleteImportDirectiry(): self
258 {
259 $this->filesystemTemp->delete($this->_relImportDir);
260 return $this;
261 }
262
267 private function getImportDirectorySingle(): self
268 {
269 $importTempDir = $this->getImportDirectory();
270 $dirArr = array_reverse(explode('/', $importTempDir));
271 $this->_relImportDir = $dirArr[1] . '/' . $dirArr[0];
272 return $this;
273 }
274
279 private function getImportDirectoryContainer(): self
280 {
281 $importTempDir = $this->getImportDirectory();
282 $dirArr = array_reverse(explode('/', $importTempDir));
283 $this->_relImportDir = $dirArr[3] . '/' . $dirArr[2] . '/' . $dirArr[1] . '/' . $dirArr[0];
284
285 return $this;
286 }
287
289 public function init(): void
290 {
291 }
292
296 public function __destruct()
297 {
298 if ($this->_isSingleImport) {
299 $this->deleteImportDirectiry();
300 }
301 }
302}
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.
exit
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26