Ejemplo n.º 1
0
 /**
  * Deletes a question and all materials from the database
  *
  * @param integer $question_id The database id of the question
  * @access private
  */
 public function delete($question_id)
 {
     global $ilDB, $ilLog;
     if ($question_id < 1) {
         return true;
     }
     // nothing to do
     $result = $ilDB->queryF("SELECT obj_fi FROM qpl_questions WHERE question_id = %s", array('integer'), array($question_id));
     if ($result->numRows() == 1) {
         $row = $ilDB->fetchAssoc($result);
         $obj_id = $row["obj_fi"];
     } else {
         return true;
         // nothing to do
     }
     try {
         $this->deletePageOfQuestion($question_id);
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Could not delete page of question {$question_id}: {$e}");
         return false;
     }
     $affectedRows = $ilDB->manipulateF("DELETE FROM qpl_questions WHERE question_id = %s", array('integer'), array($question_id));
     if ($affectedRows == 0) {
         return false;
     }
     try {
         $this->deleteAdditionalTableData($question_id);
         $this->deleteAnswers($question_id);
         $this->feedbackOBJ->deleteGenericFeedbacks($question_id, $this->isAdditionalContentEditingModePageObject());
         $this->feedbackOBJ->deleteSpecificAnswerFeedbacks($question_id, $this->isAdditionalContentEditingModePageObject());
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Could not delete additional table data of question {$question_id}: {$e}");
         return false;
     }
     try {
         // delete the question in the tst_test_question table (list of test questions)
         $affectedRows = $ilDB->manipulateF("DELETE FROM tst_test_question WHERE question_fi = %s", array('integer'), array($question_id));
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Could not delete delete question {$question_id} from a test: {$e}");
         return false;
     }
     try {
         // delete suggested solutions contained in the question
         $affectedRows = $ilDB->manipulateF("DELETE FROM qpl_sol_sug WHERE question_fi = %s", array('integer'), array($question_id));
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Could not delete suggested solutions of question {$question_id}: {$e}");
         return false;
     }
     try {
         $directory = CLIENT_WEB_DIR . "/assessment/" . $obj_id . "/{$question_id}";
         if (preg_match("/\\d+/", $obj_id) and preg_match("/\\d+/", $question_id) and is_dir($directory)) {
             include_once "./Services/Utilities/classes/class.ilUtil.php";
             ilUtil::delDir($directory);
         }
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Could not delete question file directory {$directory} of question {$question_id}: {$e}");
         return false;
     }
     try {
         include_once "./Services/MediaObjects/classes/class.ilObjMediaObject.php";
         $mobs = ilObjMediaObject::_getMobsOfObject("qpl:html", $question_id);
         // remaining usages are not in text anymore -> delete them
         // and media objects (note: delete method of ilObjMediaObject
         // checks whether object is used in another context; if yes,
         // the object is not deleted!)
         foreach ($mobs as $mob) {
             ilObjMediaObject::_removeUsage($mob, "qpl:html", $question_id);
             if (ilObjMediaObject::_exists($mob)) {
                 $mob_obj =& new ilObjMediaObject($mob);
                 $mob_obj->delete();
             }
         }
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Error deleting the media objects of question {$question_id}: {$e}");
         return false;
     }
     require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
     ilAssQuestionHintTracking::deleteRequestsByQuestionIds(array($question_id));
     require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintList.php';
     ilAssQuestionHintList::deleteHintsByQuestionIds(array($question_id));
     require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionSkillAssignmentList.php';
     $assignmentList = new ilAssQuestionSkillAssignmentList($ilDB);
     $assignmentList->setParentObjId($obj_id);
     $assignmentList->setQuestionIdFilter($question_id);
     $assignmentList->loadFromDb();
     foreach ($assignmentList->getAssignmentsByQuestionId($question_id) as $assignment) {
         /* @var ilAssQuestionSkillAssignment $assignment */
         $assignment->deleteFromDb();
     }
     try {
         // update question count of question pool
         include_once "./Modules/TestQuestionPool/classes/class.ilObjQuestionPool.php";
         ilObjQuestionPool::_updateQuestionCount($this->getObjId());
     } catch (Exception $e) {
         $ilLog->write("EXCEPTION: Error updating the question pool question count of question pool " . $this->getObjId() . " when deleting question {$question_id}: {$e}");
         return false;
     }
     $this->notifyQuestionDeleted($this);
     return true;
 }