function questionnaire_check_page_breaks($questionnaire) { global $DB; $msg = ''; // Store the new page breaks ids. $newpbids = array(); $delpb = 0; $sid = $questionnaire->survey->id; $questions = $DB->get_records('questionnaire_question', array('survey_id' => $sid, 'deleted' => 'n'), 'id'); $positions = array(); foreach ($questions as $key => $qu) { $positions[$qu->position]['question_id'] = $key; $positions[$qu->position]['dependquestion'] = $qu->dependquestion; $positions[$qu->position]['dependchoice'] = $qu->dependchoice; $positions[$qu->position]['type_id'] = $qu->type_id; $positions[$qu->position]['qname'] = $qu->name; $positions[$qu->position]['qpos'] = $qu->position; } $count = count($positions); for ($i = $count; $i > 0; $i--) { $qu = $positions[$i]; $questionnb = $i; if ($qu['type_id'] == QUESPAGEBREAK) { $questionnb--; // If more than one consecutive page breaks, remove extra one(s). $prevqu = null; $prevtypeid = null; if ($i > 1) { $prevqu = $positions[$i - 1]; $prevtypeid = $prevqu['type_id']; } // If $i == $count then remove that extra page break in last position. if ($prevtypeid == QUESPAGEBREAK || $i == $count || $qu['qpos'] == 1) { $qid = $qu['question_id']; $delpb++; $msg .= get_string("checkbreaksremoved", "questionnaire", $delpb) . '<br />'; // Need to reload questions. $questions = $DB->get_records('questionnaire_question', array('survey_id' => $sid, 'deleted' => 'n'), 'id'); $DB->set_field('questionnaire_question', 'deleted', 'y', array('id' => $qid, 'survey_id' => $sid)); $select = 'survey_id = ' . $sid . ' AND deleted = \'n\' AND position > ' . $questions[$qid]->position; if ($records = $DB->get_records_select('questionnaire_question', $select, null, 'position ASC')) { foreach ($records as $record) { $DB->set_field('questionnaire_question', 'position', $record->position - 1, array('id' => $record->id)); } } } } // Add pagebreak between question child and not dependent question that follows. if ($qu['type_id'] != QUESPAGEBREAK) { $j = $i - 1; if ($j != 0) { $prevtypeid = $positions[$j]['type_id']; $prevdependquestion = $positions[$j]['dependquestion']; $prevdependchoice = $positions[$j]['dependchoice']; if ($prevtypeid != QUESPAGEBREAK && ($prevdependquestion != $qu['dependquestion'] || $prevdependchoice != $qu['dependchoice']) || $qu['dependquestion'] == 0 && $prevdependquestion != 0) { $sql = 'SELECT MAX(position) as maxpos FROM {questionnaire_question} ' . 'WHERE survey_id = ' . $questionnaire->survey->id . ' AND deleted = \'n\''; if ($record = $DB->get_record_sql($sql)) { $pos = $record->maxpos + 1; } else { $pos = 1; } $question = new stdClass(); $question->survey_id = $questionnaire->survey->id; $question->type_id = QUESPAGEBREAK; $question->position = $pos; $question->content = 'break'; if (!($newqid = $DB->insert_record('questionnaire_question', $question))) { return false; } $newpbids[] = $newqid; $movetopos = $i; $questionnaire = new questionnaire($questionnaire->id, null, $course, $cm); $questionnaire->move_question($newqid, $movetopos); } } } } if (empty($newpbids) && !$msg) { $msg = get_string('checkbreaksok', 'questionnaire'); } else { if ($newpbids) { $msg .= get_string('checkbreaksadded', 'questionnaire') . ' '; $newpbids = array_reverse($newpbids); $questionnaire = new questionnaire($questionnaire->id, null, $course, $cm); foreach ($newpbids as $newpbid) { $msg .= $questionnaire->questions[$newpbid]->position . ' '; } } } return $msg; }
set_field('questionnaire_question', 'position', $questionnaire->questions[$qid]->position, 'survey_id', $questionnaire->sid, 'position', $questionnaire->questions[$qid]->position + 1, 'deleted', 'n'); set_field('questionnaire_question', 'position', $questionnaire->questions[$qid]->position + 1, 'id', $qid); /// Nothing I do will seem to reload the form with new data, except for moving away from the page, so... redirect($CFG->wwwroot . '/mod/questionnaire/questions.php?id=' . $questionnaire->cm->id); $reload = true; } else { if (isset($qformdata->movebutton)) { /// Nothing I do will seem to reload the form with new data, except for moving away from the page, so... redirect($CFG->wwwroot . '/mod/questionnaire/questions.php?id=' . $questionnaire->cm->id . '&moveq=' . key($qformdata->movebutton)); $reload = true; } else { if (isset($qformdata->moveherebutton)) { /// Need to use the key, since IE returns the image position as the value rather than the specified /// value in the <input> tag. $qpos = key($qformdata->moveherebutton); $questionnaire->move_question($qformdata->moveq, $qpos); /// Nothing I do will seem to reload the form with new data, except for moving away from the page, so... redirect($CFG->wwwroot . '/mod/questionnaire/questions.php?id=' . $questionnaire->cm->id); $reload = true; } else { if (isset($qformdata->pos)) { /// Must be a position change... foreach ($qformdata->pos as $qidx => $position) { $newpos = $position; if ($questionnaire->questions[$qidx]->position != $newpos) { set_field('questionnaire_question', 'position', $newpos, 'id', $qidx); $oldpos = $questionnaire->questions[$qidx]->position; break; } } if ($newpos < $oldpos) {