AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>.namespace mod_questionnaire\output;use mod_questionnaire\responsetype\response\response;/*** Mobile output class for mod_questionnaire.** @package mod_questionnaire* @copyright 2016 Mike Churchward (mike.churchward@poetgroup.org)* @author Mike Churchward* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class mobile {/*** Returns the initial page when viewing the activity for the mobile app.** @param array $args Arguments from tool_mobile_get_content WS* @return array HTML, javascript and other data*/public static function mobile_view_activity($args) {global $OUTPUT, $USER, $CFG, $DB;require_once($CFG->dirroot.'/mod/questionnaire/questionnaire.class.php');$args = (object) $args;$versionname = $args->appversioncode >= 3950 ? 'latest' : 'ionic3';$cmid = $args->cmid;$rid = isset($args->rid) ? $args->rid : 0;$action = isset($args->action) ? $args->action : 'index';$pagenum = (isset($args->pagenum) && !empty($args->pagenum)) ? intval($args->pagenum) : 1;$userid = isset($args->userid) ? $args->userid : $USER->id;$submit = isset($args->submit) ? $args->submit : false;$completed = isset($args->completed) ? $args->completed : false;list($cm, $course, $questionnaire) = questionnaire_get_standard_page_items($cmid);$questionnaire = new \questionnaire($course, $cm, 0, $questionnaire);$data = [];$data['cmid'] = $cmid;$data['userid'] = $userid;$data['intro'] = $questionnaire->intro;$data['autonumquestions'] = $questionnaire->autonum;$data['id'] = $questionnaire->id;$data['rid'] = $rid;$data['surveyid'] = $questionnaire->survey->id;$data['pagenum'] = $pagenum;$data['prevpage'] = 0;$data['nextpage'] = 0;// Capabilities check.$context = \context_module::instance($cmid);self::require_capability($cm, $context, 'mod/questionnaire:view');// Any notifications will be displayed on top of main page, and prevent questionnaire from being completed. This also checks// appropriate capabilities.$data['notifications'] = $questionnaire->user_access_messages($userid);$responses = [];$result = '';$data['emptypage'] = 1;$template = "mod_questionnaire/local/mobile/$versionname/main_index_page";switch ($action) {case 'index':self::add_index_data($questionnaire, $data, $userid);$template = "mod_questionnaire/local/mobile/$versionname/main_index_page";break;case 'submit':case 'nextpage':case 'previouspage':if (!$data['notifications']) {$result = $questionnaire->save_mobile_data($userid, $pagenum, $completed, $rid, $submit, $action, (array)$args);}case 'respond':case 'resume':// Completing a questionnaire.if (!$data['notifications']) {if ($questionnaire->user_has_saved_response($userid)) {if (empty($rid)) {$rid = $questionnaire->get_latest_responseid($userid);}$questionnaire->add_response($rid);$data['rid'] = $rid;}$response = (isset($questionnaire->responses) && !empty($questionnaire->responses)) ?end($questionnaire->responses) : \mod_questionnaire\responsetype\response\response::create_from_data([]);$response->sec = $pagenum;if (isset($result['warnings'])) {if ($action == 'submit') {$response = $result['response'];}$data['notifications'] = $result['warnings'];} else if ($action == 'nextpage') {$pageresult = $result['nextpagenum'];if ($pageresult === false) {$pagenum = count($questionnaire->questionsbysec);} else if (is_string($pageresult)) {$data['notifications'] .= !empty($data['notifications']) ? "\n<br />$pageresult" : $pageresult;} else {$pagenum = $pageresult;}} else if ($action == 'previouspage') {$prevpage = $result['nextpagenum'];if ($prevpage === false) {$pagenum = 1;} else {$pagenum = $prevpage;}} else if ($action == 'submit') {self::add_index_data($questionnaire, $data, $userid);$data['action'] = 'index';$template = "mod_questionnaire/local/mobile/$versionname/main_index_page";break;}$pagequestiondata = self::add_pagequestion_data($questionnaire, $pagenum, $response);$data['pagequestions'] = $pagequestiondata['pagequestions'];$responses = $pagequestiondata['responses'];$numpages = count($questionnaire->questionsbysec);// Set some variables we are going to be using.if (!empty($questionnaire->questionsbysec) && ($numpages > 1)) {if ($pagenum > 1) {$data['prevpage'] = true;}if ($pagenum < $numpages) {$data['nextpage'] = true;}}$data['pagenum'] = $pagenum;$data['completed'] = 0;$data['emptypage'] = 0;$template = "mod_questionnaire/local/mobile/$versionname/view_activity_page";}break;case 'review':// If reviewing a submission.if ($questionnaire->capabilities->readownresponses && isset($args->submissionid) && !empty($args->submissionid)) {$questionnaire->add_response($args->submissionid);$response = $questionnaire->responses[$args->submissionid];$qnum = 1;$pagequestions = [];foreach ($questionnaire->questions as $question) {if ($question->supports_mobile()) {$pagequestions[] = $question->mobile_question_display($qnum, $questionnaire->autonum);$responses = array_merge($responses, $question->get_mobile_response_data($response));$qnum++;}}$data['prevpage'] = 0;$data['nextpage'] = 0;$data['pagequestions'] = $pagequestions;$data['completed'] = 1;$data['emptypage'] = 0;$template = "mod_questionnaire/local/mobile/$versionname/view_activity_page";}break;}$data['hasmorepages'] = $data['prevpage'] || $data['nextpage'];$return = ['templates' => [['id' => 'main','html' => $OUTPUT->render_from_template($template, $data)],],'javascript' => file_get_contents($CFG->dirroot . '/mod/questionnaire/appjs/uncheckother.js'),'otherdata' => $responses,'files' => null];return $return;}/*** Confirms the user is logged in and has the specified capability.** @param \stdClass $cm* @param \context $context* @param string $cap*/protected static function require_capability(\stdClass $cm, \context $context, string $cap) {require_login($cm->course, false, $cm, true, true);require_capability($cap, $context);}/*** Add the submissions.* @param \questionnaire $questionnaire* @param array $data* @param int $userid*/protected static function add_index_data($questionnaire, &$data, $userid) {// List any existing submissions, if user is allowed to review them.if ($questionnaire->capabilities->readownresponses) {$questionnaire->add_user_responses();$submissions = [];foreach ($questionnaire->responses as $response) {$submissions[] = ['submissiondate' => userdate($response->submitted), 'submissionid' => $response->id];}if (!empty($submissions)) {$data['submissions'] = $submissions;} else {$data['emptypage'] = 1;}if ($questionnaire->user_has_saved_response($userid)) {$data['resume'] = 1;}$data['emptypage'] = 0;}}/*** Ass the questions for the page.* @param \questionnaire $questionnaire* @param int $pagenum* @param response $response* @return array*/protected static function add_pagequestion_data($questionnaire, $pagenum, $response=null) {$qnum = 1;$pagequestions = [];$responses = [];// Find out what question number we are on $i New fix for question numbering.$i = 0;if ($pagenum > 1) {for ($j = 2; $j <= $pagenum; $j++) {foreach ($questionnaire->questionsbysec[$j - 1] as $questionid) {if ($questionnaire->questions[$questionid]->type_id < QUESPAGEBREAK) {$i++;}}}}$qnum = $i + 1;foreach ($questionnaire->questionsbysec[$pagenum] as $questionid) {$question = $questionnaire->questions[$questionid];if ($question->supports_mobile()) {$pagequestions[] = $question->mobile_question_display($qnum, $questionnaire->autonum);$mobileotherdata = $question->mobile_otherdata();if (!empty($mobileotherdata)) {$responses = array_merge($responses, $mobileotherdata);}if (($response !== null) && isset($response->answers[$questionid])) {$responses = array_merge($responses, $question->get_mobile_response_data($response));}}$qnum++;}return ['pagequestions' => $pagequestions, 'responses' => $responses];}}