mirror of
https://github.com/moodle/moodle.git
synced 2025-01-19 06:18:28 +01:00
241 lines
8.8 KiB
PHP
241 lines
8.8 KiB
PHP
<?php // $Id$
|
|
/**
|
|
* format.php - Default format class for file imports/exports. Doesn't do
|
|
* everything on it's own -- it needs to be extended.
|
|
*
|
|
* @version $Id$
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
|
|
* @package lesson
|
|
**/
|
|
|
|
// Included by import.php
|
|
|
|
class qformat_default {
|
|
|
|
var $displayerrors = true;
|
|
var $category = NULL;
|
|
var $questionids = array();
|
|
var $qtypeconvert = array(NUMERICAL => LESSON_NUMERICAL,
|
|
MULTICHOICE => LESSON_MULTICHOICE,
|
|
TRUEFALSE => LESSON_TRUEFALSE,
|
|
SHORTANSWER => LESSON_SHORTANSWER,
|
|
MATCH => LESSON_MATCHING
|
|
);
|
|
|
|
/// Importing functions
|
|
|
|
function importpreprocess() {
|
|
/// Does any pre-processing that may be desired
|
|
|
|
return true;
|
|
}
|
|
|
|
function importprocess($filename, $lesson, $pageid) {
|
|
/// Processes a given file. There's probably little need to change this
|
|
$timenow = time();
|
|
|
|
if (! $lines = $this->readdata($filename)) {
|
|
notify("File could not be read, or was empty");
|
|
return false;
|
|
}
|
|
|
|
if (! $questions = $this->readquestions($lines)) { // Extract all the questions
|
|
notify("There are no questions in this file!");
|
|
return false;
|
|
}
|
|
|
|
notify(get_string('importcount', 'lesson', sizeof($questions)));
|
|
|
|
$count = 0;
|
|
|
|
foreach ($questions as $question) { // Process and store each question
|
|
switch ($question->qtype) {
|
|
// the good ones
|
|
case SHORTANSWER :
|
|
case NUMERICAL :
|
|
case TRUEFALSE :
|
|
case MULTICHOICE :
|
|
case MATCH :
|
|
$count++;
|
|
|
|
echo "<hr><p><b>$count</b>. ".stripslashes($question->questiontext)."</p>";
|
|
$newpage = new stdClass;
|
|
$newpage->lessonid = $lesson->id;
|
|
$newpage->qtype = $this->qtypeconvert[$question->qtype];
|
|
switch ($question->qtype) {
|
|
case SHORTANSWER :
|
|
if (isset($question->usecase)) {
|
|
$newpage->qoption = $question->usecase;
|
|
}
|
|
break;
|
|
case MULTICHOICE :
|
|
if (isset($question->single)) {
|
|
$newpage->qoption = !$question->single;
|
|
}
|
|
break;
|
|
}
|
|
$newpage->timecreated = $timenow;
|
|
if ($question->name != $question->questiontext) {
|
|
$newpage->title = $question->name;
|
|
} else {
|
|
$newpage->title = "Page $count";
|
|
}
|
|
$newpage->contents = $question->questiontext;
|
|
|
|
// set up page links
|
|
if ($pageid) {
|
|
// the new page follows on from this page
|
|
if (!$page = get_record("lesson_pages", "id", $pageid)) {
|
|
error ("Format: Page $pageid not found");
|
|
}
|
|
$newpage->prevpageid = $pageid;
|
|
$newpage->nextpageid = $page->nextpageid;
|
|
// insert the page and reset $pageid
|
|
if (!$newpageid = insert_record("lesson_pages", $newpage)) {
|
|
error("Format: Could not insert new page!");
|
|
}
|
|
// update the linked list
|
|
if (!set_field("lesson_pages", "nextpageid", $newpageid, "id", $pageid)) {
|
|
error("Format: unable to update link");
|
|
}
|
|
|
|
} else {
|
|
// new page is the first page
|
|
// get the existing (first) page (if any)
|
|
if (!$page = get_record_select("lesson_pages", "lessonid = $lesson->id AND prevpageid = 0")) {
|
|
// there are no existing pages
|
|
$newpage->prevpageid = 0; // this is a first page
|
|
$newpage->nextpageid = 0; // this is the only page
|
|
$newpageid = insert_record("lesson_pages", $newpage);
|
|
if (!$newpageid) {
|
|
error("Insert page: new first page not inserted");
|
|
}
|
|
} else {
|
|
// there are existing pages put this at the start
|
|
$newpage->prevpageid = 0; // this is a first page
|
|
$newpage->nextpageid = $page->id;
|
|
$newpageid = insert_record("lesson_pages", $newpage);
|
|
if (!$newpageid) {
|
|
error("Insert page: first page not inserted");
|
|
}
|
|
// update the linked list
|
|
if (!set_field("lesson_pages", "prevpageid", $newpageid, "id", $page->id)) {
|
|
error("Insert page: unable to update link");
|
|
}
|
|
}
|
|
}
|
|
// reset $pageid and put the page ID in $question, used in save_question_option()
|
|
$pageid = $newpageid;
|
|
$question->id = $newpageid;
|
|
|
|
$this->questionids[] = $question->id;
|
|
|
|
// Now to save all the answers and type-specific options
|
|
|
|
$question->lessonid = $lesson->id; // needed for foreign key
|
|
$question->qtype = $this->qtypeconvert[$question->qtype];
|
|
$result = lesson_save_question_options($question);
|
|
|
|
if (!empty($result->error)) {
|
|
notify($result->error);
|
|
return false;
|
|
}
|
|
|
|
if (!empty($result->notice)) {
|
|
notify($result->notice);
|
|
return true;
|
|
}
|
|
break;
|
|
// the Bad ones
|
|
default :
|
|
notify(get_string('unsupportedqtype', 'lesson', $question->qtype));
|
|
}
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
function readdata($filename) {
|
|
/// Returns complete file with an array, one item per line
|
|
|
|
if (is_readable($filename)) {
|
|
$filearray = file($filename);
|
|
|
|
/// Check for Macintosh OS line returns (ie file on one line), and fix
|
|
if (ereg("\r", $filearray[0]) AND !ereg("\n", $filearray[0])) {
|
|
return explode("\r", $filearray[0]);
|
|
} else {
|
|
return $filearray;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function readquestions($lines) {
|
|
/// Parses an array of lines into an array of questions,
|
|
/// where each item is a question object as defined by
|
|
/// readquestion(). Questions are defined as anything
|
|
/// between blank lines.
|
|
|
|
$questions = array();
|
|
$currentquestion = array();
|
|
|
|
foreach ($lines as $line) {
|
|
$line = trim($line);
|
|
if (empty($line)) {
|
|
if (!empty($currentquestion)) {
|
|
if ($question = $this->readquestion($currentquestion)) {
|
|
$questions[] = $question;
|
|
}
|
|
$currentquestion = array();
|
|
}
|
|
} else {
|
|
$currentquestion[] = $line;
|
|
}
|
|
}
|
|
|
|
if (!empty($currentquestion)) { // There may be a final question
|
|
if ($question = $this->readquestion($currentquestion)) {
|
|
$questions[] = $question;
|
|
}
|
|
}
|
|
|
|
return $questions;
|
|
}
|
|
|
|
|
|
function readquestion($lines) {
|
|
/// Given an array of lines known to define a question in
|
|
/// this format, this function converts it into a question
|
|
/// object suitable for processing and insertion into Moodle.
|
|
|
|
echo "<p>This flash question format has not yet been completed!</p>";
|
|
|
|
return NULL;
|
|
}
|
|
|
|
function defaultquestion() {
|
|
// returns an "empty" question
|
|
// Somewhere to specify question parameters that are not handled
|
|
// by import but are required db fields.
|
|
// This should not be overridden.
|
|
$question = new stdClass();
|
|
$question->qoption = 0;
|
|
$question->layout = 1;
|
|
|
|
return $question;
|
|
}
|
|
|
|
function importpostprocess() {
|
|
/// Does any post-processing that may be desired
|
|
/// Argument is a simple array of question ids that
|
|
/// have just been added.
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
?>
|