/** * Displays the view home. * * @param \mod_activequiz\forms\view\student_start_form $studentstartform * @param \mod_activequiz\activequiz_session $session The activequiz session object to call methods on */ public function view_student_home($studentstartform, $session) { global $USER; echo html_writer::start_div('activequizbox'); if ($session->get_session()) { // check if there is an open session // if we have an existing session show the join quiz button $joinquiz = clone $this->pageurl; $joinquiz->param('action', 'quizstart'); echo html_writer::tag('p', get_string('joinquizinstructions', 'activequiz')); echo html_writer::tag('p', get_string('sessionnametext', 'activequiz') . $session->get_session()->name); // see if the user has attempts, if so, let them know that continuing will continue them to their attempt if ($session->get_open_attempt_for_current_user()) { echo html_writer::tag('p', get_string('attemptstarted', 'activequiz'), array('id' => 'quizinfobox')); } // add the student join quiz form $studentstartform->display(); } else { echo html_writer::tag('p', get_string('quiznotrunning', 'activequiz')); // show a reload page button to make it easy to reload page $reloadbutton = $this->output->single_button($this->pageurl, get_string('reload'), 'get'); echo html_writer::tag('p', $reloadbutton); } echo html_writer::end_div(); if (count($this->rtq->get_closed_sessions()) == 0) { return; // return early if there are no closed sessions } echo html_writer::start_div('activequizbox'); // show overall grade $a = new stdClass(); $usergrades = \mod_activequiz\utils\grade::get_user_grade($this->rtq->getRTQ(), $USER->id); // should only be 1 grade, but we'll always get end() if (!empty($usergrades)) { $usergrade = end($usergrades); $a->overallgrade = number_format($usergrade->rawgrade, 2); $a->scale = $this->rtq->getRTQ()->scale; echo html_writer::start_tag('h3'); echo get_string('overallgrade', 'activequiz', $a); echo html_writer::end_tag('h3'); } else { return; // if no user grade there are no attempts for this user } // show attempts table if rtq is set up to show attempts in the after review options if ($this->rtq->get_review_options('after')->attempt == 1) { echo html_writer::tag('h3', get_string('attempts', 'activequiz')); $viewownattemptstable = new \mod_activequiz\tableviews\ownattempts('viewownattempts', $this->rtq, $this->pageurl); $viewownattemptstable->setup(); $viewownattemptstable->set_data(); $viewownattemptstable->finish_output(); } echo html_writer::end_div(); }
/** * 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; } }