Расширить плагин Qformat для Moodle - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу расширить этот плагин для поддержки более 4 вариантов вопросов и более 2 ответов.Может кто-нибудь помочь мне с обобщенным плагином или кодом для расширения этого плагина?Также вставляем код из файла плагина ниже -

https://moodle.org/plugins/qformat_csv

public function provide_import() {
    return true;
}

public function provide_export() {
    return true;
}

/**
 * @return string the file extension (including .) that is normally used for
 * files handled by this plugin.
 */
public function export_file_extension() {
    return '.csv';
}

public function readquestions($lines) {
    global $CFG;
    require_once($CFG->libdir . '/csvlib.class.php');
    question_bank::get_qtype('multianswer'); // Ensure the multianswer code is loaded.
    $questions = array();
    $question = $this->defaultquestion();
    $headers = explode(',', $lines[0]);
    $answertwo = 0;
    foreach ($headers as $key => $value) {
        if (trim($value) == "Answer 2") {
            $answertwo = $key;
        }
    }
    // Get All the Header Values from the CSV file.
    for ($rownum = 1; $rownum < count($lines); $rownum++) {
        $rowdata = str_getcsv($lines[$rownum], ",", '"'); // Ignore the commas(,) within the double quotes (").
        $columncount = count($rowdata);
        $headerscount = count($headers);
        if ($columncount != $headerscount || $columncount != 7  || $headerscount != 7) {
            if ($columncount > $headerscount ) {
                // There are more than 7 values or there will be extra comma making them more then 7 values.
                    echo get_string('commma_error', 'qformat_csv', $rownum);
                return 0;
            } else if ($columncount < $headerscount) {
                // Entire question with options and answer is not in one line, new line found.
                    echo get_string('newline_error', 'qformat_csv', $rownum);
                return 0;
            } else {
                // There are more than 7 values or there will be extra comma making them more then 7 values.
                    echo get_string('csv_file_error', 'qformat_csv', $rownum);
                return 0;
            }
        }
        for ($linedata = 0; $linedata < count($rowdata); $linedata++) {
            if ($answertwo != 0 && !empty(trim($rowdata[$answertwo]))) {
                $fraction = 0.5;
                $question->single = 0;
            } else {
                $fraction = 1;
                $question->single = 1;
            }

            $question->qtype = 'multichoice';
            $question->name = $this->create_default_question_name($rownum, get_string('questionname', 'question'));
            if ($headers[$linedata] == 'questiontext') {
                  $question->questiontext = htmlspecialchars(trim($rowdata[$linedata]), ENT_NOQUOTES);
            } else if ($headers[$linedata] == 'generalfeedback') {
                // If extra column is provide with header 'generalfeedback' then that feedback will get applied.
                $question->generalfeedback = $rowdata[$linedata];
                $question->generalfeedbackformat = FORMAT_HTML;
            } else if ($headers[$linedata] == 'defaultgrade') {
                $question->defaultgrade = $this->text_field($rowdata[$linedata]);
            } else if ($headers[$linedata] == 'penalty') {
                $question->penalty = $rowdata[$linedata];
            } else if ($headers[$linedata] == 'hidden') {
                $question->hidden = $rowdata[$linedata];
            } else if ($headers[$linedata] == 'answernumbering') {
                $question->answernumbering = $rowdata[$linedata];
            } else if ($headers[$linedata] == 'correctfeedback') {
                $question->correctfeedback = $this->text_field($rowdata[$linedata]);
            } else if ($headers[$linedata] == 'partiallycorrectfeedback') {
                $question->partiallycorrectfeedback = $this->text_field($rowdata[$linedata]);
            } else if ($headers[$linedata] == 'incorrectfeedback') {
                $question->incorrectfeedback = $this->text_field($rowdata[$linedata]);
            } else if ($headers[$linedata] == 'A') {
                $correctans1 = $linedata + 4;
                $correctans2 = $linedata + 5;
                $question->answer[] = $this->text_field($rowdata[$linedata]);
                if (trim($rowdata[$correctans1]) == 'A' || trim($rowdata[$correctans2]) == 'A') {
                    $question->fraction[]  = $fraction;
                } else {
                    $question->fraction[] = 0;
                }
                                                $question->feedback[] = $this->text_field('');
            } else if ($headers[$linedata] == 'B') {
                $correctans1 = $linedata + 3;
                $correctans2 = $linedata + 4;
                $question->answer[] = $this->text_field($rowdata[$linedata]);
                if (trim($rowdata[$correctans1]) == 'B' || trim($rowdata[$correctans2]) == 'B') {
                    $question->fraction[]  = $fraction;
                } else {
                    $question->fraction[] = 0;
                }
                $question->feedback[] = $this->text_field('');
            } else if ($headers[$linedata] == 'C') {
                $correctans1 = $linedata + 2;
                $correctans2 = $linedata + 3;
                $question->answer[] = $this->text_field($rowdata[$linedata]);
                if (trim($rowdata[$correctans1]) == 'C' || trim($rowdata[$correctans2]) == 'C') {
                    $question->fraction[]  = $fraction;
                } else {
                    $question->fraction[] = 0;
                }
                $question->feedback[] = $this->text_field('');
            } else if ($headers[$linedata] == 'D') {
                $correctans1 = $linedata + 1;
                $correctans2 = $linedata + 2;
                $question->answer[] = $this->text_field($rowdata[$linedata]);
                if (trim($rowdata[$correctans1]) == 'D' || trim($rowdata[$correctans2]) == 'D') {
                    $question->fraction[]  = $fraction;
                } else {
                    $question->fraction[] = 0;
                }
                $question->feedback[] = $this->text_field('');
            }
        }
                $questions[] = $question;
                // Clear array for next question set.
                $question = $this->defaultquestion();
    }
     return $questions;
}
protected function text_field($text) {
    return array(
        'text' => htmlspecialchars(trim($text), ENT_NOQUOTES),
        'format' => FORMAT_HTML,
        'files' => array(),
    );
}

