Skip to content

Commit 1467454

Browse files
mchurchwardclaude
andcommitted
Phase 9: Migrate response handler to mod_questionnaire\questionnaire
- Rename manager → questionnaire_responses (new file); delete manager.php - Rename responsemanager() accessor → responses() on legacy class - Move $responses array from legacy class into questionnaire_responses - Add get_response()/get_loaded_responses() accessors to questionnaire_responses - Change questionnaire_responses constructor to accept \mod_questionnaire\questionnaire - Update all property accesses to use new-class method calls (id(), surveyid(), coursemodule(), course(), grade(), completionsubmit(), is_anonymous(), etc.) - Add questions_by_section_all() and questions_autonumbered() to new class - questionnaire_responses iterates questionsbysec as objects (not IDs) to match new class structure; response_check_format() accepts $notifyquestions so notifications land on legacy question objects used by the renderer - delete_insert_response() no longer writes $questionnaire->rid - commit_submission_response() calls static update_grades() directly - Resolve user_has_submitted() TODO: delegates to questionnaire_responses - Fix load_questions() to pass $this->context to question_builder() so $question->context is never null (fixes file upload question type) - Update all callers: report.php, questions.php, mobile.php, lib.php, locallib.php Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent e960864 commit 1467454

File tree

8 files changed

+181
-132
lines changed

8 files changed

+181
-132
lines changed

classes/local/response/manager.php renamed to classes/local/response/questionnaire_responses.php

Lines changed: 113 additions & 82 deletions
Large diffs are not rendered by default.

