Ejemplo n.º 1
0
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') . '&nbsp;';
            $newpbids = array_reverse($newpbids);
            $questionnaire = new questionnaire($questionnaire->id, null, $course, $cm);
            foreach ($newpbids as $newpbid) {
                $msg .= $questionnaire->questions[$newpbid]->position . '&nbsp;';
            }
        }
    }
    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 . '&amp;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) {