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
/**
18
 * Manage feedback sections.
19
 *
20
 * @package mod_questionnaire
21
 * @copyright  2016 onward Mike Churchward (mike.churchward@poetgroup.org)
22
 * @author Joseph Rezeau
23
 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
24
 */
25
 
26
require_once("../../config.php");
27
require_once($CFG->dirroot.'/mod/questionnaire/questionnaire.class.php');
28
 
29
$id = required_param('id', PARAM_INT);    // Course module ID.
30
$section = optional_param('section', 1, PARAM_INT);
31
if ($section == 0) {
32
    $section = 1;
33
}
34
$currentgroupid = optional_param('group', 0, PARAM_INT); // Groupid.
35
$action = optional_param('action', '', PARAM_ALPHA);
36
$sectionid = optional_param('sectionid', 0, PARAM_INT);
37
 
38
if (! $cm = get_coursemodule_from_id('questionnaire', $id)) {
39
    throw new \moodle_exception('invalidcoursemodule', 'mod_questionnaire');
40
}
41
 
42
if (! $course = $DB->get_record("course", ["id" => $cm->course])) {
43
    throw new \moodle_exception('coursemisconf', 'mod_questionnaire');
44
}
45
 
46
if (! $questionnaire = $DB->get_record("questionnaire", ["id" => $cm->instance])) {
47
    throw new \moodle_exception('invalidcoursemodule', 'mod_questionnaire');
48
}
49
 
50
// Needed here for forced language courses.
51
require_course_login($course, true, $cm);
52
$context = context_module::instance($cm->id);
53
 
54
$url = new moodle_url('/mod/questionnaire/fbsections.php', ['id' => $id]);
55
$PAGE->set_url($url);
56
$PAGE->set_context($context);
57
if (!isset($SESSION->questionnaire)) {
58
    $SESSION->questionnaire = new stdClass();
59
}
60
 
61
$questionnaire = new questionnaire($course, $cm, 0, $questionnaire);
62
 
63
if ($sectionid) {
64
    // Get the specified section by its id.
65
    $feedbacksection = new mod_questionnaire\feedback\section($questionnaire->questions, ['id' => $sectionid]);
66
 
67
} else if (!$DB->count_records('questionnaire_fb_sections', ['surveyid' => $questionnaire->sid])) {
68
    // There are no sections currently, so create one.
69
    if ($questionnaire->survey->feedbacksections == 1) {
70
        $sectionlabel = get_string('feedbackglobal', 'questionnaire');
71
    } else {
72
        $sectionlabel = get_string('feedbackdefaultlabel', 'questionnaire');
73
    }
74
    $feedbacksection = mod_questionnaire\feedback\section::new_section($questionnaire->sid, $sectionlabel);
75
 
76
} else {
77
    // Get the specified section by section number.
78
    $feedbacksection = new mod_questionnaire\feedback\section($questionnaire->questions,
79
        ['surveyid' => $questionnaire->survey->id, 'sectionnum' => $section]);
80
}
81
 
82
// Get all questions that are valid feedback questions.
83
$validquestions = [];
84
foreach ($questionnaire->questions as $question) {
85
    if ($question->valid_feedback()) {
86
        $validquestions[$question->id] = $question->name;
87
    }
88
}
89
 
90
// Add renderer and page objects to the questionnaire object for display use.
91
$questionnaire->add_renderer($PAGE->get_renderer('mod_questionnaire'));
92
$questionnaire->add_page(new \mod_questionnaire\output\feedbackpage());
93
 
94
$SESSION->questionnaire->current_tab = 'feedback';
95
 
96
if (!$questionnaire->capabilities->editquestions) {
97
    throw new \moodle_exception('nopermissions', 'mod_questionnaire');
98
}
99
 
100
// Handle confirmed actions that impact display immediately.
101
if ($action == 'removequestion') {
102
    $sectionid = required_param('sectionid', PARAM_INT);
103
    $qid = required_param('qid', PARAM_INT);
104
    $feedbacksection->remove_question($qid);
105
 
106
} else if ($action == 'deletesection') {
107
    $sectionid = required_param('sectionid', PARAM_INT);
108
    if ($sectionid == $feedbacksection->id) {
109
        $feedbacksection->delete();
110
        redirect(new moodle_url('/mod/questionnaire/fbsections.php', ['id' => $cm->id]));
111
    }
112
}
113
 
114
$customdata = new stdClass();
115
$customdata->feedbacksection = $feedbacksection;
116
$customdata->validquestions = $validquestions;
117
$customdata->survey = $questionnaire->survey;
118
$customdata->sectionselect = $DB->get_records_menu('questionnaire_fb_sections', ['surveyid' => $questionnaire->survey->id],
119
    'section', 'id,sectionlabel');
120
 
