ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f87
class.ilTestRandomQuestionSetStagingPoolBuilder.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 require_once 'Modules/TestQuestionPool/classes/class.ilQuestionPoolTaxonomiesDuplicator.php';
5 require_once 'Modules/TestQuestionPool/classes/class.assQuestion.php';
6 require_once 'Services/Taxonomy/classes/class.ilObjTaxonomy.php';
7 
15 {
19  public $db = null;
20 
24  public $testOBJ = null;
25 
27  {
28  $this->db = $db;
29  $this->testOBJ = $testOBJ;
30  }
31 
32  // =================================================================================================================
33 
34  public function rebuild(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
35  {
36  $this->reset();
37 
38  $this->build($sourcePoolDefinitionList);
39  }
40 
41  public function reset()
42  {
43  $this->removeMirroredTaxonomies();
44 
45  $this->removeStagedQuestions();
46 
47  $this->cleanupTestSettings();
48  }
49 
50  private function removeMirroredTaxonomies()
51  {
52  $taxonomyIds = ilObjTaxonomy::getUsageOfObject($this->testOBJ->getId());
53 
54  foreach($taxonomyIds as $taxId)
55  {
56  $taxonomy = new ilObjTaxonomy($taxId);
57  $taxonomy->delete();
58  }
59  }
60 
61  private function removeStagedQuestions()
62  {
63  $query = 'SELECT * FROM tst_rnd_cpy WHERE tst_fi = %s';
64  $res = $this->db->queryF( $query, array('integer'), array($this->testOBJ->getTestId())
65  );
66 
67  while( $row = $this->db->fetchAssoc($res) )
68  {
69  $question = assQuestion::_instanciateQuestion($row['qst_fi']);
70 
71  if( $question instanceof assQuestion )
72  {
73  $question->delete($row['qst_fi']);
74  }
75  else
76  {
77  $GLOBALS['ilLog']->writeWarning(
78  "could not delete staged random question (ref={$this->testOBJ->getRefId()} / qst={$row['qst_fi']})"
79  );
80  }
81  }
82 
83  $query = "DELETE FROM tst_rnd_cpy WHERE tst_fi = %s";
84  $this->db->manipulateF( $query, array('integer'), array($this->testOBJ->getTestId()) );
85  }
86 
87  private function build(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
88  {
89  $involvedSourcePoolIds = $sourcePoolDefinitionList->getInvolvedSourcePoolIds();
90 
91  foreach($involvedSourcePoolIds as $sourcePoolId)
92  {
93  $questionIdMapping = $this->stageQuestionsFromSourcePool($sourcePoolId);
94 
95  $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
96 
97  $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
98  }
99  }
100 
101  private function stageQuestionsFromSourcePool($sourcePoolId)
102  {
103  $questionIdMapping = array();
104 
105  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
106  $res = $this->db->queryF( $query, array('integer', 'text'), array($sourcePoolId, 1) );
107 
108  while( $row = $this->db->fetchAssoc($res) )
109  {
110  $question = assQuestion::_instanciateQuestion($row['question_id']);
111  $duplicateId = $question->duplicate(true, null, null, null, $this->testOBJ->getId());
112 
113  $nextId = $this->db->nextId('tst_rnd_cpy');
114  $this->db->insert('tst_rnd_cpy', array(
115  'copy_id' => array('integer', $nextId),
116  'tst_fi' => array('integer', $this->testOBJ->getTestId()),
117  'qst_fi' => array('integer', $duplicateId),
118  'qpl_fi' => array('integer', $sourcePoolId)
119  ));
120 
121  $questionIdMapping[ $row['question_id'] ] = $duplicateId;
122  }
123 
124  return $questionIdMapping;
125  }
126 
127  private function mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping)
128  {
129  $duplicator = new ilQuestionPoolTaxonomiesDuplicator();
130 
131  $duplicator->setSourceObjId($sourcePoolId);
132  $duplicator->setSourceObjType('qpl');
133  $duplicator->setTargetObjId($this->testOBJ->getId());
134  $duplicator->setTargetObjType($this->testOBJ->getType());
135  $duplicator->setQuestionIdMapping($questionIdMapping);
136 
137  $duplicator->duplicate();
138 
139  return $duplicator->getDuplicatedTaxonomiesKeysMap();
140  }
141 
147  private function applyMappedTaxonomiesKeys(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxonomiesKeysMap, $sourcePoolId)
148  {
149  foreach($sourcePoolDefinitionList as $definition)
150  {
153  if($definition->getPoolId() == $sourcePoolId)
154  {
155  $definition->setMappedFilterTaxId(
156  $taxonomiesKeysMap->getMappedTaxonomyId($definition->getOriginalFilterTaxId())
157  );
158 
159  $definition->setMappedFilterTaxNodeId(
160  $taxonomiesKeysMap->getMappedTaxNodeId($definition->getOriginalFilterTaxNodeId())
161  );
162  }
163  }
164  }
165 
166  private function cleanupTestSettings()
167  {
168  $this->testOBJ->setResultFilterTaxIds(array());
169  $this->testOBJ->saveToDb(true);
170  }
171 
172  // =================================================================================================================
173 }
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
static getUsageOfObject($a_obj_id, $a_include_titles=false)
Get usage of object.
Abstract basic class which is to be extended by the concrete assessment question type classes...
rebuild(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
build(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
$GLOBALS['ct_recipient']
Database Wrapper.
Definition: class.ilDB.php:28