ILIAS  release_4-4 Revision
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/Test/classes/class.ilTestRandomQuestionSetSourcePoolTaxonomiesDuplicator.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 
48  private function removeMirroredTaxonomies()
49  {
50  $taxonomyIds = ilObjTaxonomy::getUsageOfObject($this->testOBJ->getId());
51 
52  foreach($taxonomyIds as $taxId)
53  {
54  $taxonomy = new ilObjTaxonomy($taxId);
55  $taxonomy->delete();
56  }
57  }
58 
59  private function removeStagedQuestions()
60  {
61  $query = 'SELECT * FROM tst_rnd_cpy WHERE tst_fi = %s';
62  $res = $this->db->queryF( $query, array('integer'), array($this->testOBJ->getTestId())
63  );
64 
65  while( $row = $this->db->fetchAssoc($res) )
66  {
67  $question = assQuestion::_instanciateQuestion($row['qst_fi']);
68 
69  if( $question instanceof assQuestion )
70  {
71  $question->delete($row['qst_fi']);
72  }
73  else
74  {
75  $GLOBALS['ilLog']->writeWarning(
76  "could not delete staged random question (ref={$this->testOBJ->getRefId()} / qst={$row['qst_fi']})"
77  );
78  }
79  }
80 
81  $query = "DELETE FROM tst_rnd_cpy WHERE tst_fi = %s";
82  $this->db->manipulateF( $query, array('integer'), array($this->testOBJ->getTestId()) );
83  }
84 
85  private function build(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList)
86  {
87  $involvedSourcePoolIds = $sourcePoolDefinitionList->getInvolvedSourcePoolIds();
88 
89  foreach($involvedSourcePoolIds as $sourcePoolId)
90  {
91  $questionIdMapping = $this->stageQuestionsFromSourcePool($sourcePoolId);
92 
93  $taxonomiesKeysMap = $this->mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping);
94 
95  $this->applyMappedTaxonomiesKeys($sourcePoolDefinitionList, $taxonomiesKeysMap, $sourcePoolId);
96  }
97  }
98 
99  private function stageQuestionsFromSourcePool($sourcePoolId)
100  {
101  $questionIdMapping = array();
102 
103  $query = 'SELECT question_id FROM qpl_questions WHERE obj_fi = %s AND complete = %s AND original_id IS NULL';
104  $res = $this->db->queryF( $query, array('integer', 'text'), array($sourcePoolId, 1) );
105 
106  while( $row = $this->db->fetchAssoc($res) )
107  {
108  $question = assQuestion::_instanciateQuestion($row['question_id']);
109  $duplicateId = $question->duplicate(true, null, null, null, $this->testOBJ->getId());
110 
111  $nextId = $this->db->nextId('tst_rnd_cpy');
112  $this->db->insert('tst_rnd_cpy', array(
113  'copy_id' => array('integer', $nextId),
114  'tst_fi' => array('integer', $this->testOBJ->getTestId()),
115  'qst_fi' => array('integer', $duplicateId),
116  'qpl_fi' => array('integer', $sourcePoolId)
117  ));
118 
119  $questionIdMapping[ $row['question_id'] ] = $duplicateId;
120  }
121 
122  return $questionIdMapping;
123  }
124 
125  private function mirrorSourcePoolTaxonomies($sourcePoolId, $questionIdMapping)
126  {
128  $this->testOBJ, $sourcePoolId, $questionIdMapping
129  );
130 
131  $duplicator->duplicate();
132 
133  return $duplicator->getDuplicatedTaxonomiesKeysMap();
134  }
135 
141  private function applyMappedTaxonomiesKeys(ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetDuplicatedTaxonomiesKeysMap $taxonomiesKeysMap, $sourcePoolId)
142  {
143  foreach($sourcePoolDefinitionList as $definition)
144  {
147  if($definition->getPoolId() == $sourcePoolId)
148  {
149  $definition->setMappedFilterTaxId(
150  $taxonomiesKeysMap->getMappedTaxonomyId($definition->getOriginalFilterTaxId())
151  );
152 
153  $definition->setMappedFilterTaxNodeId(
154  $taxonomiesKeysMap->getMappedTaxNodeId($definition->getOriginalFilterTaxNodeId())
155  );
156  }
157  }
158  }
159  // =================================================================================================================
160 }
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