ILIAS  trunk Revision v11.0_alpha-1731-gff9cd7e2bd3
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.ilCmiXapiImporter.php
Go to the documentation of this file.
1 <?php
2 
19 declare(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
87  $this->prepareContainerObject();
89  } else {
90  // single object
91  $this->prepareSingleObject();
92  $this->getImportDirectorySingle();
93  $this->_isSingleImport = true;
94  }
96  $this->parseXmlFileProperties();
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 }
static getWebspaceDir(string $mode="filesystem")
get webspace directory
__destruct()
if single import then deleteImportDirectiry
getImportDirectoryContainer()
Gets the relative path to the Filesystem::temp Folder.
deleteImportDirectiry()
Delete the import directory.
prepareSingleObject()
Builds the CmiXapi Object.
ILIAS Filesystem Filesystem $filesystemTemp
prepareLocalSourceStorage()
Creates a folder in the data directory of the document root.
ILIAS DI Container $dic
ILIAS Filesystem Util Archive LegacyArchives $archives
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
ilCmiXapiDataSet $_dataset
getMapping(string $a_comp, string $a_entity, string $a_old_id)
getImportDirectorySingle()
Gets the relative path to the Filesystem::temp Folder.
global $DIC
Definition: shib_login.php:22
__construct()
ilCmiXapiImporter constructor.
importXmlRepresentation(string $a_entity, string $a_id, string $a_xml, ilImportMapping $a_mapping)
Init the object creation from import.
parseXmlFileProperties()
Parse xml file and set properties.
static getInstanceByObjId(?int $obj_id, bool $stop_on_error=true)
get an instance of an Ilias object by object id
ILIAS Filesystem Filesystem $filesystemWeb
updateNewObj()
Finalize the new CmiXapi Object.
__construct(Container $dic, ilPlugin $plugin)
prepareContainerObject()
Builds the CmiXapi Object.
Xml importer class.