00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 include_once "./Modules/Test/classes/inc.AssessmentConstants.php";
00025
00035 class ASS_MarkSchema
00036 {
00044 var $mark_steps;
00045
00053 function ASS_MarkSchema()
00054 {
00055 $this->mark_steps = array();
00056 }
00057
00075 function createSimpleSchema(
00076 $txt_failed_short = "failed",
00077 $txt_failed_official = "failed",
00078 $percentage_failed = 0,
00079 $failed_passed = 0,
00080 $txt_passed_short = "passed",
00081 $txt_passed_official = "passed",
00082 $percentage_passed = 50,
00083 $passed_passed = 1
00084 )
00085 {
00086 $this->flush();
00087 $this->addMarkStep($txt_failed_short, $txt_failed_official, $percentage_failed, $failed_passed);
00088 $this->addMarkStep($txt_passed_short, $txt_passed_official, $percentage_passed, $passed_passed);
00089 }
00090
00104 function addMarkStep(
00105 $txt_short = "",
00106 $txt_official = "",
00107 $percentage = 0,
00108 $passed = 0
00109 )
00110 {
00111 include_once "./Modules/Test/classes/class.assMark.php";
00112 $mark = new ASS_Mark($txt_short, $txt_official, $percentage, $passed);
00113 array_push($this->mark_steps, $mark);
00114 }
00115
00124 function saveToDb($test_id)
00125 {
00126 global $lng;
00127 global $ilDB;
00128
00129 $oldmarks = array();
00130 include_once "./classes/class.ilObjAssessmentFolder.php";
00131 if (ilObjAssessmentFolder::_enabledAssessmentLogging())
00132 {
00133 $query = sprintf("SELECT * FROM tst_mark WHERE test_fi = %s ORDER BY minimum_level",
00134 $ilDB->quote($test_id)
00135 );
00136 $result = $ilDB->query($query);
00137 if ($result->numRows())
00138 {
00139 while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC))
00140 {
00141 $oldmarks[$row["minimum_level"]] = $row;
00142 }
00143 }
00144 }
00145
00146 if (!$test_id) return;
00147
00148 $query = sprintf("DELETE FROM tst_mark WHERE test_fi = %s",
00149 $ilDB->quote($test_id)
00150 );
00151 $result = $ilDB->query($query);
00152 if (count($this->mark_steps) == 0) return;
00153
00154
00155 foreach ($this->mark_steps as $key => $value)
00156 {
00157 $query = sprintf("INSERT INTO tst_mark (mark_id, test_fi, short_name, official_name, minimum_level, passed, TIMESTAMP) VALUES (NULL, %s, %s, %s, %s, %s, NULL)",
00158 $ilDB->quote($test_id),
00159 $ilDB->quote($value->getShortName()),
00160 $ilDB->quote($value->getOfficialName()),
00161 $ilDB->quote($value->getMinimumLevel()),
00162 $ilDB->quote(sprintf("%d", $value->getPassed()))
00163 );
00164 $result = $ilDB->query($query);
00165 if ($result == DB_OK) {
00166 }
00167 }
00168 if (ilObjAssessmentFolder::_enabledAssessmentLogging())
00169 {
00170 $query = sprintf("SELECT * FROM tst_mark WHERE test_fi = %s ORDER BY minimum_level",
00171 $ilDB->quote($test_id)
00172 );
00173 $result = $ilDB->query($query);
00174 $newmarks = array();
00175 if ($result->numRows())
00176 {
00177 while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC))
00178 {
00179 $newmarks[$row["minimum_level"]] = $row;
00180 }
00181 }
00182 foreach ($oldmarks as $level => $row)
00183 {
00184 if (array_key_exists($level, $newmarks))
00185 {
00186 $difffields = array();
00187 foreach ($row as $key => $value)
00188 {
00189 if (strcmp($value, $newmarks[$level][$key]) != 0)
00190 {
00191 switch ($key)
00192 {
00193 case "mark_id":
00194 case "TIMESTAMP":
00195 break;
00196 default:
00197 array_push($difffields, "$key: $value => " .$newmarks[$level][$key]);
00198 break;
00199 }
00200 }
00201 }
00202 if (count($difffields))
00203 {
00204 $this->logAction($test_id, $lng->txtlng("assessment", "log_mark_changed", ilObjAssessmentFolder::_getLogLanguage()) . ": " . join($difffields, ", "));
00205 }
00206 }
00207 else
00208 {
00209 $this->logAction($test_id, $lng->txtlng("assessment", "log_mark_removed", ilObjAssessmentFolder::_getLogLanguage()) . ": " .
00210 $lng->txtlng("assessment", "tst_mark_minimum_level", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["minimum_level"] . ", " .
00211 $lng->txtlng("assessment", "tst_mark_short_form", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["short_name"] . ", " .
00212 $lng->txtlng("assessment", "tst_mark_official_form", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["official_name"] . ", " .
00213 $lng->txtlng("assessment", "tst_mark_passed", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["passed"]);
00214 }
00215 }
00216 foreach ($newmarks as $level => $row)
00217 {
00218 if (!array_key_exists($level, $oldmarks))
00219 {
00220 $this->logAction($test_id, $lng->txtlng("assessment", "log_mark_added", ilObjAssessmentFolder::_getLogLanguage()) . ": " .
00221 $lng->txtlng("assessment", "tst_mark_minimum_level", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["minimum_level"] . ", " .
00222 $lng->txtlng("assessment", "tst_mark_short_form", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["short_name"] . ", " .
00223 $lng->txtlng("assessment", "tst_mark_official_form", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["official_name"] . ", " .
00224 $lng->txtlng("assessment", "tst_mark_passed", ilObjAssessmentFolder::_getLogLanguage()) . " = " . $row["passed"]);
00225 }
00226 }
00227 }
00228 }
00229
00238 function loadFromDb($test_id)
00239 {
00240 global $ilDB;
00241
00242 if (!$test_id) return;
00243 $query = sprintf("SELECT * FROM tst_mark WHERE test_fi = %s ORDER BY minimum_level",
00244 $ilDB->quote($test_id)
00245 );
00246
00247 $result = $ilDB->query($query);
00248 if (strcmp(strtolower(get_class($result)), db_result) == 0) {
00249 while ($data = $result->fetchRow(DB_FETCHMODE_OBJECT)) {
00250 $this->addMarkStep($data->short_name, $data->official_name, $data->minimum_level, $data->passed);
00251 }
00252 }
00253 }
00254
00263 function flush() {
00264 $this->mark_steps = array();
00265 }
00266
00275 function sort() {
00276 function level_sort($a, $b) {
00277 if ($a->getMinimumLevel() == $b->getMinimumLevel()) {
00278 $res = strcmp($a->getShortName(), $b->getShortName());
00279 if ($res == 0) {
00280 return strcmp($a->getOfficialName(), $b->getOfficialName());
00281 } else {
00282 return $res;
00283 }
00284 }
00285 return ($a->getMinimumLevel() < $b->getMinimumLevel()) ? -1 : 1;
00286 }
00287
00288 usort($this->mark_steps, 'level_sort');
00289 }
00290
00300 function deleteMarkStep($index = 0) {
00301 if ($index < 0) return;
00302 if (count($this->mark_steps) < 1) return;
00303 if ($index >= count($this->mark_steps)) return;
00304 unset($this->mark_steps[$index]);
00305 $this->mark_steps = array_values($this->mark_steps);
00306 }
00307
00317 function deleteMarkSteps($indexes) {
00318 foreach ($indexes as $key => $index) {
00319 if (!(($index < 0) or (count($this->mark_steps) < 1))) {
00320 unset($this->mark_steps[$index]);
00321 }
00322 }
00323 $this->mark_steps = array_values($this->mark_steps);
00324 }
00325
00336 function getMatchingMark($percentage) {
00337 for ($i = count($this->mark_steps) - 1; $i >= 0; $i--) {
00338 if ($percentage >= $this->mark_steps[$i]->getMinimumLevel()) {
00339 return $this->mark_steps[$i];
00340 }
00341 }
00342 return false;
00343 }
00344
00356 function _getMatchingMark($test_id, $percentage)
00357 {
00358 global $ilDB;
00359 $query = sprintf("SELECT * FROM tst_mark WHERE test_fi = %s ORDER BY minimum_level DESC",
00360 $ilDB->quote($test_id . "")
00361 );
00362 $result = $ilDB->query($query);
00363 while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC))
00364 {
00365 if ($percentage >= $row["minimum_level"])
00366 {
00367 return $row;
00368 }
00369 }
00370 return FALSE;
00371 }
00372
00384 function _getMatchingMarkFromObjId($a_obj_id, $percentage)
00385 {
00386 global $ilDB;
00387 $query = sprintf("SELECT tst_mark.* FROM tst_mark, tst_tests WHERE tst_mark.test_fi = tst_tests.test_id AND tst_tests.obj_fi = %s ORDER BY minimum_level DESC",
00388 $ilDB->quote($a_obj_id . "")
00389 );
00390 $result = $ilDB->query($query);
00391 while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC))
00392 {
00393 if ($percentage >= $row["minimum_level"])
00394 {
00395 return $row;
00396 }
00397 }
00398 return FALSE;
00399 }
00400
00410 function checkMarks()
00411 {
00412 $minimum_percentage = 100;
00413 $passed = 0;
00414 for ($i = 0; $i < count($this->mark_steps); $i++) {
00415 if ($this->mark_steps[$i]->getMinimumLevel() < $minimum_percentage)
00416 {
00417 $minimum_percentage = $this->mark_steps[$i]->getMinimumLevel();
00418 }
00419 if ($this->mark_steps[$i]->getPassed())
00420 {
00421 $passed++;
00422 }
00423 }
00424 if ($minimum_percentage != 0)
00425 {
00426 return "min_percentage_ne_0";
00427 }
00428 if ($passed == 0)
00429 {
00430 return "no_passed_mark";
00431 }
00432 return true;
00433 }
00434
00444 function logAction($test_id, $logtext = "")
00445 {
00446 global $ilUser;
00447 include_once "./classes/class.ilObjAssessmentFolder.php";
00448 ilObjAssessmentFolder::_addLog($ilUser->id, ilObjTest::_getObjectIDFromTestID($test_id), $logtext, "", "", TRUE, $_GET["ref_id"]);
00449 }
00450 }
00451
00452 ?>