ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
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
11include_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 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 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 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 {
98 case "results":
99 break;
100 case "row":
101 switch ($this->table)
102 {
103 case 'tst_active':
104 if (!$this->user_criteria_checked)
105 {
106 $this->user_criteria_checked = true;
107 if ($ilDB->tableColumnExists('usr_data', $a_attribs['user_criteria']))
108 {
109 include_once './Services/Database/classes/class.ilDBAnalyzer.php';
110 $analyzer = new ilDBAnalyzer();
111 $info = $analyzer->getFieldInformation('usr_data');
112 $this->user_criteria_field = $a_attribs['user_criteria'];
113 $this->user_criteria_type = $info[$a_attribs['user_criteria']]['type'];
114 }
115 }
116 $usr_id = ANONYMOUS_USER_ID;
117 if (strlen($this->user_criteria_field))
118 {
119 $result = $ilDB->queryF("SELECT usr_id FROM usr_data WHERE " . $this->user_criteria_field . " = %s",
120 array($this->user_criteria_type),
121 array($a_attribs[$this->user_criteria_field])
122 );
123 if ($result->numRows())
124 {
125 $row = $ilDB->fetchAssoc($result);
126 $usr_id = $row['usr_id'];
127 }
128 }
129 $next_id = $ilDB->nextId('tst_active');
130
131 $ilDB->insert('tst_active', array(
132 'active_id' => array('integer', $next_id),
133 'user_fi' => array('integer', $usr_id),
134 'anonymous_id' => array('text', strlen($a_attribs['anonymous_id']) ? $a_attribs['anonymous_id'] : NULL),
135 'test_fi' => array('integer', $this->tst_obj->getTestId()),
136 'lastindex' => array('integer', $a_attribs['lastindex']),
137 'tries' => array('integer', $a_attribs['tries']),
138 'submitted' => array('integer', $a_attribs['submitted']),
139 'submittimestamp' => array('timestamp', strlen($a_attribs['submittimestamp']) ? $a_attribs['submittimestamp'] : NULL),
140 'tstamp' => array('integer', $a_attribs['tstamp']),
141 'importname' => array('text', $a_attribs['fullname']),
142 'last_finished_pass' => array('integer', $this->fetchLastFinishedPass($a_attribs)),
143 'last_started_pass' => array('integer', $this->fetchLastStartedPass($a_attribs)),
144 'answerstatusfilter' => array('integer', $this->fetchAttribute($a_attribs, 'answer_status_filter')),
145 'objective_container' => array('integer', $this->fetchAttribute($a_attribs, 'objective_container'))
146 ));
147 $this->active_id_mapping[$a_attribs['active_id']] = $next_id;
148 break;
149 case 'tst_test_rnd_qst':
150 $nextId = $ilDB->nextId('tst_test_rnd_qst');
151 $newActiveId = $this->active_id_mapping[$a_attribs['active_fi']];
152 $newQuestionId = $this->question_id_mapping[$a_attribs['question_fi']];
153 $newSrcPoolDefId = $this->src_pool_def_id_mapping[$a_attribs['src_pool_def_fi']];
154 $ilDB->insert('tst_test_rnd_qst', array(
155 'test_random_question_id' => array('integer', $nextId),
156 'active_fi' => array('integer', $newActiveId),
157 'question_fi' => array('integer', $newQuestionId),
158 'sequence' => array('integer', $a_attribs['sequence']),
159 'pass' => array('integer', $a_attribs['pass']),
160 'tstamp' => array('integer', $a_attribs['tstamp']),
161 'src_pool_def_fi' => array('integer', $newSrcPoolDefId)
162 ));
163 break;
164 case 'tst_pass_result':
165 $affectedRows = $ilDB->manipulateF("INSERT INTO tst_pass_result (active_fi, pass, points, maxpoints, questioncount, answeredquestions, workingtime, tstamp) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
166 array(
167 'integer',
168 'integer',
169 'float',
170 'float',
171 'integer',
172 'integer',
173 'integer',
174 'integer'
175 ),
176 array(
177 $this->active_id_mapping[$a_attribs['active_fi']],
178 strlen($a_attribs['pass']) ? $a_attribs['pass'] : 0,
179 ($a_attribs["points"]) ? $a_attribs["points"] : 0,
180 ($a_attribs["maxpoints"]) ? $a_attribs["maxpoints"] : 0,
181 $a_attribs["questioncount"],
182 $a_attribs["answeredquestions"],
183 ($a_attribs["workingtime"]) ? $a_attribs["workingtime"] : 0,
184 $a_attribs["tstamp"]
185 )
186 );
187 break;
188 case 'tst_result_cache':
189 $affectedRows = $ilDB->manipulateF("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)",
190 array(
191 'integer',
192 'integer',
193 'float',
194 'float',
195 'text',
196 'text',
197 'integer',
198 'integer',
199 'integer'
200 ),
201 array(
202 $this->active_id_mapping[$a_attribs['active_fi']],
203 strlen($a_attribs['pass']) ? $a_attribs['pass'] : 0,
204 ($a_attribs["max_points"]) ? $a_attribs["max_points"] : 0,
205 ($a_attribs["reached_points"]) ? $a_attribs["reached_points"] : 0,
206 strlen($a_attribs["mark_short"]) ? $a_attribs["mark_short"] : " ",
207 strlen($a_attribs["mark_official"]) ? $a_attribs["mark_official"] : " ",
208 ($a_attribs["passed"]) ? 1 : 0,
209 ($a_attribs["failed"]) ? 1 : 0,
210 $a_attribs["tstamp"]
211 )
212 );
213 break;
214 case 'tst_sequence':
215 $affectedRows = $ilDB->insert("tst_sequence", array(
216 "active_fi" => array("integer", $this->active_id_mapping[$a_attribs['active_fi']]),
217 "pass" => array("integer", $a_attribs['pass']),
218 "sequence" => array("clob", $a_attribs['sequence']),
219 "postponed" => array("text", (strlen($a_attribs['postponed'])) ? $a_attribs['postponed'] : NULL),
220 "hidden" => array("text", (strlen($a_attribs['hidden'])) ? $a_attribs['hidden'] : NULL),
221 "tstamp" => array("integer", $a_attribs['tstamp'])
222 ));
223 break;
224 case 'tst_solutions':
225 $next_id = $ilDB->nextId('tst_solutions');
226 $affectedRows = $ilDB->insert("tst_solutions", array(
227 "solution_id" => array("integer", $next_id),
228 "active_fi" => array("integer", $this->active_id_mapping[$a_attribs['active_fi']]),
229 "question_fi" => array("integer", $this->question_id_mapping[$a_attribs['question_fi']]),
230 "value1" => array("clob", (strlen($a_attribs['value1'])) ? $a_attribs['value1'] : NULL),
231 "value2" => array("clob", (strlen($a_attribs['value2'])) ? $a_attribs['value2'] : NULL),
232 "pass" => array("integer", $a_attribs['pass']),
233 "tstamp" => array("integer", $a_attribs['tstamp'])
234 ));
235 break;
236 case 'tst_test_result':
237 $next_id = $ilDB->nextId('tst_test_result');
238 $affectedRows = $ilDB->manipulateF("INSERT INTO tst_test_result (test_result_id, active_fi, question_fi, points, pass, manual, tstamp) VALUES (%s, %s, %s, %s, %s, %s, %s)",
239 array('integer', 'integer','integer', 'float', 'integer', 'integer','integer'),
240 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'])
241 );
242 break;
243 case 'tst_times':
244 $next_id = $ilDB->nextId('tst_times');
245 $affectedRows = $ilDB->manipulateF("INSERT INTO tst_times (times_id, active_fi, started, finished, pass, tstamp) VALUES (%s, %s, %s, %s, %s, %s)",
246 array('integer', 'integer', 'timestamp', 'timestamp', 'integer', 'integer'),
247 array($next_id, $this->active_id_mapping[$a_attribs['active_fi']], $a_attribs['started'], $a_attribs['finished'], $a_attribs['pass'], $a_attribs['tstamp'])
248 );
249 break;
250 }
251 break;
252 default:
253 $this->table = $a_name;
254 break;
255 }
256 }
257
261 function handlerEndTag($a_xml_parser,$a_name)
262 {
263 switch (strtolower($a_name))
264 {
265 case "tst_active":
266 global $ilLog;
267 $ilLog->write("active id mapping: " . print_r($this->active_id_mapping, true));
268 break;
269 case "tst_test_question":
270 global $ilLog;
271 $ilLog->write("question id mapping: " . print_r($this->question_id_mapping, true));
272 break;
273 }
274 }
275
279 function handlerParseCharacterData($a_xml_parser,$a_data)
280 {
281 // do nothing
282 }
283
284 private function fetchAttribute($attributes, $name)
285 {
286 if( isset($attributes[$name]) )
287 {
288 return $attributes[$name];
289 }
290
291 return null;
292 }
293
294 private function fetchLastFinishedPass($attribs)
295 {
296 if( isset($attribs['last_finished_pass']) )
297 {
298 return $attribs['last_finished_pass'];
299 }
300
301 if( $attribs['tries'] > 0 )
302 {
303 return $attribs['tries'] - 1;
304 }
305
306 return null;
307 }
308
309 private function fetchLastStartedPass($attribs)
310 {
311 if( isset($attribs['last_started_pass']) )
312 {
313 return $attribs['last_started_pass'];
314 }
315
316 if( $attribs['tries'] > 0 )
317 {
318 return $attribs['tries'] - 1;
319 }
320
321 return null;
322 }
323}
324?>
$result
An exception for terminatinating execution or to throw for unit testing.
This class gives all kind of DB information using the MDB2 manager and reverse module.
Base class for sax-based expat parsing extended classes need to overwrite the method setHandlers and ...
setHandlers($a_xml_parser)
set event handler should be overwritten by inherited class @access private
handlerBeginTag($a_xml_parser, $a_name, $a_attribs)
handler for begin of element parser
handlerParseCharacterData($a_xml_parser, $a_data)
handler for character data
setSrcPoolDefIdMapping($src_pool_def_id_mapping)
__construct($a_xml_file, &$test_object)
Constructor.
handlerEndTag($a_xml_parser, $a_name)
handler for end of element
$info
Definition: example_052.php:80
global $ilDB