121
$feedbackform = new \mod_questionnaire\feedback_section_form('fbsections.php', $customdata);
122
$sdata = clone($feedbacksection);
123
$sdata->sid = $questionnaire->survey->id;
124
$sdata->sectionid = $feedbacksection->id;
125
$sdata->id = $cm->id;
126
 
127
$draftideditor = file_get_submitted_draft_itemid('sectionheading');
128
$currentinfo = file_prepare_draft_area($draftideditor, $context->id, 'mod_questionnaire', 'sectionheading',
129
    $feedbacksection->id, ['subdirs' => true], $feedbacksection->sectionheading);
130
$sdata->sectionheading = ['text' => $currentinfo, 'format' => FORMAT_HTML, 'itemid' => $draftideditor];
131
 
132
$feedbackform->set_data($sdata);
133
 
134
if ($feedbackform->is_cancelled()) {
135
    redirect(new moodle_url('/mod/questionnaire/feedback.php', ['id' => $cm->id]));
136
}
137
 
138
if ($settings = $feedbackform->get_data()) {
139
    // Because formslib doesn't support 'numeric' or 'image' inputs, the results won't show up in the $feedbackform object.
140
    $fullform = data_submitted();
141
 
142
    if (isset($settings->gotosection)) {
143
        if ($settings->navigatesections != $feedbacksection->id) {
144
            redirect(new moodle_url('/mod/questionnaire/fbsections.php',
145
                ['id' => $cm->id, 'sectionid' => $settings->navigatesections]));
146
        }
147
 
148
    } else if (isset($settings->addnewsection)) {
149
        $newsection = mod_questionnaire\feedback\section::new_section($questionnaire->survey->id, $settings->newsectionlabel);
150
        redirect(new moodle_url('/mod/questionnaire/fbsections.php', ['id' => $cm->id, 'sectionid' => $newsection->id]));
151
 
152
    } else if (isset($fullform->confirmdeletesection)) {
153
        redirect(new moodle_url('/mod/questionnaire/fbsections.php',
154
            ['id' => $cm->id, 'sectionid' => $feedbacksection->id, 'action' => 'confirmdeletesection']));
155
 
156
    } else if (isset($fullform->confirmremovequestion)) {
157
        $qid = key($fullform->confirmremovequestion);
158
        redirect(new moodle_url('/mod/questionnaire/fbsections.php',
159
            ['id' => $cm->id, 'sectionid' => $settings->sectionid, 'action' => 'confirmremovequestion', 'qid' => $qid]));
160
 
161
    } else if (isset($settings->addquestion)) {
162
        $scorecalculation = [];
163
        // Check for added question.
164
        if (isset($settings->addquestionselect) && ($settings->addquestionselect != 0)) {
165
            if ($questionnaire->questions[$settings->addquestionselect]->supports_feedback_scores()) {
166
                $scorecalculation[$settings->addquestionselect] = 1;
167
            } else {
168
                $scorecalculation[$settings->addquestionselect] = -1;
169
            }
170
        }
171
        // Get all current asigned questions.
172
        if (isset($fullform->weight)) {
173
            foreach ($fullform->weight as $qid => $value) {
174
                $scorecalculation[$qid] = $value;
175
            }
176
        }
177
        // Update the section with question weights.
178
        $feedbacksection->set_new_scorecalculation($scorecalculation);
179
 
180
    } else if (isset($settings->submitbutton)) {
181
        if (isset($fullform->weight)) {
182
            $feedbacksection->scorecalculation = $fullform->weight;
183
        } else {
184
            $feedbacksection->scorecalculation = [];
185
        }
186
        $feedbacksection->sectionlabel = $settings->sectionlabel;
187
        $feedbacksection->sectionheading = file_save_draft_area_files((int)$settings->sectionheading['itemid'], $context->id,
188
            'mod_questionnaire', 'sectionheading', $feedbacksection->id, ['subdirs' => false, 'maxfiles' => -1, 'maxbytes' => 0],
189
            $settings->sectionheading['text']);
190
        $feedbacksection->sectionheadingformat = $settings->sectionheading['format'];
191
 
192
        // May have changed the section label and weights, so update the data.
193
        $customdata->sectionselect[$feedbacksection->id] = $settings->sectionlabel;
194
        if (isset($fullform->weight)) {
195
            $customdata->feedbacksection->scorecalculation = $fullform->weight;
196
        }
197
 
198
        // Save current section's feedbacks
199
        // first delete all existing feedbacks for this section - if any - because we never know whether editing feedbacks will
200
        // have more or less texts, so it's easiest to delete all and start afresh.
201
        $feedbacksection->delete_sectionfeedback();
202
 
203
        $i = 0;
204
        while (!empty($settings->feedbackboundaries[$i])) {
205
            $boundary = trim($settings->feedbackboundaries[$i]);
206
            if (strlen($boundary) > 0 && $boundary[strlen($boundary) - 1] == '%') {
207
                $boundary = trim(substr($boundary, 0, -1));
208
            }
209
            $settings->feedbackboundaries[$i] = $boundary;
210
            $i += 1;
211
        }
212
        $numboundaries = $i;
213
        $settings->feedbackboundaries[-1] = 101;
214
        $settings->feedbackboundaries[$numboundaries] = 0;
215
        $settings->feedbackboundarycount = $numboundaries;
216
 
217
        // Now set up new section feedback records for each saved boundary.
218
        for ($i = 0; $i <= $settings->feedbackboundarycount; $i++) {
219
            $feedback = new stdClass();
220
            $feedback->sectionid = $feedbacksection->id;
221
            if (isset($settings->feedbacklabel[$i])) {
222
                $feedback->feedbacklabel = $settings->feedbacklabel[$i];
223
            } else {
224
                $feedback->feedbacklabel = null;
225
            }
226
            $feedback->feedbacktext = '';
227
            $feedback->feedbacktextformat = $settings->feedbacktext[$i]['format'];
228
            $feedback->minscore = $settings->feedbackboundaries[$i];
229
            $feedback->maxscore = $settings->feedbackboundaries[$i - 1];
230
 
231
            $fbid = $feedbacksection->load_sectionfeedback($feedback);
232
 
233
            $feedbacktext = file_save_draft_area_files((int)$settings->feedbacktext[$i]['itemid'],
234
                $context->id, 'mod_questionnaire', 'feedback', $fbid, ['subdirs' => false, 'maxfiles' => -1, 'maxbytes' => 0],
235
                $settings->feedbacktext[$i]['text']);
236
            $feedbacksection->sectionfeedback[$fbid]->feedbacktext = $feedbacktext;
237
        }
238
 
239
        // Update all feedback data.
240
        $feedbacksection->update();
241
    }
242
    $feedbackform = new \mod_questionnaire\feedback_section_form('fbsections.php', $customdata);
243
}
244
 
