Exemplo n.º 1
0
 /**
  * Handle's the page request
  *
  */
 public function handle_request()
 {
     global $DB, $USER, $PAGE;
     // first check if there are questions or not.  If there are no questions display that message instead,
     // regardless of action.
     if (count($this->RTQ->get_questionmanager()->get_questions()) === 0) {
         $this->pagevars['action'] = 'noquestions';
         $this->pageurl->param('action', '');
         // remove the action
     }
     switch ($this->pagevars['action']) {
         case 'noquestions':
             $this->RTQ->get_renderer()->view_header();
             $this->RTQ->get_renderer()->no_questions($this->RTQ->is_instructor());
             $this->RTQ->get_renderer()->view_footer();
             break;
         case 'quizstart':
             // case for the quiz start landing page
             // set the quiz view page to the base layout for 1 column layout
             $PAGE->set_pagelayout('base');
             if ($this->session->get_session() === false) {
                 // redirect them to the default page with a quick message first
                 $redirurl = clone $this->pageurl;
                 $redirurl->remove_params('action');
                 redirect($redirurl, get_string('nosession', 'activequiz'), 5);
             } else {
                 // this is here to help prevent race conditions for multiple group members trying to take the
                 // quiz at the same time
                 $cantakequiz = false;
                 if ($this->RTQ->group_mode()) {
                     if (!$this->RTQ->is_instructor() && $this->pagevars['group'] == 0) {
                         print_error('invalidgroupid', 'mod_activequiz');
                     }
                     // check if the user can take the quiz for the group
                     if ($this->session->can_take_quiz_for_group($this->pagevars['group'])) {
                         $cantakequiz = true;
                     }
                 } else {
                     // if no group mode, user will always be able to take quiz
                     $cantakequiz = true;
                 }
                 if ($cantakequiz) {
                     if (!$this->session->init_attempts($this->RTQ->is_instructor(), $this->pagevars['group'], $this->pagevars['groupmembers'])) {
                         print_error('cantinitattempts', 'activequiz');
                     }
                     // set the session as running
                     if ($this->RTQ->is_instructor() && $this->session->get_session()->status == 'notrunning') {
                         $this->session->set_status('running');
                     }
                     // get the current attempt an initialize the head contributions
                     $attempt = $this->session->get_open_attempt();
                     $attempt->get_html_head_contributions();
                     $attempt->setStatus('inprogress');
                     // now show the quiz start landing page
                     $this->RTQ->get_renderer()->view_header(true);
                     $this->RTQ->get_renderer()->render_quiz($attempt, $this->session);
                     $this->RTQ->get_renderer()->view_footer();
                 } else {
                     $this->RTQ->get_renderer()->view_header();
                     $this->RTQ->get_renderer()->group_session_started();
                     $this->RTQ->get_renderer()->view_footer();
                 }
             }
             break;
         case 'selectgroupmembers':
             if (empty($this->pagevars['group'])) {
                 $viewhome = clone $this->pageurl;
                 $viewhome->remove_params('action');
                 redirect($viewhome, get_string('invalid_group_selected', 'activequiz'), 5);
             } else {
                 $this->pageurl->param('group', $this->pagevars['group']);
                 $groupselectform = new \mod_activequiz\forms\view\groupselectmembers($this->pageurl, array('rtq' => $this->RTQ, 'selectedgroup' => $this->pagevars['group']));
                 if ($data = $groupselectform->get_data()) {
                     // basically we want to get all gm* fields
                     $gmemnum = 1;
                     $groupmembers = array();
                     $data = get_object_vars($data);
                     while (isset($data['gm' . $gmemnum])) {
                         if ($data['gm' . $gmemnum] != 0) {
                             $groupmembers[] = $data['gm' . $gmemnum];
                         }
                         $gmemnum++;
                     }
                     $this->pageurl->param('groupmembers', implode(',', $groupmembers));
                     $this->pageurl->param('action', 'quizstart');
                     // redirect to the quiz start page
                     redirect($this->pageurl, null, 0);
                 } else {
                     $this->RTQ->get_renderer()->view_header();
                     $this->RTQ->get_renderer()->group_member_select($groupselectform);
                     $this->RTQ->get_renderer()->view_footer();
                 }
             }
             break;
         default:
             // default is to show view to start quiz (for instructors/quiz controllers) or join quiz (for everyone else)
             // trigger event for course module viewed
             $event = \mod_activequiz\event\course_module_viewed::create(array('objectid' => $PAGE->cm->instance, 'context' => $PAGE->context));
             $event->add_record_snapshot('course', $this->RTQ->getCourse());
             $event->add_record_snapshot($PAGE->cm->modname, $this->RTQ->getRTQ());
             $event->trigger();
             // determine home display based on role
             if ($this->RTQ->is_instructor()) {
                 $startsessionform = new \mod_activequiz\forms\view\start_session($this->pageurl);
                 if ($data = $startsessionform->get_data()) {
                     // create a new quiz session
                     // first check to see if there are any open sessions
                     // this shouldn't occur, but never hurts to check
                     $sessions = $DB->get_records('activequiz_sessions', array('activequizid' => $this->RTQ->getRTQ()->id, 'sessionopen' => 1));
                     if (!empty($sessions)) {
                         // error out with that there are existing sessions
                         $this->RTQ->get_renderer()->setMessage(get_string('alreadyexisting_sessions', 'activequiz'), 'error');
                         $this->RTQ->get_renderer()->view_header();
                         $this->RTQ->get_renderer()->view_inst_home($startsessionform, $this->session->get_session());
                         $this->RTQ->get_renderer()->view_footer();
                         break;
                     } else {
                         if (!$this->session->create_session($data->sessionname)) {
                             // error handling
                             $this->RTQ->get_renderer()->setMessage(get_string('unabletocreate_session', 'activequiz'), 'error');
                             $this->RTQ->get_renderer()->view_header();
                             $this->RTQ->get_renderer()->view_inst_home($startsessionform, $this->session->get_session());
                             $this->RTQ->get_renderer()->view_footer();
                             break;
                             // break out of the switch
                         }
                     }
                     // redirect to the quiz start
                     $quizstarturl = clone $this->pageurl;
                     $quizstarturl->param('action', 'quizstart');
                     redirect($quizstarturl, null, 0);
                 } else {
                     $this->RTQ->get_renderer()->view_header();
                     $this->RTQ->get_renderer()->view_inst_home($startsessionform, $this->session->get_session());
                     $this->RTQ->get_renderer()->view_footer();
                 }
             } else {
                 // check to see if the group already started a quiz
                 $validgroups = array();
                 if ($this->RTQ->group_mode()) {
                     // if there is already an attempt for this session for this group for this user don't allow them to start another
                     $validgroups = $this->session->check_attempt_for_group();
                     if (empty($validgroups) && $validgroups !== false) {
                         $this->RTQ->get_renderer()->view_header();
                         $this->RTQ->get_renderer()->group_session_started();
                         $this->RTQ->get_renderer()->view_footer();
                         break;
                     } else {
                         if ($validgroups === false) {
                             $validgroups = array();
                         }
                     }
                 }
                 $studentstartformparams = array('rtq' => $this->RTQ, 'validgroups' => $validgroups);
                 $studentstartform = new \mod_activequiz\forms\view\student_start_form($this->pageurl, $studentstartformparams);
                 if ($data = $studentstartform->get_data()) {
                     $quizstarturl = clone $this->pageurl;
                     $quizstarturl->param('action', 'quizstart');
                     // if data redirect to the quiz start url with the group selected if we're in group mode
                     if ($this->RTQ->group_mode()) {
                         $groupid = $data->group;
                         $quizstarturl->param('group', $groupid);
                         // check if the group attendance feature is enabled
                         // if so redirect to the group member select form
                         // don't send to group attendance form if an attempt is already started
                         if ($this->RTQ->getRTQ()->groupattendance == 1 && !$this->session->get_open_attempt_for_current_user()) {
                             $quizstarturl->param('action', 'selectgroupmembers');
                         }
                         redirect($quizstarturl, null, 0);
                     } else {
                         redirect($quizstarturl, null, 0);
                     }
                 } else {
                     // display student home.  (form will display only if there is an active session
                     $this->RTQ->get_renderer()->view_header();
                     $this->RTQ->get_renderer()->view_student_home($studentstartform, $this->session);
                     $this->RTQ->get_renderer()->view_footer();
                 }
             }
             break;
     }
 }