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';
268  $rnd = new ilLORandomTestQuestionPools(
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 ?>
parseObjectives(SimpleXMLElement $root)
Parse objective.
parseSettings(SimpleXMLElement $root)
static getInstanceByObjId($a_obj_id)
get singleton instance
parseObjectDependencies()
Parse object dependencies (assigned strucure objects, page objects, fixed questions) ...
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
getMapping()
Get import mapping.
Add rich text string
The name of the decorator.
getCourse()
Get course.
getMappingInfoForItemObject($a_obj_id)
Get obj_id mapping.
parseXmlErrors()
Parse xml errors from libxml_get_errors.
getMappingInfoForItem($a_ref_id)
Get mapping info.
class ilCourseObjectiveMaterials
setMapping(ilImportMapping $mapping)
Set import mapping.
Class ilLOXmlWriter.
Class ilObjCourse.
class ilcourseobjective
static _lookupObjId($a_id)
parseMaterials(SimpleXMLElement $obj, $a_objective_id)
Parse assigned materials.
__construct(ilObjCourse $course, $a_xml)
Constructor.
parse()
Parse xml.
Settings for LO courses.
$errors
class ilcourseobjectiveQuestion
parseTests(SimpleXMLElement $obj, $a_objective_id)
Parse tests of objective.