ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilLOXmlParser.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4
13{
14 const TYPE_TST_PO = 1;
15 const TYPE_TST_ALL = 2;
16 const TYPE_TST_RND = 3;
17
18
19 private $xml = '';
20 private $course = null;
21 private $mapping = null;
22
28 public function __construct(ilObjCourse $course, $a_xml)
29 {
30 $this->course = $course;
31 $this->xml = $a_xml;
32 }
33
39 {
40 $this->mapping = $mapping;
41 }
42
47 public function getMapping()
48 {
49 return $this->mapping;
50 }
51
56 protected function getCourse()
57 {
58 return $this->course;
59 }
60
64 public function parse()
65 {
66 libxml_use_internal_errors(true);
67 $root = simplexml_load_string(trim($this->xml));
68 if(!$root instanceof SimpleXMLElement)
69 {
70 $GLOBALS['ilLog']->write(__METHOD__.': XML is: '. $this->xml. (string) $root);
71 $GLOBALS['ilLog']->write(__METHOD__.': Error parsing objective xml: '.$this->parseXmlErrors());
72 return false;
73 }
74 $GLOBALS['ilLog']->write(__METHOD__.': Handling element: '. (string) $root->getName());
75 $this->parseSettings($root);
76 $this->parseObjectives($root);
77 }
78
82 public function parseObjectDependencies()
83 {
84 libxml_use_internal_errors(true);
85 $root = simplexml_load_string(trim($this->xml));
86 if(!$root instanceof SimpleXMLElement)
87 {
88 $GLOBALS['ilLog']->write(__METHOD__.': XML is: '. $this->xml. (string) $root);
89 $GLOBALS['ilLog']->write(__METHOD__.': Error parsing objective xml: '.$this->parseXmlErrors());
90 return false;
91 }
92
93 foreach($root->Objective as $obj)
94 {
95 $mapped_objective_id = $this->getMapping()->getMapping('Modules/Course', 'objectives', (string) $obj->attributes()->id);
96 if($mapped_objective_id)
97 {
98 $this->parseMaterials($obj, $mapped_objective_id);
99 $this->parseTests($obj, $mapped_objective_id);
100 }
101 }
102 }
103
108 protected function parseSettings(SimpleXMLElement $root)
109 {
110 include_once './Modules/Course/classes/Objectives/class.ilLOSettings.php';
111 $settings = ilLOSettings::getInstanceByObjId($this->getCourse()->getId());
112 $GLOBALS['ilLog']->write(__METHOD__.': Handling element: '. (string) $root->Settings->getName());
113 foreach($root->Settings as $set)
114 {
115 $GLOBALS['ilLog']->write(__METHOD__.': Handling element: '. (string) $set->getName());
116 $settings->setInitialTestType((int) (string) $set->attributes()->initialTestType);
117 $settings->setInitialTestAsStart((bool) (string) $set->attributes()->initialTestStart);
118 $settings->setQualifyingTestType((int) (string) $set->attributes()->qualifyingTestType);
119 $settings->setQualifyingTestAsStart((bool) (string) $set->attributes()->qualifyingTestStart);
120 $settings->resetResults((bool) (string) $set->attributes()->resetResults);
121 $settings->setPassedObjectiveMode((int) (string) $set->attributes()->passedObjectivesMode);
122
123 // itest
124 $itest = (int) $this->getMappingInfoForItem((int) (string) $set->attributes()->iTest);
125 $settings->setInitialTest($itest);
126
127 // qtest
128 $qtest = (int) $this->getMappingInfoForItem((int) (string) $set->attributes()->qTest);
129 $settings->setQualifiedTest($qtest);
130
131 $settings->update();
132 }
133 }
134
139 protected function parseObjectives(SimpleXMLElement $root)
140 {
141 foreach($root->Objective as $obj)
142 {
143 include_once './Modules/Course/classes/class.ilCourseObjective.php';
144 $new_obj = new ilCourseObjective($this->getCourse());
145 $new_obj->setActive((bool) (string) $obj->attributes()->online);
146 $new_obj->setTitle((string) $obj->Title);
147 $new_obj->setDescription((string) $obj->Description);
148 $new_obj->setPosition((int) (string) $obj->attributes()->position);
149 $new_objective_id = $new_obj->add();
150
151 $this->getMapping()->addMapping('Modules/Course', 'objectives', (string) $obj->attributes()->id, $new_objective_id);
152 $this->getMapping()->addMapping('Services/COPage', 'pg', 'lobj:'.(string) $obj->attributes()->id, 'lobj:'.$new_objective_id);
153
154 // done after container import complete
155 //$this->parseMaterials($obj,$new_objective_id);
156 //$this->parseTests($obj, $new_objective_id);
157
158 }
159 }
160
165 protected function parseMaterials(SimpleXMLElement $obj, $a_objective_id)
166 {
167 foreach($obj->Material as $mat)
168 {
169 $mat_ref_id = (string) $mat->attributes()->refId;
170
171 $mapping_ref_id = $this->getMappingInfoForItem($mat_ref_id);
172 if($mapping_ref_id)
173 {
174 include_once './Modules/Course/classes/class.ilCourseObjectiveMaterials.php';
175 $new_mat = new ilCourseObjectiveMaterials($a_objective_id);
176 $new_mat->setLMRefId($mapping_ref_id);
177
178 $mat_type = (string) $mat->attributes()->type;
179 $obj_id = 0;
180 switch($mat_type)
181 {
182 case 'st':
183 $mapped_chapter = $this->getMapping()->getMapping(
184 'Modules/LearningModule',
185 'lm_tree',
186 (int) (string) $mat->attributes()->objId
187 );
188 if($mapped_chapter)
189 {
190 $obj_id = $mapped_chapter;
191 }
192 break;
193
194 case 'pg':
195 $mapped_page = $this->getMapping()->getMapping(
196 'Modules/LearningModule',
197 'pg',
198 (int) (string) $mat->attributes()->objId
199 );
200 if($mapped_page)
201 {
202 $obj_id = $mapped_page;
203 }
204 break;
205
206 default:
207 $obj_id = ilObject::_lookupObjId($mapping_ref_id);
208 break;
209 }
210 if($obj_id)
211 {
212 $new_mat->setLMObjId($obj_id);
213 $new_mat->setType((string) $mat->attributes()->type);
214 $new_id = $new_mat->add();
215 $new_mat->writePosition($new_id, (int) (string) $mat->attributes()->position);
216 }
217 }
218 }
219 }
220
226 protected function parseTests(SimpleXMLElement $obj, $a_objective_id)
227 {
228 $GLOBALS['ilLog']->write(__METHOD__.': Parsing ' . (string) $obj->getName());
229
230 foreach($obj->Test as $tst)
231 {
232 $type = (int) (string) $tst->attributes()->type;
233
234
235 if($type == self::TYPE_TST_PO)
236 {
237 $tst_ref_id = (string) $tst->attributes()->refId;
238 $mapping_ref_id = $this->getMappingInfoForItem($tst_ref_id);
239 $GLOBALS['ilLog']->write(__METHOD__.': Found test ref id ' . (string) $tst_ref_id);
240 if(!$mapping_ref_id)
241 {
242 continue;
243 }
244 include_once './Modules/Course/classes/Objectives/class.ilLOTestAssignment.php';
245 $assignment = new ilLOTestAssignment();
246 $assignment->setContainerId($this->getCourse()->getId());
247 $assignment->setTestRefId($mapping_ref_id);
248 $assignment->setObjectiveId($a_objective_id);
249 $assignment->setAssignmentType((int) (string) $tst->attributes()->testType);
250 $assignment->save();
251 }
252 elseif($type == self::TYPE_TST_RND)
253 {
254 $tst_obj_id = (int) (string) $tst->attributes()->objId;
255 $mapping_id = $this->getMappingInfoForItemObject($tst_obj_id);
256 if(!$mapping_id)
257 {
258 continue;
259 }
260
261 $new_qpl_id = $this->getMappingForQpls((int) (string) $tst->attributes()->poolId);
262 if(!$new_qpl_id)
263 {
264 continue;
265 }
266
267 include_once './Modules/Course/classes/Objectives/class.ilLORandomTestQuestionPools.php';
269 $this->getCourse()->getId(),
270 $a_objective_id,
271 (int) (string) $tst->attributes()->testType
272 );
273 $rnd->setTestId($mapping_id);
274 $rnd->setLimit((string) $tst->attributes()->limit);
275 $rnd->setQplSequence($new_qpl_id);
276 $rnd->create();
277 }
278 else
279 {
280 $tst_ref_id = (string) $tst->attributes()->refId;
281 $mapping_ref_id = $this->getMappingInfoForItem($tst_ref_id);
282 if(!$mapping_ref_id)
283 {
284 continue;
285 }
286 include_once './Modules/Course/classes/class.ilCourseObjectiveQuestion.php';
287 $quest = new ilCourseObjectiveQuestion($a_objective_id);
288 $quest->setTestRefId($mapping_ref_id);
289 $quest->setTestObjId(ilObject::_lookupObjId($mapping_ref_id));
290 $quest->setTestStatus((string) $tst->attributes()->testType);
291 $quest->setTestSuggestedLimit((string) $tst->attributes()->limit);
292
293 foreach($tst->Question as $qst)
294 {
295 $qid = (string) $qst->attributes()->id;
296 $mapping_qid = $this->getMappingForQuestion($qid);
297 if($mapping_qid)
298 {
299 $quest->setQuestionId($mapping_qid);
300 $quest->add();
301 }
302 }
303 }
304 }
305 }
306
313 protected function getMappingInfoForItem($a_ref_id)
314 {
315 $new_ref_id = $this->getMapping()->getMapping('Services/Container', 'refs', $a_ref_id);
316 $GLOBALS['ilLog']->write(__METHOD__.': Found new ref_id: ' .$new_ref_id.' for '. $a_ref_id);
317 return (int) $new_ref_id;
318 }
319
325 protected function getMappingInfoForItemObject($a_obj_id)
326 {
327 $new_obj_id = $this->getMapping()->getMapping('Services/Container', 'objs', $a_obj_id);
328 $GLOBALS['ilLog']->write(__METHOD__.': Found new ref_id: ' .$new_obj_id.' for '. $a_obj_id);
329 return (int) $new_obj_id;
330 }
331
332 protected function getMappingForQuestion($qid)
333 {
334 $new_qid = $this->getMapping()->getMapping('Modules/Test', 'quest', $qid);
335 $GLOBALS['ilLog']->write(__METHOD__.': Found new question_id: ' .$new_qid.' for '. $qid);
336 return $new_qid;
337 }
338
339 protected function getMappingForQpls($a_id)
340 {
341 $new_id = $this->getMapping()->getMapping('Modules/Test', 'rnd_src_pool_def', $a_id);
342 if($new_id)
343 {
344 return $new_id;
345 }
346 return 0;
347 }
348
349
350
351
352
353
354
355
361 protected function parseXmlErrors()
362 {
363 $errors = '';
364 foreach(libxml_get_errors() as $err)
365 {
366 $errors .= $err->code.'<br/>';
367 }
368 return $errors;
369 }
370}
371?>
An exception for terminatinating execution or to throw for unit testing.
class ilCourseObjectiveMaterials
class ilcourseobjectiveQuestion
class ilcourseobjective
static getInstanceByObjId($a_obj_id)
get singleton instance
Settings for LO courses.
Class ilLOXmlWriter.
parseObjectDependencies()
Parse object dependencies (assigned strucure objects, page objects, fixed questions)
getMappingInfoForItem($a_ref_id)
Get mapping info.
parseXmlErrors()
Parse xml errors from libxml_get_errors.
parseObjectives(SimpleXMLElement $root)
Parse objective.
setMapping(ilImportMapping $mapping)
Set import mapping.
parseSettings(SimpleXMLElement $root)
__construct(ilObjCourse $course, $a_xml)
Constructor.
getMappingInfoForItemObject($a_obj_id)
Get obj_id mapping.
getCourse()
Get course.
parseTests(SimpleXMLElement $obj, $a_objective_id)
Parse tests of objective.
parseMaterials(SimpleXMLElement $obj, $a_objective_id)
Parse assigned materials.
getMapping()
Get import mapping.
Class ilObjCourse.
static _lookupObjId($a_id)
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
$errors