示例#1
0
 public function getQuiz()
 {
     return Model_Quiz_Quiz::fromID($this->quizquiz_id);
 }
 /**
  * This action is the quiz shell.
  * It ensures permissions, creates new attempts etc etc.
  *
  * @author Ben Evans
  */
 public function attemptAction()
 {
     Model_Shell_Debug::getInstance()->log("User Entered the Attempt Action");
     $identity = Zend_Auth::getInstance()->getIdentity();
     $username = $identity->username;
     $auth_model = Model_Auth_General::getAuthModel();
     /*	Before we do anything, test to make sure we've passed a VALID QUIZ which WE ARE ENTITLED to sit.	*/
     $quiz_id = $this->_getParam("quiz");
     if (is_null($quiz_id)) {
         throw new Exception("No quiz was passed. Cannot continue.");
     }
     $vQuiz = Model_Quiz_Quiz::fromID($quiz_id);
     if ($vQuiz == null) {
         throw new Exception("Quiz ID passed was invalid. Cannot continue.");
     }
     $mFinished = false;
     $mMarking = false;
     //Permissions
     if ($auth_model->userInGroup($username, $vQuiz->getPermissions_group()) && $vQuiz->getOpen_date() <= strtotime("now")) {
         //Have we run out of attempts?
         $vAttempts = Model_Quiz_QuizAttempt::getAllFromUser($username, $vQuiz);
         if (sizeof($vAttempts) >= $vQuiz->getMax_attempts()) {
             //It is possible that we're on our last attempt, and that it's "in progress"...check
             $bInProgress = false;
             foreach ($vAttempts as $vAttempt) {
                 if ($vAttempt->getDate_finished() == null) {
                     $bInProgress = true;
                 }
             }
             if (!$bInProgress) {
                 throw new Exception("You've exceeded your maximum attempts for this quiz. Cannot continue");
             }
         }
     } else {
         if (!$this->view->is_admin) {
             throw new Exception("Insufficient Permissions to take this quiz / Quiz not open yet");
         }
         $vAttempts = Model_Quiz_QuizAttempt::getAllFromUser($username, $vQuiz);
     }
     /*	Ok. We're allowed to TAKE the quiz. Are we resuming, or starting a new one? */
     $mQuizAttempt = null;
     if (is_array($vAttempts)) {
         foreach ($vAttempts as $vAttempt) {
             if ($vAttempt->getDate_finished() == null) {
                 $mQuizAttempt = $vAttempt;
                 break;
             }
         }
         //End Foreach
     }
     //End If
     if ($mQuizAttempt == null) {
         $mQuizAttempt = Model_Quiz_QuizAttempt::fromScratch(strtotime("now"), $vQuiz, $username);
     }
     /* Calculate the total questions needed for this quiz */
     $vTCs = $vQuiz->getTestedConcepts();
     $vTotalQuestions = 0;
     foreach ($vTCs as $vTC) {
         $vTotalQuestions = $vTotalQuestions + $vTC->getNumber_tested();
     }
     /*	We have our quizAttempt ready to go. Now we look to see if we're resuming a question or not */
     $mQuestionAttempt = $mQuizAttempt->getLastIncompleteQuestion();
     if (is_object($mQuestionAttempt) && !$mQuestionAttempt->isValid()) {
         $mQuestionAttempt->destroy();
         // Remove the Question attempt (Database was reinitialised or something)
         $mQuestionAttempt = null;
     }
     if ($mQuestionAttempt != null) {
         /*	Are we getting an ANSWER for this question? */
         if (array_key_exists("marking", $_POST) && $_POST['marking'] == "1") {
             /*	Mark it */
             $mMarking = true;
         }
         /* If we reach here, the page has probably been refreshed. We just re-display the last question */
     } else {
         /* Have we finished this quiz? */
         if ($mQuizAttempt->getQuestionAttemptCount() >= $vTotalQuestions) {
             //Close this attempt and display a result later on down the page
             $mQuizAttempt->setDate_finished(strtotime("now"));
             //Calculate and store the final score
             $mQuizAttempt->setTotal_score($mQuizAttempt->getTotal_score());
             $mFinished = true;
         } else {
             /*	QuizAttempt isn't finished... Fetch a questionBase */
             $vQuestionBase = Model_Shell_QuestionChooser::select_next_question($mQuizAttempt, true);
             /* Make a GeneratedQuestion */
             $vCounter = 0;
             //Make sure we don't get any fluke no-text answers
             while ($vCounter < 3) {
                 Model_Shell_Debug::getInstance()->log("vQuestionBase: " . isset($vQuestionBase));
                 Model_Shell_Debug::getInstance()->log("Generating... from " . $vQuestionBase->getXml());
                 $vGen = Model_Quiz_GeneratedQuestion::fromQuestionBase($vQuestionBase);
                 if ($vGen->getCorrect_answer() != "" && $vGen->getCorrect_answer() != "\r\n") {
                     break;
                 } else {
                     $vGen->remove();
                 }
                 $vCounter++;
             }
             if ($vGen->getCorrect_answer() == "" || $vGen->getCorrect_answer() == "\r\n") {
                 throw new Exception("Error. While generating a question for you, blank answers appeared > 3 times. This should never happen. Either try to refresh this page, or consult your lecturer...");
             }
             /* Make a QuestionAttempt */
             $mQuestionAttempt = Model_Quiz_QuestionAttempt::fromScratch($vQuestionBase, strtotime("now"), strtotime("now"), $mQuizAttempt, $vGen);
         }
         //End-if_finished_quizAttempt
     }
     // Pass all relevant information to the view
     $this->view->quiz = $vQuiz;
     $this->view->question_attempt = $mQuestionAttempt;
     $this->view->finished = $mFinished;
     $this->view->marking = $mMarking;
     $this->view->mQuizAttempt = $mQuizAttempt;
     $this->view->vTotalQuestions = $vTotalQuestions;
 }