public function readquestion($lines) {
    // This is no longer needed but might still be called by default.php.
    return;
}

public function writequestion($question) {
    global $OUTPUT;
    // Output depends on question type.
    if ($globals['header']) {
        if ($question->qtype == 'category') {// If Write "category to file" i selected then no need to add "\n" in header.
            $expout = "questiontext,A,B,C,D,Answer 1,Answer 2";
        } else {
            $expout .= "questiontext,A,B,C,D,Answer 1,Answer 2\n";
        }
        $globals['header'] = false;
    }
      $answercount = 0;
      $rightanswercount = 0;
    switch($question->qtype) {
        case 'multichoice':
            if (count($question->options->answers) != 4 ) {
                break;
            }
            $expout .= '"'.$question->questiontext.'"'.',';
            foreach ($question->options->answers as $answer) {
                $answercount++;
                if ($answer->fraction == 1 && $question->options->single) {
                    switch ($answercount) {
                        case 1:
                            $rightanswer = 'A'.',';
                            break;
                        case 2:
                            $rightanswer = 'B'.',';
                            break;
                        case 3:
                            $rightanswer = 'C'.',';
                            break;
                        case 4:
                            $rightanswer = 'D'.',';
                            break;
                        default:
                            $rightanswer = '';
                            break;
                    }
                } else if ($answer->fraction == 0.5 && !$question->options->single) {
                    $rightanswercount ++;
                    $comma = "";
                    if ( $rightanswercount <= 1 ) {
                        $comma = ","; // Add comma  to first answer i.e. to 'Answer 1'.
                    }
                    switch ($answercount) {
                        case 1:
                            $rightanswer .= 'A'.$comma;
                            break;
                        case 2:
                            $rightanswer .= 'B'.$comma;
                            break;
                        case 3:
                            $rightanswer .= 'C'.$comma;
                            break;
                        case 4:
                            $rightanswer .= 'D'.$comma;
                            break;
                        default:
                            $rightanswer = '';
                            break;
                    }

                }
                $expout .= '"'.$answer->answer.'"'.',';
            }
            $expout .= $rightanswer;
        break;
    }

    return $expout;
}

}

...