245
// Print the page header.
246
$PAGE->set_title(get_string('editingfeedback', 'questionnaire'));
247
$PAGE->set_heading(format_string($course->fullname));
248
$PAGE->navbar->add(get_string('editingfeedback', 'questionnaire'));
249
echo $questionnaire->renderer->header();
250
require('tabs.php');
251
 
252
// Handle confirmations differently.
253
if ($action == 'confirmremovequestion') {
254
    $sectionid = required_param('sectionid', PARAM_INT);
255
    $qid = required_param('qid', PARAM_INT);
256
    $msgargs = new stdClass();
257
    $msgargs->qname = $questionnaire->questions[$qid]->name;
258
    $msgargs->sname = $feedbacksection->sectionlabel;
259
    $msg = '<div class="warning centerpara"><p>' . get_string('confirmremovequestion', 'questionnaire', $msgargs) . '</p></div>';
260
    $args = ['id' => $questionnaire->cm->id, 'sectionid' => $sectionid];
261
    $urlno = new moodle_url('/mod/questionnaire/fbsections.php', $args);
262
    $args['action'] = 'removequestion';
263
    $args['qid'] = $qid;
264
    $urlyes = new moodle_url('/mod/questionnaire/fbsections.php', $args);
265
    $buttonyes = new single_button($urlyes, get_string('yes'));
266
    $buttonno = new single_button($urlno, get_string('no'));
267
    $questionnaire->page->add_to_page('formarea', $questionnaire->renderer->confirm($msg, $buttonyes, $buttonno));
268
 
269
} else if ($action == 'confirmdeletesection') {
270
    $sectionid = required_param('sectionid', PARAM_INT);
271
    $msg = '<div class="warning centerpara"><p>' .
272
        get_string('confirmdeletesection', 'questionnaire', $feedbacksection->sectionlabel) . '</p></div>';
273
    $args = ['id' => $questionnaire->cm->id, 'sectionid' => $sectionid];
274
    $urlno = new moodle_url('/mod/questionnaire/fbsections.php', $args);
275
    $args['action'] = 'deletesection';
276
    $urlyes = new moodle_url('/mod/questionnaire/fbsections.php', $args);
277
    $buttonyes = new single_button($urlyes, get_string('yes'));
278
    $buttonno = new single_button($urlno, get_string('no'));
279
    $questionnaire->page->add_to_page('formarea', $questionnaire->renderer->confirm($msg, $buttonyes, $buttonno));
280
 
281
} else {
282
    $questionnaire->page->add_to_page('formarea', $feedbackform->render());
283
}
284
 
285
echo $questionnaire->renderer->render($questionnaire->page);
286
echo $questionnaire->renderer->footer($course);