示例#3
0
 protected function findQuiz($quiz_id)
 {
     if (is_null($quiz_id)) {
         throw new Exception("No quiz was passed. Cannot continue.");
     }
     $quiz = Model_Quiz_Quiz::fromID($quiz_id);
     if ($quiz == null) {
         throw new Exception("Quiz ID passed was invalid. Cannot continue.");
     }
     return $quiz;
 }
示例#4
0
文件: Quiz.php 项目: sutantyo/itec810
 function hasPendingPrerequisite($username)
 {
     $prereq = $this->getPrerequisite();
     if (!$prereq) {
         return false;
     }
     $prereq_question = Model_Quiz_Quiz::fromID($prereq);
     // have the user attempted the prerequisites?
     $attempt = Model_Quiz_QuizAttempt::fromQuizAndUser($prereq, $username);
     if (!$attempt) {
         return true;
         //prerequisite has not even been attempted
     }
     // if yes, of all the attempts, has the best score passed the quiz requirement?
     if ($attempt->getDate_finished()) {
         $best_attempt = Model_Quiz_QuizAttempt::getHighestMarkQuiz($username, $prereq_question);
         return !$best_attempt->hasPassedQuiz();
     }
     return true;
     /*
     		if ($attempt->getDate_finished()==null){
     			$vQuizStatus = Model_Quiz_Quiz::QUIZ_INPROGRESS;
     			if($vQuiz->getClose_date() < strtotime("now")){
     				echo "\t\t<td>In Progress (Late)</td>\n";
     			}
     			else{
     				echo "\t\t<td>In Progress</td>\n";
     			}
     
     		}else{
     			$vQuizStatus = Model_Quiz_Quiz::QUIZ_COMPLETED;
     			echo "\t\t<td>Completed</td>\n";
     		}
     */
 }
示例#5
0
 /**
  * This shows the results of an individual quiz,
  * It works by going through all the People in the Quizzes
  * primary Active Directory group, and then seeing if their
  * account has an attempt associated with it.
  */
 public function resultsquizAction()
 {
     $quiz_id = $this->_getParam("quiz_id");
     if (!isset($quiz_id)) {
         throw new Exception("No Quiz Identifier Passed", 3000);
     }
     $quiz = Model_Quiz_Quiz::fromID($quiz_id);
     if (is_null($quiz) || $quiz === false) {
         throw new Exception("Invalid Quiz Identifier", 3000);
     }
     // Pass the quiz (for general information)
     $this->view->quiz = $quiz;
     // Start By Populating an array with the Group information
     $results = array();
     $group_members = Model_Auth_ActiveDirectory::getUsersFromGroup($quiz->getPermissions_group());
     foreach ($group_members as $gm) {
         $results[$gm] = array();
     }
     unset($group_members);
     // At this point, we have an array with keys being the username
     foreach ($results as $name => &$result) {
         // Get the User's First and Last Name
         $details = Model_Auth_ActiveDirectory::getUserDetails($name);
         $result['first_name'] = $details['first_name'];
         $result['last_name'] = $details['last_name'];
         $result['username'] = $name;
         //Get the verdict / best score...
         $vHighest = Model_Quiz_QuizAttempt::getHighestMarkQuiz($name, $quiz);
         // Will be null if not completed, Model_Quiz_QuizAttempt otherwise
         if (!is_null($vHighest)) {
             // Get their finish date
             $result['completion_date'] = $vHighest->getDate_finished();
             //Is this 'highest' attempt still in progress?
             if ($vHighest->getDate_finished() == null) {
                 $result['verdict'] = "<span class='orange'>In Progress</span>";
             } else {
                 // Completed
                 //Did they pass/fail?
                 if ($vHighest->getTotal_score() / $quiz->getTotalQuestions() * 100 >= $quiz->getPercentage_pass()) {
                     $result['verdict'] = "<span class='green'>PASS</span>";
                 } else {
                     $result['verdict'] = "<span class='red'>FAIL</span>";
                 }
             }
             // Best Score
             $result['best_score'] = $vHighest->getTotal_score();
             // Attempts
             $result['attempts'] = sizeof(Model_Quiz_QuizAttempt::getAllFromUser($name, $quiz));
         }
     }
     $this->view->results = $results;
 }
示例#6
0
 public static function getAll($vOrder = false)
 {
     $db = Zend_Registry::get("db");
     $vReturn = array();
     $sql = "SELECT * FROM quiz";
     if ($vOrder) {
         $sql .= " ORDER BY close_date";
     }
     //echo "SQL: $sql<br/>";
     $result = $db->query($sql);
     $rows = $result->fetchAll();
     foreach ($rows as $row) {
         $vReturn[] = Model_Quiz_Quiz::fromID($row['quiz_id']);
     }
     return $vReturn;
 }