Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace mod_questionnaire\output;
18
 
19
use mod_questionnaire\responsetype\response\response;
20
 
21
/**
22
 * Mobile output class for mod_questionnaire.
23
 *
24
 * @package    mod_questionnaire
25
 * @copyright  2016 Mike Churchward (mike.churchward@poetgroup.org)
26
 * @author     Mike Churchward
27
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
28
 */
29
class mobile {
30
 
31
    /**
32
     * Returns the initial page when viewing the activity for the mobile app.
33
     *
34
     * @param  array $args Arguments from tool_mobile_get_content WS
35
     * @return array HTML, javascript and other data
36
     */
37
    public static function mobile_view_activity($args) {
38
        global $OUTPUT, $USER, $CFG, $DB;
39
        require_once($CFG->dirroot.'/mod/questionnaire/questionnaire.class.php');
40
 
41
        $args = (object) $args;
42
 
43
        $versionname = $args->appversioncode >= 3950 ? 'latest' : 'ionic3';
44
        $cmid = $args->cmid;
45
        $rid = isset($args->rid) ? $args->rid : 0;
46
        $action = isset($args->action) ? $args->action : 'index';
47
        $pagenum = (isset($args->pagenum) && !empty($args->pagenum)) ? intval($args->pagenum) : 1;
48
        $userid = isset($args->userid) ? $args->userid : $USER->id;
49
        $submit = isset($args->submit) ? $args->submit : false;
50
        $completed = isset($args->completed) ? $args->completed : false;
51
 
52
        list($cm, $course, $questionnaire) = questionnaire_get_standard_page_items($cmid);
53
        $questionnaire = new \questionnaire($course, $cm, 0, $questionnaire);
54
 
55
        $data = [];
56
        $data['cmid'] = $cmid;
57
        $data['userid'] = $userid;
58
        $data['intro'] = $questionnaire->intro;
59
        $data['autonumquestions'] = $questionnaire->autonum;
60
        $data['id'] = $questionnaire->id;
61
        $data['rid'] = $rid;
62
        $data['surveyid'] = $questionnaire->survey->id;
63
        $data['pagenum'] = $pagenum;
64
        $data['prevpage'] = 0;
65
        $data['nextpage'] = 0;
66
 
67
        // Capabilities check.
68
        $context = \context_module::instance($cmid);
69
        self::require_capability($cm, $context, 'mod/questionnaire:view');
70
 
71
        // Any notifications will be displayed on top of main page, and prevent questionnaire from being completed. This also checks
72
        // appropriate capabilities.
73
        $data['notifications'] = $questionnaire->user_access_messages($userid);
74
        $responses = [];
75
        $result = '';
76
 
77
        $data['emptypage'] = 1;
78
        $template = "mod_questionnaire/local/mobile/$versionname/main_index_page";
79
 
80
        switch ($action) {
81
            case 'index':
82
                self::add_index_data($questionnaire, $data, $userid);
83
                $template = "mod_questionnaire/local/mobile/$versionname/main_index_page";
84
                break;
85
 
86
            case 'submit':
87
            case 'nextpage':
88
            case 'previouspage':
89
                if (!$data['notifications']) {
90
                    $result = $questionnaire->save_mobile_data($userid, $pagenum, $completed, $rid, $submit, $action, (array)$args);
91
                }
92
 
93
            case 'respond':
94
            case 'resume':
95
                // Completing a questionnaire.
96
                if (!$data['notifications']) {
97
                    if ($questionnaire->user_has_saved_response($userid)) {
98
                        if (empty($rid)) {
99
                            $rid = $questionnaire->get_latest_responseid($userid);
100
                        }
101
                        $questionnaire->add_response($rid);
102
                        $data['rid'] = $rid;
103
                    }
104
                    $response = (isset($questionnaire->responses) && !empty($questionnaire->responses)) ?
105
                        end($questionnaire->responses) : \mod_questionnaire\responsetype\response\response::create_from_data([]);
106
                    $response->sec = $pagenum;
107
                    if (isset($result['warnings'])) {
108
                        if ($action == 'submit') {
109
                            $response = $result['response'];
110
                        }
111
                        $data['notifications'] = $result['warnings'];
112
                    } else if ($action == 'nextpage') {
113
                        $pageresult = $result['nextpagenum'];
114
                        if ($pageresult === false) {
115
                            $pagenum = count($questionnaire->questionsbysec);
116
                        } else if (is_string($pageresult)) {
117
                            $data['notifications'] .= !empty($data['notifications']) ? "\n<br />$pageresult" : $pageresult;
118
                        } else {
119
                            $pagenum = $pageresult;
120
                        }
121
                    } else if ($action == 'previouspage') {
122
                        $prevpage = $result['nextpagenum'];
123
                        if ($prevpage === false) {
124
                            $pagenum = 1;
125
                        } else {
126
                            $pagenum = $prevpage;
127
                        }
128
                    } else if ($action == 'submit') {
129
                        self::add_index_data($questionnaire, $data, $userid);
130
                        $data['action'] = 'index';
131
                        $template = "mod_questionnaire/local/mobile/$versionname/main_index_page";
132
                        break;
133
                    }
134
                    $pagequestiondata = self::add_pagequestion_data($questionnaire, $pagenum, $response);
135
                    $data['pagequestions'] = $pagequestiondata['pagequestions'];
136
                    $responses = $pagequestiondata['responses'];
137
                    $numpages = count($questionnaire->questionsbysec);
138
                    // Set some variables we are going to be using.
139
                    if (!empty($questionnaire->questionsbysec) && ($numpages > 1)) {
140
                        if ($pagenum > 1) {
141
                            $data['prevpage'] = true;
142
                        }
143
                        if ($pagenum < $numpages) {
144
                            $data['nextpage'] = true;
145
                        }
146
                    }
147
                    $data['pagenum'] = $pagenum;
148
                    $data['completed'] = 0;
149
                    $data['emptypage'] = 0;
150
                    $template = "mod_questionnaire/local/mobile/$versionname/view_activity_page";
151
                }
152
                break;
153
 
154
            case 'review':
155
                // If reviewing a submission.
156
                if ($questionnaire->capabilities->readownresponses && isset($args->submissionid) && !empty($args->submissionid)) {
157
                    $questionnaire->add_response($args->submissionid);
158
                    $response = $questionnaire->responses[$args->submissionid];
159
                    $qnum = 1;
160
                    $pagequestions = [];
161
                    foreach ($questionnaire->questions as $question) {
162
                        if ($question->supports_mobile()) {
163
                            $pagequestions[] = $question->mobile_question_display($qnum, $questionnaire->autonum);
164
                            $responses = array_merge($responses, $question->get_mobile_response_data($response));
165
                            $qnum++;
166
                        }
167
                    }
168
                    $data['prevpage'] = 0;
169
                    $data['nextpage'] = 0;
170
                    $data['pagequestions'] = $pagequestions;
171
                    $data['completed'] = 1;
172
                    $data['emptypage'] = 0;
173
                    $template = "mod_questionnaire/local/mobile/$versionname/view_activity_page";
174
                }
175
                break;
176
        }
177
 
178
        $data['hasmorepages'] = $data['prevpage'] || $data['nextpage'];
179
 
180
        $return = [
181
            'templates' => [
182
                [
183
                    'id' => 'main',
184
                    'html' => $OUTPUT->render_from_template($template, $data)
185
                ],
186
            ],
187
            'javascript' => file_get_contents($CFG->dirroot . '/mod/questionnaire/appjs/uncheckother.js'),
188
            'otherdata' => $responses,
189
            'files' => null
190
        ];
191
        return $return;
192
    }
193
 
194
    /**
195
     * Confirms the user is logged in and has the specified capability.
196
     *
197
     * @param \stdClass $cm
198
     * @param \context $context
199
     * @param string $cap
200
     */
201
    protected static function require_capability(\stdClass $cm, \context $context, string $cap) {
202
        require_login($cm->course, false, $cm, true, true);
203
        require_capability($cap, $context);
204
    }
205
 
206
    /**
207
     * Add the submissions.
208
     * @param \questionnaire $questionnaire
209
     * @param array $data
210
     * @param int $userid
211
     */
212
    protected static function add_index_data($questionnaire, &$data, $userid) {
213
        // List any existing submissions, if user is allowed to review them.
214
        if ($questionnaire->capabilities->readownresponses) {
215
            $questionnaire->add_user_responses();
216
            $submissions = [];
217
            foreach ($questionnaire->responses as $response) {
218
                $submissions[] = ['submissiondate' => userdate($response->submitted), 'submissionid' => $response->id];
219
            }
220
            if (!empty($submissions)) {
221
                $data['submissions'] = $submissions;
222
            } else {
223
                $data['emptypage'] = 1;
224
            }
225
            if ($questionnaire->user_has_saved_response($userid)) {
226
                $data['resume'] = 1;
227
            }
228
            $data['emptypage'] = 0;
229
        }
230
    }
231
 
232
    /**
233
     * Ass the questions for the page.
234
     * @param \questionnaire $questionnaire
235
     * @param int $pagenum
236
     * @param response $response
237
     * @return array
238
     */
239
    protected static function add_pagequestion_data($questionnaire, $pagenum, $response=null) {
240
        $qnum = 1;
241
        $pagequestions = [];
242
        $responses = [];
243
 
244
        // Find out what question number we are on $i New fix for question numbering.
245
        $i = 0;
246
        if ($pagenum > 1) {
247
            for ($j = 2; $j <= $pagenum; $j++) {
248
                foreach ($questionnaire->questionsbysec[$j - 1] as $questionid) {
249
                    if ($questionnaire->questions[$questionid]->type_id < QUESPAGEBREAK) {
250
                        $i++;
251
                    }
252
                }
253
            }
254
        }
255
        $qnum = $i + 1;
256
 
257
        foreach ($questionnaire->questionsbysec[$pagenum] as $questionid) {
258
            $question = $questionnaire->questions[$questionid];
259
            if ($question->supports_mobile()) {
260
                $pagequestions[] = $question->mobile_question_display($qnum, $questionnaire->autonum);
261
                $mobileotherdata = $question->mobile_otherdata();
262
                if (!empty($mobileotherdata)) {
263
                    $responses = array_merge($responses, $mobileotherdata);
264
                }
265
                if (($response !== null) && isset($response->answers[$questionid])) {
266
                    $responses = array_merge($responses, $question->get_mobile_response_data($response));
267
                }
268
            }
269
            $qnum++;
270
        }
271
 
272
        return ['pagequestions' => $pagequestions, 'responses' => $responses];
273
    }
274
}