classes/output/mobile.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ public static function mobile_view_activity($args) {
101101
$questionnaire->add_response($rid);
102102
$data['rid'] = $rid;
103103
}
104-
$response = (isset($questionnaire->responses) && !empty($questionnaire->responses)) ?
105-
end($questionnaire->responses) :
104+
$loadedresponses = $questionnaire->responses()->get_loaded_responses();
105+
$response = !empty($loadedresponses) ?
106+
end($loadedresponses) :
106107
\mod_questionnaire\local\responsetype\response\response::create_from_data([]);
107108
$response->sec = $pagenum;
108109
if (isset($result['warnings'])) {
@@ -156,7 +157,7 @@ public static function mobile_view_activity($args) {
156157
// If reviewing a submission.
157158
if ($questionnaire->capabilities->readownresponses && isset($args->submissionid) && !empty($args->submissionid)) {
158159
$questionnaire->add_response($args->submissionid);
159-
$response = $questionnaire->responses[$args->submissionid];
160+
$response = $questionnaire->responses()->get_response($args->submissionid);
160161
$qnum = 1;
161162
$pagequestions = [];
162163
foreach ($questionnaire->questions as $question) {
@@ -217,7 +218,7 @@ protected static function add_index_data($questionnaire, &$data, $userid) {
217218
if ($questionnaire->capabilities->readownresponses) {
218219
$questionnaire->add_user_responses();
219220
$submissions = [];
220-
foreach ($questionnaire->responses as $response) {
221+
foreach ($questionnaire->responses()->get_loaded_responses() as $response) {
221222
$submissions[] = ['submissiondate' => userdate($response->submitted), 'submissionid' => $response->id];
222223
}
223224
if (!empty($submissions)) {

classes/questionnaire.php

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use mod_questionnaire\local\db\questionnaire_record;
2525
use mod_questionnaire\local\db\survey_record;
2626
use mod_questionnaire\local\question\question;
27+
use mod_questionnaire\local\response\questionnaire_responses;
2728
use context_module;
2829
use stdClass;
2930

@@ -156,7 +157,7 @@ protected function load_questions(): void {
156157
$rec = $questionrec->to_record();
157158

158159
$typeid = $questionrec->get('typeid');
159-
$this->questions[$questionrec->get('id')] = question::question_builder($typeid, $rec);
160+
$this->questions[$questionrec->get('id')] = question::question_builder($typeid, $rec, $this->context);
160161

161162
if ($typeid != QUESPAGEBREAK) {
162163
// PHP assigns objects by reference, so this adds the same object to questionsbysec.
@@ -319,6 +320,25 @@ public function questions_by_section(int $section = 1): array {
319320
return $this->questionsbysec[$section] ?? [];
320321
}
321322

323+
/**
324+
* Get all question arrays organised by section (keyed by 1-based section number).
325+
*
326+
* @return array
327+
*/
328+
public function questions_by_section_all(): array {
329+
return $this->questionsbysec;
330+
}
331+
332+
/**
333+
* True if questions should be automatically numbered.
334+
*
335+
* @return bool
336+
*/
337+
public function questions_autonumbered(): bool {
338+
$autonum = $this->modulerecord->get('autonum');
339+
return !empty($autonum) && ($autonum == 1 || $autonum == 3);
340+
}
341+
322342
/**
323343
* True if the questionnaire has an associated survey (is active).
324344
*
@@ -550,14 +570,11 @@ public function user_has_saved_response(int $userid): bool {
550570
/**
551571
* True if the given user has at least one complete (submitted) response for this questionnaire.
552572
*
553-
* TODO Phase 9: once the response manager holds the new questionnaire class, replace the direct
554-
* response_record call here with (new \mod_questionnaire\local\response\manager($this))->response_exists($userid).
555-
*
556573
* @param int $userid
557574
* @return bool
558575
*/
559576
public function user_has_submitted(int $userid): bool {
560-
return \mod_questionnaire\local\db\response_record::user_has_complete_response($this->id(), $userid);
577+
return (new questionnaire_responses($this))->response_exists($userid);
561578
}
562579

563580
/**
@@ -1883,7 +1900,7 @@ public static function reset_userdata(object $data): array {
18831900
$questcm = get_coursemodule_from_instance("questionnaire", $questrecord->id, $questcourse->id);
18841901
$questobj = new \questionnaire($questcourse, $questcm, 0, $questrecord);
18851902
foreach ($resps as $response) {
1886-
$questobj->responsemanager()->delete_response($response);
1903+
$questobj->responses()->delete_response($response);
18871904
}
18881905
}
18891906
// Remove this questionnaire's grades (and feedback) from gradebook (if any).

lib.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ function questionnaire_user_outline($course, $user, $mod, $questionnaire) {
171171
require_once($CFG->dirroot . '/mod/questionnaire/locallib.php');
172172

173173
$result = new stdClass();
174-
$responses = \mod_questionnaire\local\response\manager::get_user_responses_for_instance(
174+
$responses = \mod_questionnaire\local\response\questionnaire_responses::get_user_responses_for_instance(
175175
($questionnaire instanceof \mod_questionnaire\questionnaire) ? $questionnaire->id() : $questionnaire->id,
176176
$user->id,
177177
true
@@ -205,7 +205,7 @@ function questionnaire_user_complete($course, $user, $mod, $questionnaire) {
205205
global $CFG;
206206
require_once($CFG->dirroot . '/mod/questionnaire/locallib.php');
207207

208-
$responses = \mod_questionnaire\local\response\manager::get_user_responses_for_instance(
208+
$responses = \mod_questionnaire\local\response\questionnaire_responses::get_user_responses_for_instance(
209209
($questionnaire instanceof \mod_questionnaire\questionnaire) ? $questionnaire->id() : $questionnaire->id,
210210
$user->id,
211211
false

locallib.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ function questionnaire_delete_permanently_questions($qid, $sid) {
208208
$select = 'id = :id AND surveyid = :sid AND deleted IS NOT NULL';
209209
$DB->delete_records_select('questionnaire_question', $select, ['id' => $qid, 'sid' => $sid]);
210210
$DB->delete_records('questionnaire_response', ['questionnaireid' => $qid]);
211-
\mod_questionnaire\local\response\manager::delete_responses_for_question($qid);
211+
\mod_questionnaire\local\response\questionnaire_responses::delete_responses_for_question($qid);
212212
$DB->delete_records('questionnaire_dependency', ['questionid' => $qid]);
213213
$DB->delete_records('questionnaire_dependency', ['dependquestionid' => $qid]);
214214
}

questionnaire.class.php

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,6 @@ class questionnaire {
119119
/** @var \stdClass $capabilities The capabilities object for the current user. */
120120
public $capabilities = null;
121121

122-
/** @var array $responses Loaded response data. */
123-
public $responses = [];
124-
125122
/** @var array $questionsbysec Questions grouped by section (page). */
126123
public $questionsbysec = [];
127124

@@ -135,8 +132,8 @@ class questionnaire {
135132
*/
136133
public $deletequestions = [];
137134

138-
/** @var \mod_questionnaire\local\response\manager|null $responsemanager Lazy-initialised response manager. */
139-
protected $responsemanager = null;
135+
/** @var \mod_questionnaire\local\response\questionnaire_responses|null $responses Lazy-initialised response handler. */
136+
protected $responses = null;
140137

141138
/** @var int|null $rid The id of the most recently inserted/committed response. */
142139
public $rid = null;
@@ -212,8 +209,6 @@ public function __construct(&$course, &$cm, $id = 0, $questionnaire = null, $add
212209
$this->capabilities = $this->load_capabilities();
213210
}
214211

215-
// Don't automatically add responses.
216-
$this->responses = [];
217212
}
218213

219214
/**
@@ -302,7 +297,7 @@ public function add_questions($sid = 0) {
302297
* @param int $userid
303298
*/
304299
public function add_user_responses($userid = null) {
305-
$this->responsemanager()->add_user_responses($userid);
300+
$this->responses()->add_user_responses($userid);
306301
}
307302

308303
/**
@@ -311,7 +306,7 @@ public function add_user_responses($userid = null) {
311306
* @param int $responseid
312307
*/
313308
public function add_response(int $responseid) {
314-
$this->responsemanager()->add_response($responseid);
309+
$this->responses()->add_response($responseid);
315310
}
316311

317312
/**
@@ -320,7 +315,7 @@ public function add_response(int $responseid) {
320315
* @param stdClass $formdata
321316
*/
322317
public function add_response_from_formdata(stdClass $formdata) {
323-
$this->responsemanager()->add_response_from_formdata($formdata);
318+
$this->responses()->add_response_from_formdata($formdata);
324319
}
325320

326321
/**
@@ -331,7 +326,7 @@ public function add_response_from_formdata(stdClass $formdata) {
331326
* @return bool|\mod_questionnaire\local\responsetype\response\response
332327
*/
333328
public function build_response_from_appdata(stdClass $appdata, $sec = 0) {
334-
return $this->responsemanager()->build_response_from_appdata($appdata, $sec);
329+
return $this->responses()->build_response_from_appdata($appdata, $sec);
335330
}
336331

337332
/**
@@ -343,14 +338,16 @@ public function add_renderer(plugin_renderer_base $renderer) {
343338
}
344339

345340
/**
346-
* Return the response manager for this questionnaire instance (lazy-initialised).
347-
* @return \mod_questionnaire\local\response\manager
341+
* Return the response handler for this questionnaire instance (lazy-initialised).
342+
* @return \mod_questionnaire\local\response\questionnaire_responses
348343
*/
349-
public function responsemanager(): \mod_questionnaire\local\response\manager {
350-
if (!isset($this->responsemanager)) {
351-
$this->responsemanager = new \mod_questionnaire\local\response\manager($this);
344+
public function responses(): \mod_questionnaire\local\response\questionnaire_responses {
345+
if (!isset($this->responses)) {
346+
$this->responses = new \mod_questionnaire\local\response\questionnaire_responses(
347+
\mod_questionnaire\questionnaire::from_instanceid($this->id)
348+
);
352349
}
353-
return $this->responsemanager;
350+
return $this->responses;
354351
}
355352

356353
/**
@@ -448,7 +445,7 @@ public function view() {
448445
* @return bool|int
449446
*/
450447
public function delete_insert_response($rid, $sec, $quser) {
451-
return $this->responsemanager()->delete_insert_response($rid, $sec, $quser);
448+
return $this->responses()->delete_insert_response($rid, $sec, $quser);
452449
}
453450

454451
/**
@@ -457,7 +454,7 @@ public function delete_insert_response($rid, $sec, $quser) {
457454
* @param int $quser
458455
*/
459456
public function commit_submission_response($rid, $quser) {
460-
$this->responsemanager()->commit_submission_response($rid, $quser);
457+
$this->responses()->commit_submission_response($rid, $quser);
461458
}
462459

463460
/**
@@ -537,7 +534,7 @@ public function view_response(
537534
if ($question->typeid != QUESPAGEBREAK) {
538535
$this->page->add_to_page(
539536
'responses',
540-
$this->renderer->response_output($question, $this->responses[$rid], $i, $pdf, $this)
537+
$this->renderer->response_output($question, $this->responses()->get_response($rid), $i, $pdf, $this)
541538
);
542539
}
543540
}
@@ -552,8 +549,9 @@ public function view_all_responses() {
552549
// If a student's responses have been deleted by teacher while student was viewing the report,
553550
// then responses may have become empty, hence this test is necessary.
554551

555-
if (!empty($this->responses)) {
556-
$this->page->add_to_page('responses', $this->renderer->all_response_output($this->responses, $this->questions, $this));
552+
$loadedresponses = $this->responses()->get_loaded_responses();
553+
if (!empty($loadedresponses)) {
554+
$this->page->add_to_page('responses', $this->renderer->all_response_output($loadedresponses, $this->questions, $this));
557555
} else {
558556
$this->page->add_to_page('responses', $this->renderer->all_response_output(get_string('noresponses', 'questionnaire')));
559557
}
@@ -700,7 +698,7 @@ public function user_access_messages($userid = 0, $asnotification = false) {
700698
* @return bool
701699
*/
702700
public function user_has_saved_response($userid) {
703-
return $this->responsemanager()->user_has_saved_response($userid);
701+
return $this->responses()->user_has_saved_response($userid);
704702
}
705703

706704
/**
@@ -958,7 +956,7 @@ public function count_submissions($userid = false, $groupid = 0) {
958956
* @return array
959957
*/
960958
public function get_responses($userid = false, $groupid = 0) {
961-
return $this->responsemanager()->get_responses($userid, $groupid);
959+
return $this->responses()->get_responses($userid, $groupid);
962960
}
963961

964962
/**
@@ -1438,7 +1436,7 @@ private function survey_render(&$formdata, $section = 1, $message = '') {
14381436
'questions',
14391437
$this->renderer->question_output(
14401438
$this->questions[$questionid],
1441-
(isset($this->responses[$formdata->rid]) ? $this->responses[$formdata->rid] : []),
1439+
($this->responses()->get_response($formdata->rid) ?? []),
14421440
$i,
14431441
$this->usehtmleditor,
14441442
[],
@@ -1785,7 +1783,7 @@ public function survey_print_render($courseid, $message = '', $referer = '', $ri
17851783
$this->questions[$questionid]->set_isprint($referer === 'print');
17861784
$output .= $this->renderer->question_output(
17871785
$this->questions[$questionid],
1788-
$this->responses[0] ?? new \mod_questionnaire\local\responsetype\response\response(),
1786+
($this->responses()->get_response(0) ?? new \mod_questionnaire\local\responsetype\response\response()),
17891787
$i++,
17901788
null,
17911789
$dependants,
@@ -1821,7 +1819,9 @@ public function survey_print_render($courseid, $message = '', $referer = '', $ri
18211819
* @return string
18221820
*/
18231821
private function response_check_format($section, $formdata, $checkmissing = true, $checkwrongformat = true) {
1824-
return $this->responsemanager()->response_check_format($section, $formdata, $checkmissing, $checkwrongformat);
1822+
return $this->responses()->response_check_format(
1823+
$section, $formdata, $checkmissing, $checkwrongformat, $this->questions
1824+
);
18251825
}
18261826

18271827
/**
@@ -1830,7 +1830,7 @@ private function response_check_format($section, $formdata, $checkmissing = true
18301830
* @param null|int $sec
18311831
*/
18321832
private function response_delete($rid, $sec = null) {
1833-
$this->responsemanager()->response_delete($rid, $sec);
1833+
$this->responses()->response_delete($rid, $sec);
18341834
}
18351835

18361836
/**
@@ -1839,7 +1839,7 @@ private function response_delete($rid, $sec = null) {
18391839
* @return bool
18401840
*/
18411841
private function response_commit($rid) {
1842-
return $this->responsemanager()->response_commit($rid);
1842+
return $this->responses()->response_commit($rid);
18431843
}
18441844

18451845
/**
@@ -2113,7 +2113,7 @@ private function get_full_submission_for_notifications($rid) {
21132113
* @throws coding_exception
21142114
*/
21152115
public function get_structured_response($rid) {
2116-
return $this->responsemanager()->get_structured_response($rid);
2116+
return $this->responses()->get_structured_response($rid);
21172117
}
21182118

21192119
/**
@@ -2122,7 +2122,7 @@ public function get_structured_response($rid) {
21222122
* @return array
21232123
*/
21242124
private function get_full_submission_for_export($rid) {
2125-
return $this->responsemanager()->get_full_submission_for_export($rid);
2125+
return $this->responses()->get_full_submission_for_export($rid);
21262126
}
21272127

21282128
/**
@@ -2231,7 +2231,7 @@ private function response_send_email($rid, $email) {
22312231
* @return bool|int
22322232
*/
22332233
public function response_insert($responsedata, $userid, $resume = false) {
2234-
return $this->responsemanager()->response_insert($responsedata, $userid, $resume);
2234+
return $this->responses()->response_insert($responsedata, $userid, $resume);
22352235
}
22362236

22372237
/**
@@ -2240,7 +2240,7 @@ public function response_insert($responsedata, $userid, $resume = false) {
22402240
* @return array
22412241
*/
22422242
private function response_select($rid) {
2243-
return $this->responsemanager()->response_select($rid);
2243+
return $this->responses()->response_select($rid);
22442244
}
22452245

22462246
/**
@@ -2884,7 +2884,7 @@ protected function user_fields() {
28842884
* @return array
28852885
*/
28862886
protected function get_survey_all_responses($rid = '', $userid = '', $groupid = false, $showincompletes = 0) {
2887-
return $this->responsemanager()->get_survey_all_responses($rid, $userid, $groupid, $showincompletes);
2887+
return $this->responses()->get_survey_all_responses($rid, $userid, $groupid, $showincompletes);
28882888
}
28892889

28902890
/**

questions.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@
128128
$reload = true;
129129
} else {
130130
// Delete responses to that deleted question.
131-
$questionnaire->responsemanager()->delete_responses($qid);
131+
$questionnaire->responses()->delete_responses($qid);
132132

133133
// If no questions left in this questionnaire, remove all responses.
134134
if (

report.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@
334334
throw new \moodle_exception('invalidresponserecord', 'mod_questionnaire');
335335
}
336336

337-
if ($questionnaire->responsemanager()->delete_response($response)) {
337+
if ($questionnaire->responses()->delete_response($response)) {
338338
if (!$DB->count_records('questionnaire_response', ['questionnaireid' => $questionnaire->id, 'complete' => 'y'])) {
339339
$redirection = $CFG->wwwroot . '/mod/questionnaire/view.php?id=' . $cm->id;
340340
} else {
@@ -425,7 +425,7 @@
425425

426426
if (!empty($resps)) {
427427
foreach ($resps as $response) {
428-
$questionnaire->responsemanager()->delete_response($response);
428+
$questionnaire->responses()->delete_response($response);
429429
}
430430
if (!$questionnaire->count_submissions()) {
431431
$redirection = $CFG->wwwroot . '/mod/questionnaire/view.php?id=' . $cm->id;

0 commit comments

Comments
 (0)