ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilTestResultsImportParser.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
11 include_once("./Services/Xml/classes/class.ilSaxParser.php");
12 
14 {
15  private $tst_obj;
16  private $table;
21  private $user_criteria_checked = false;
22 
24 
28  public function __construct($a_xml_file, &$test_object)
29  {
30  parent::__construct($a_xml_file, true);
31  $this->tst_obj = &$test_object;
32  $this->table = '';
33  $this->active_id_mapping = array();
34  $this->question_id_mapping = array();
35  $this->user_criteria_checked = false;
36  $this->src_pool_def_id_mapping = array();
37  }
38 
42  public function getQuestionIdMapping()
43  {
45  }
46 
51  {
52  $this->question_id_mapping = $question_id_mapping;
53  }
54 
58  public function getSrcPoolDefIdMapping()
59  {
61  }
62 
67  {
68  $this->src_pool_def_id_mapping = $src_pool_def_id_mapping;
69  }
70 
76  public function setHandlers($a_xml_parser)
77  {
78  xml_set_object($a_xml_parser, $this);
79  xml_set_element_handler($a_xml_parser, 'handlerBeginTag', 'handlerEndTag');
80  xml_set_character_data_handler($a_xml_parser, 'handlerParseCharacterData');
81  }
82 
86  public function handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
87  {
88  global $ilDB;
89 
90  $this->sametag = false;
91  $this->characterbuffer = "";
92  $this->depth[$a_xml_parser]++;
93  $this->path[$this->depth[$a_xml_parser]] = strtolower($a_name);
94  $this->qti_element = $a_name;
95 
96  switch (strtolower($a_name)) {
97  case "results":
98  break;
99  case "row":
100  switch ($this->table) {
101  case 'tst_active':
102  if (!$this->user_criteria_checked) {
103  $this->user_criteria_checked = true;
104  if ($ilDB->tableColumnExists('usr_data', $a_attribs['user_criteria'])) {
105  include_once './Services/Database/classes/class.ilDBAnalyzer.php';
106  $analyzer = new ilDBAnalyzer();
107  $info = $analyzer->getFieldInformation('usr_data');
108  $this->user_criteria_field = $a_attribs['user_criteria'];
109  $this->user_criteria_type = $info[$a_attribs['user_criteria']]['type'];
110  }
111  }
112  $usr_id = ANONYMOUS_USER_ID;
113  if (strlen($this->user_criteria_field)) {
114  $result = $ilDB->queryF(
115  "SELECT usr_id FROM usr_data WHERE " . $this->user_criteria_field . " = %s",
116  array($this->user_criteria_type),
117  array($a_attribs[$this->user_criteria_field])
118  );
119  if ($result->numRows()) {
120  $row = $ilDB->fetchAssoc($result);
121  $usr_id = $row['usr_id'];
122  }
123  }
124  $next_id = $ilDB->nextId('tst_active');
125 
126  $ilDB->insert('tst_active', array(
127  'active_id' => array('integer', $next_id),
128  'user_fi' => array('integer', $usr_id),
129  'anonymous_id' => array('text', strlen($a_attribs['anonymous_id']) ? $a_attribs['anonymous_id'] : null),
130  'test_fi' => array('integer', $this->tst_obj->getTestId()),
131  'lastindex' => array('integer', $a_attribs['lastindex']),
132  'tries' => array('integer', $a_attribs['tries']),
133  'submitted' => array('integer', $a_attribs['submitted']),
134  'submittimestamp' => array('timestamp', strlen($a_attribs['submittimestamp']) ? $a_attribs['submittimestamp'] : null),
135  'tstamp' => array('integer', $a_attribs['tstamp']),
136  'importname' => array('text', $a_attribs['fullname']),
137  'last_finished_pass' => array('integer', $this->fetchLastFinishedPass($a_attribs)),
138  'last_started_pass' => array('integer', $this->fetchLastStartedPass($a_attribs)),
139  'answerstatusfilter' => array('integer', $this->fetchAttribute($a_attribs, 'answer_status_filter')),
140  'objective_container' => array('integer', $this->fetchAttribute($a_attribs, 'objective_container'))
141  ));
142  $this->active_id_mapping[$a_attribs['active_id']] = $next_id;
143  break;
144  case 'tst_test_rnd_qst':
145  $nextId = $ilDB->nextId('tst_test_rnd_qst');
146  $newActiveId = $this->active_id_mapping[$a_attribs['active_fi']];
147  $newQuestionId = $this->question_id_mapping[$a_attribs['question_fi']];
148  $newSrcPoolDefId = $this->src_pool_def_id_mapping[$a_attribs['src_pool_def_fi']];
149  $ilDB->insert('tst_test_rnd_qst', array(
150  'test_random_question_id' => array('integer', $nextId),
151  'active_fi' => array('integer', $newActiveId),
152  'question_fi' => array('integer', $newQuestionId),
153  'sequence' => array('integer', $a_attribs['sequence']),
154  'pass' => array('integer', $a_attribs['pass']),
155  'tstamp' => array('integer', $a_attribs['tstamp']),
156  'src_pool_def_fi' => array('integer', $newSrcPoolDefId)
157  ));
158  break;
159  case 'tst_pass_result':
160  $affectedRows = $ilDB->manipulateF(
161  "INSERT INTO tst_pass_result (active_fi, pass, points, maxpoints, questioncount, answeredquestions, workingtime, tstamp) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
162  array(
163  'integer',
164  'integer',
165  'float',
166  'float',
167  'integer',
168  'integer',
169  'integer',
170  'integer'
171  ),
172  array(
173  $this->active_id_mapping[$a_attribs['active_fi']],
174  strlen($a_attribs['pass']) ? $a_attribs['pass'] : 0,
175  ($a_attribs["points"]) ? $a_attribs["points"] : 0,
176  ($a_attribs["maxpoints"]) ? $a_attribs["maxpoints"] : 0,
177  $a_attribs["questioncount"],
178  $a_attribs["answeredquestions"],
179  ($a_attribs["workingtime"]) ? $a_attribs["workingtime"] : 0,
180  $a_attribs["tstamp"]
181  )
182  );
183  break;
184  case 'tst_result_cache':
185  $affectedRows = $ilDB->manipulateF(
186  "INSERT INTO tst_result_cache (active_fi, pass, max_points, reached_points, mark_short, mark_official, passed, failed, tstamp) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)",
187  array(
188  'integer',
189  'integer',
190  'float',
191  'float',
192  'text',
193  'text',
194  'integer',
195  'integer',
196  'integer'
197  ),
198  array(
199  $this->active_id_mapping[$a_attribs['active_fi']],
200  strlen($a_attribs['pass']) ? $a_attribs['pass'] : 0,
201  ($a_attribs["max_points"]) ? $a_attribs["max_points"] : 0,
202  ($a_attribs["reached_points"]) ? $a_attribs["reached_points"] : 0,
203  strlen($a_attribs["mark_short"]) ? $a_attribs["mark_short"] : " ",
204  strlen($a_attribs["mark_official"]) ? $a_attribs["mark_official"] : " ",
205  ($a_attribs["passed"]) ? 1 : 0,
206  ($a_attribs["failed"]) ? 1 : 0,
207  $a_attribs["tstamp"]
208  )
209  );
210  break;
211  case 'tst_sequence':
212  $affectedRows = $ilDB->insert("tst_sequence", array(
213  "active_fi" => array("integer", $this->active_id_mapping[$a_attribs['active_fi']]),
214  "pass" => array("integer", $a_attribs['pass']),
215  "sequence" => array("clob", $a_attribs['sequence']),
216  "postponed" => array("text", (strlen($a_attribs['postponed'])) ? $a_attribs['postponed'] : null),
217  "hidden" => array("text", (strlen($a_attribs['hidden'])) ? $a_attribs['hidden'] : null),
218  "tstamp" => array("integer", $a_attribs['tstamp'])
219  ));
220  break;
221  case 'tst_solutions':
222  $next_id = $ilDB->nextId('tst_solutions');
223  $affectedRows = $ilDB->insert("tst_solutions", array(
224  "solution_id" => array("integer", $next_id),
225  "active_fi" => array("integer", $this->active_id_mapping[$a_attribs['active_fi']]),
226  "question_fi" => array("integer", $this->question_id_mapping[$a_attribs['question_fi']]),
227  "value1" => array("clob", (strlen($a_attribs['value1'])) ? $a_attribs['value1'] : null),
228  "value2" => array("clob", (strlen($a_attribs['value2'])) ? $a_attribs['value2'] : null),
229  "pass" => array("integer", $a_attribs['pass']),
230  "tstamp" => array("integer", $a_attribs['tstamp'])
231  ));
232  break;
233  case 'tst_test_result':
234  $next_id = $ilDB->nextId('tst_test_result');
235  $affectedRows = $ilDB->manipulateF(
236  "INSERT INTO tst_test_result (test_result_id, active_fi, question_fi, points, pass, manual, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s)",
237  array('integer', 'integer','integer', 'float', 'integer', 'integer','integer'),
238  array($next_id, $this->active_id_mapping[$a_attribs['active_fi']], $this->question_id_mapping[$a_attribs['question_fi']], $a_attribs['points'], $a_attribs['pass'], (strlen($a_attribs['manual'])) ? $a_attribs['manual'] : 0, $a_attribs['tstamp'])
239  );
240  break;
241  case 'tst_times':
242  $next_id = $ilDB->nextId('tst_times');
243  $affectedRows = $ilDB->manipulateF(
244  "INSERT INTO tst_times (times_id, active_fi, started, finished, pass, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
245  array('integer', 'integer', 'timestamp', 'timestamp', 'integer', 'integer'),
246  array($next_id, $this->active_id_mapping[$a_attribs['active_fi']], $a_attribs['started'], $a_attribs['finished'], $a_attribs['pass'], $a_attribs['tstamp'])
247  );
248  break;
249  }
250  break;
251  default:
252  $this->table = $a_name;
253  break;
254  }
255  }
256 
260  public function handlerEndTag($a_xml_parser, $a_name)
261  {
262  switch (strtolower($a_name)) {
263  case "tst_active":
264  global $ilLog;
265  $ilLog->write("active id mapping: " . print_r($this->active_id_mapping, true));
266  break;
267  case "tst_test_question":
268  global $ilLog;
269  $ilLog->write("question id mapping: " . print_r($this->question_id_mapping, true));
270  break;
271  }
272  }
273 
277  public function handlerParseCharacterData($a_xml_parser, $a_data)
278  {
279  // do nothing
280  }
281 
282  private function fetchAttribute($attributes, $name)
283  {
284  if (isset($attributes[$name])) {
285  return $attributes[$name];
286  }
287 
288  return null;
289  }
290 
291  private function fetchLastFinishedPass($attribs)
292  {
293  if (isset($attribs['last_finished_pass'])) {
294  return $attribs['last_finished_pass'];
295  }
296 
297  if ($attribs['tries'] > 0) {
298  return $attribs['tries'] - 1;
299  }
300 
301  return null;
302  }
303 
304  private function fetchLastStartedPass($attribs)
305  {
306  if (isset($attribs['last_started_pass'])) {
307  return $attribs['last_started_pass'];
308  }
309 
310  if ($attribs['tries'] > 0) {
311  return $attribs['tries'] - 1;
312  }
313 
314  return null;
315  }
316 }
setSrcPoolDefIdMapping($src_pool_def_id_mapping)
handlerParseCharacterData($a_xml_parser, $a_data)
handler for character data
$result
$attributes
handlerEndTag($a_xml_parser, $a_name)
handler for end of element
Base class for sax-based expat parsing extended classes need to overwrite the method setHandlers and ...
if($format !==null) $name
Definition: metadata.php:146
handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
handler for begin of element parser
__construct($a_xml_file, &$test_object)
Constructor.
Create styles array
The data for the language used.
global $ilDB
This class gives all kind of DB information using the MDB2 manager and reverse module.
$info
Definition: index.php:5
setHandlers($a_xml_parser)
set event handler should be overwritten by inherited class private