Proyectos de Subversion Moodle

Rev

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];
    }
}