$string['conversionfailed'] = 'The assignment conversion was not successful. The log from the upgrade was: <br />{$a}';
$string['listnotupgraded'] = 'List assignments that have not been upgraded';
$string['listnotupgraded_desc'] = 'You can upgrade individual assignments from here';
+$string['noassignmentsselected'] = 'No assignments selected';
$string['noassignmentstoupgrade'] = 'There are no assignments that require upgrading';
$string['notsupported'] = '';
$string['notupgradedintro'] = 'This page lists the assignments created with an older version of Moodle that have not been upgraded to the new assignment module in Moodle 2.3. Not all assignments can be upgraded - if they were created with a custom assignment subtype, then that subtype will need to be upgraded to the new assignment plugin format in order to complete the upgrade.';
assignmentsinput = Y.one('input.selectedassignments');
assignmentsinput.set('value', selectedassignments.join(','));
if (selectedassignments.length == 0) {
- alert(M.str.assign.noassignmentsselected);
+ alert(M.str.tool_assignmentupgrade.noassignmentsselected);
e.preventDefault();
}
});
$output = '';
$output .= $this->header();
$this->page->requires->js_init_call('M.tool_assignmentupgrade.init_upgrade_table', array());
-
+ $this->page->requires->string_for_js('noassignmentsselected', 'tool_assignmentupgrade');
$output .= $this->heading(get_string('notupgradedtitle', 'tool_assignmentupgrade'));
$output .= $this->box(get_string('notupgradedintro', 'tool_assignmentupgrade'));
$enrol = new backup_nested_element('enrol', array('id'), array(
'enrol', 'status', 'sortorder', 'name', 'enrolperiod', 'enrolstartdate',
'enrolenddate', 'expirynotify', 'expirytreshold', 'notifyall',
- 'password', 'cost', 'currency', 'roleid', 'customint1', 'customint2', 'customint3',
- 'customint4', 'customchar1', 'customchar2', 'customdec1', 'customdec2',
- 'customtext1', 'customtext2', 'timecreated', 'timemodified'));
+ 'password', 'cost', 'currency', 'roleid',
+ 'customint1', 'customint2', 'customint3', 'customint4', 'customint5', 'customint6', 'customint7', 'customint8',
+ 'customchar1', 'customchar2', 'customchar3',
+ 'customdec1', 'customdec2',
+ 'customtext1', 'customtext2', 'customtext3', 'customtext4',
+ 'timecreated', 'timemodified'));
$userenrolments = new backup_nested_element('user_enrolments');
$this->title = get_string('pluginname', 'block_html');
}
+ function has_config() {
+ return true;
+ }
+
function applicable_formats() {
return array('all' => true);
}
* @return array
*/
function html_attributes() {
+ global $CFG;
+
$attributes = parent::html_attributes();
- if (!empty($this->config->classes)) {
- $attributes['class'] .= ' '.$this->config->classes;
+ if (!empty($CFG->block_html_allowcssclasses)) {
+ if (!empty($this->config->classes)) {
+ $attributes['class'] .= ' '.$this->config->classes;
+ }
}
return $attributes;
*/
class block_html_edit_form extends block_edit_form {
protected function specific_definition($mform) {
+ global $CFG;
+
// Fields for editing HTML block title and contents.
$mform->addElement('header', 'configheader', get_string('blocksettings', 'block'));
$mform->addRule('config_text', null, 'required', null, 'client');
$mform->setType('config_text', PARAM_RAW); // XSS is prevented when printing the block contents and serving files
- $mform->addElement('text', 'config_classes', get_string('configclasses', 'block_html'));
- $mform->setType('config_classes', PARAM_TEXT);
- $mform->addHelpButton('config_classes', 'configclasses', 'block_html');
+ if (!empty($CFG->block_html_allowcssclasses)) {
+ $mform->addElement('text', 'config_classes', get_string('configclasses', 'block_html'));
+ $mform->setType('config_classes', PARAM_TEXT);
+ $mform->addHelpButton('config_classes', 'configclasses', 'block_html');
+ }
}
function set_data($defaults) {
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-$string['configclasses'] = 'Additional HTML classes';
+$string['allowadditionalcssclasses'] = 'Allow additional CSS classes';
+$string['configallowadditionalcssclasses'] = 'Adds a configuration option to HTML block instances allowing additional CSS classes to be set.';
+$string['configclasses'] = 'Additional CSS classes';
$string['configclasses_help'] = 'The purpose of this configuration is to aid with theming by helping distinguish HTML blocks from each other. Any CSS classes entered here (space delimited) will be appended to the block\'s default classes.';
$string['configcontent'] = 'Content';
$string['configtitle'] = 'Block title';
--- /dev/null
+<?php
+
+defined('MOODLE_INTERNAL') || die;
+
+if ($ADMIN->fulltree) {
+ $settings->add(new admin_setting_configcheckbox('block_html_allowcssclasses', get_string('allowadditionalcssclasses', 'block_html'),
+ get_string('configallowadditionalcssclasses', 'block_html'), 0));
+}
+
+
function print_log_csv($course, $user, $date, $order='l.time DESC', $modname,
$modid, $modaction, $groupid) {
- global $DB;
+ global $DB, $CFG;
+
+ require_once($CFG->libdir . '/csvlib.class.php');
- $text = get_string('course')."\t".get_string('time')."\t".get_string('ip_address')."\t".
- get_string('fullnameuser')."\t".get_string('action')."\t".get_string('info');
+ $csvexporter = new csv_export_writer('tab');
+
+ $header = array();
+ $header[] = get_string('course');
+ $header[] = get_string('time');
+ $header[] = get_string('ip_address');
+ $header[] = get_string('fullnameuser');
+ $header[] = get_string('action');
+ $header[] = get_string('info');
if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
$modname, $modid, $modaction, $groupid)) {
$strftimedatetime = get_string("strftimedatetime");
- $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false);
- $filename .= '.txt';
- header("Content-Type: application/download\n");
- header("Content-Disposition: attachment; filename=\"$filename\"");
- header("Expires: 0");
- header("Cache-Control: must-revalidate,post-check=0,pre-check=0");
- header("Pragma: public");
-
- echo get_string('savedat').userdate(time(), $strftimedatetime)."\n";
- echo $text."\n";
+ $csvexporter->set_filename('logs', '.txt');
+ $title = array(get_string('savedat').userdate(time(), $strftimedatetime));
+ $csvexporter->add_data($title);
+ $csvexporter->add_data($header);
if (empty($logs['logs'])) {
return true;
$firstField = format_string($courses[$log->course], true, array('context' => $coursecontext));
$fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
$row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.' '.$log->action, $log->info);
- $text = implode("\t", $row);
- echo $text." \n";
+ $csvexporter->add_data($row);
}
+ $csvexporter->download_file();
return true;
}
* @return array
*/
public static function get_info_letters($courseid) {
+ global $SITE;
if (self::$letterinfo !== null) {
return self::$letterinfo;
}
$canmanage = has_capability('moodle/grade:manage', $context);
$canmanageletters = has_capability('moodle/grade:manageletters', $context);
if ($canmanage || $canmanageletters) {
+ // Redirect to system context when report is accessed from admin settings MDL-31633
+ if ($context->instanceid == $SITE->id) {
+ $param = array('edit' => 1);
+ } else {
+ $param = array('edit' => 1,'id' => $context->id);
+ }
self::$letterinfo = array(
'view' => new grade_plugin_info('view', new moodle_url('/grade/edit/letter/index.php', array('id'=>$context->id)), get_string('view')),
- 'edit' => new grade_plugin_info('edit', new moodle_url('/grade/edit/letter/index.php', array('edit'=>1,'id'=>$context->id)), get_string('edit'))
+ 'edit' => new grade_plugin_info('edit', new moodle_url('/grade/edit/letter/index.php', $param), get_string('edit'))
);
} else {
self::$letterinfo = false;
debugging('set_module_viewed must be called before header is printed',
DEBUG_DEVELOPER);
}
+
// Don't do anything if view condition is not turned on
if ($cm->completionview == COMPLETION_VIEW_NOT_REQUIRED || !$this->is_enabled($cm)) {
return;
}
+
// Get current completion state
- $data = $this->get_data($cm, $userid);
+ $data = $this->get_data($cm, false, $userid);
+
// If we already viewed it, don't do anything
if ($data->viewed == COMPLETION_VIEWED) {
return;
}
+
// OK, change state, save it, and update completion
$data->viewed = COMPLETION_VIEWED;
$this->internal_set_data($cm, $data);
<?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="lib/db" VERSION="20120717" COMMENT="XMLDB file for core Moodle tables"
+<XMLDB PATH="lib/db" VERSION="20120825" COMMENT="XMLDB file for core Moodle tables"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
>
<FIELD NAME="customint1" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="roleid" NEXT="customint2"/>
<FIELD NAME="customint2" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint1" NEXT="customint3"/>
<FIELD NAME="customint3" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint2" NEXT="customint4"/>
- <FIELD NAME="customint4" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint3" NEXT="customchar1"/>
- <FIELD NAME="customchar1" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general short name" PREVIOUS="customint4" NEXT="customchar2"/>
- <FIELD NAME="customchar2" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general short name" PREVIOUS="customchar1" NEXT="customdec1"/>
- <FIELD NAME="customdec1" TYPE="number" LENGTH="12" NOTNULL="false" SEQUENCE="false" DECIMALS="7" COMMENT="Custom - general decimal" PREVIOUS="customchar2" NEXT="customdec2"/>
+ <FIELD NAME="customint4" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint3" NEXT="customint5"/>
+ <FIELD NAME="customint5" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint4" NEXT="customint6"/>
+ <FIELD NAME="customint6" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint5" NEXT="customint7"/>
+ <FIELD NAME="customint7" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint6" NEXT="customint8"/>
+ <FIELD NAME="customint8" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general int" PREVIOUS="customint7" NEXT="customchar1"/>
+ <FIELD NAME="customchar1" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general short name" PREVIOUS="customint8" NEXT="customchar2"/>
+ <FIELD NAME="customchar2" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general short name" PREVIOUS="customchar1" NEXT="customchar3"/>
+ <FIELD NAME="customchar3" TYPE="char" LENGTH="1333" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general short name" PREVIOUS="customchar2" NEXT="customdec1"/>
+ <FIELD NAME="customdec1" TYPE="number" LENGTH="12" NOTNULL="false" SEQUENCE="false" DECIMALS="7" COMMENT="Custom - general decimal" PREVIOUS="customchar3" NEXT="customdec2"/>
<FIELD NAME="customdec2" TYPE="number" LENGTH="12" NOTNULL="false" SEQUENCE="false" DECIMALS="7" COMMENT="Custom - general decimal" PREVIOUS="customdec1" NEXT="customtext1"/>
<FIELD NAME="customtext1" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general text" PREVIOUS="customdec2" NEXT="customtext2"/>
- <FIELD NAME="customtext2" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general text" PREVIOUS="customtext1" NEXT="timecreated"/>
- <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="customtext2" NEXT="timemodified"/>
+ <FIELD NAME="customtext2" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general text" PREVIOUS="customtext1" NEXT="customtext3"/>
+ <FIELD NAME="customtext3" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general text" PREVIOUS="customtext2" NEXT="customtext4"/>
+ <FIELD NAME="customtext4" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Custom - general text" PREVIOUS="customtext3" NEXT="timecreated"/>
+ <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="customtext4" NEXT="timemodified"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timecreated"/>
</FIELDS>
<KEYS>
upgrade_main_savepoint(true, 2012081600.01);
}
+ if ($oldversion < 2012082300.01) {
+ // Add more custom enrol fields.
+ $table = new xmldb_table('enrol');
+
+ $field = new xmldb_field('customint5', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint4');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $field = new xmldb_field('customint6', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint5');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $field = new xmldb_field('customint7', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint6');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $field = new xmldb_field('customint8', XMLDB_TYPE_INTEGER, '10', null, null, null, null, 'customint7');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $field = new xmldb_field('customchar3', XMLDB_TYPE_CHAR, '1333', null, null, null, null, 'customchar2');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $field = new xmldb_field('customtext3', XMLDB_TYPE_TEXT, null, null, null, null, null, 'customtext2');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ $field = new xmldb_field('customtext4', XMLDB_TYPE_TEXT, null, null, null, null, null, 'customtext3');
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ // Main savepoint reached.
+ upgrade_main_savepoint(true, 2012082300.01);
+ }
+
return true;
}
debugging('Coding problem - missing course modinfo property in get_fast_modinfo() call');
}
+ if (!property_exists($course, 'sectioncache')) {
+ debugging('Coding problem - missing course sectioncache property in get_fast_modinfo() call');
+ }
+
unset($cache[$course->id]); // prevent potential reference problems when switching users
$cache[$course->id] = new course_modinfo($course, $userid);
}
/**
- * match grade options
- * if no match return error or match nearest
+ * Check whether a given grade is one of a list of allowed options. If not,
+ * depending on $matchgrades, either return the nearest match, or return false
+ * to signal an error.
* @param array $gradeoptionsfull list of valid options
* @param int $grade grade to be tested
* @param string $matchgrades 'error' or 'nearest'
- * @return mixed either 'fixed' value or false if erro
+ * @return mixed either 'fixed' value or false if error.
*/
-function match_grade_options($gradeoptionsfull, $grade, $matchgrades='error') {
+function match_grade_options($gradeoptionsfull, $grade, $matchgrades = 'error') {
+
if ($matchgrades == 'error') {
- // if we just need an error...
+ // (Almost) exact match, or an error.
foreach ($gradeoptionsfull as $value => $option) {
- // slightly fuzzy test, never check floats for equality :-)
+ // Slightly fuzzy test, never check floats for equality.
if (abs($grade - $value) < 0.00001) {
- return $grade;
+ return $value; // Be sure the return the proper value.
}
}
- // didn't find a match so that's an error
+ // Didn't find a match so that's an error.
return false;
+
} else if ($matchgrades == 'nearest') {
- // work out nearest value
- $hownear = array();
+ // Work out nearest value
+ $best = false;
+ $bestmismatch = 2;
foreach ($gradeoptionsfull as $value => $option) {
- if ($grade==$value) {
- return $grade;
+ $newmismatch = abs($grade - $value);
+ if ($newmismatch < $bestmismatch) {
+ $best = $value;
+ $bestmismatch = $newmismatch;
}
- $hownear[ $value ] = abs( $grade - $value );
}
- // reverse sort list of deltas and grab the last (smallest)
- asort( $hownear, SORT_NUMERIC );
- reset( $hownear );
- return key( $hownear );
+ return $best;
+
} else {
- return false;
+ // Unknow option passed.
+ throw new coding_exception('Unknown $matchgrades ' . $matchgrades .
+ ' passed to match_grade_options');
}
}
->will($this->returnValue(true));
$c->expects($this->at(1))
->method('get_data')
- ->with($cm, 1337)
+ ->with($cm, false, 1337)
->will($this->returnValue((object)array('viewed'=>COMPLETION_NOT_VIEWED)));
$c->expects($this->at(2))
->method('internal_set_data')
array(0 => 't1', 1 => 't2', 2 => 't3'));
}
+ public function test_match_grade_options() {
+ $gradeoptions = question_bank::fraction_options_full();
+
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.3333333, 'error'));
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.333333, 'error'));
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.33333, 'error'));
+ $this->assertFalse(match_grade_options($gradeoptions, 0.3333, 'error'));
+
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.3333333, 'nearest'));
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.333333, 'nearest'));
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.33333, 'nearest'));
+ $this->assertEquals(0.3333333, match_grade_options($gradeoptions, 0.33, 'nearest'));
+
+ $this->assertEquals(-0.1428571, match_grade_options($gradeoptions, -0.15, 'nearest'));
+ }
}
$update->duedate = $formdata->duedate;
$update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate;
$update->grade = $formdata->grade;
- $update->completionsubmit = $formdata->completionsubmit;
+ $update->completionsubmit = !empty($formdata->completionsubmit);
$returnid = $DB->insert_record('assign', $update);
$this->instance = $DB->get_record('assign', array('id'=>$returnid), '*', MUST_EXIST);
// cache the course record
$update->duedate = $formdata->duedate;
$update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate;
$update->grade = $formdata->grade;
- $update->completionsubmit = $formdata->completionsubmit;
+ $update->completionsubmit = !empty($formdata->completionsubmit);
$result = $DB->update_record('assign', $update);
$this->instance = $DB->get_record('assign', array('id'=>$update->id), '*', MUST_EXIST);
$string['delete_old_items'] = 'Delete old items';
$string['delete_template'] = 'Delete template';
$string['delete_templates'] = 'Delete template...';
-$string['depending'] = 'depending items';
-$string['depending_help'] = 'Depending items allow you to show items depend on values from other items.<br />
-<strong>Here an build example to use it:</strong><br />
+$string['depending'] = 'Dependencies';
+$string['depending_help'] = 'It is possible to show an item depending on the value of another item.<br />
+<strong>Here is an example.</strong><br />
<ul>
-<li>First create an item on which value other items depends.</li>
-<li>Next add a pagebreak.</li>
-<li>Next add the items depend on the item-value before<br />
-Choose in the item creation-form the item in the list "depend item" and put the needed value into the textbox "depend value".</li>
+<li>First, create an item on which another item will depend on.</li>
+<li>Next, add a pagebreak.</li>
+<li>Then add the items dependant on the value of the item created before. Choose the item from the list labelled "Dependence item" and write the required value in the textbox labelled "Dependence value".</li>
</ul>
-<strong>The structure should looks like this:</strong>
+<strong>The item structure should look like this.</strong>
<ol>
-<li>Item Q: do you have a car? A: yes/no</li>
+<li>Item Q: Do you have a car? A: yes/no</li>
<li>Pagebreak</li>
-<li>Item Q: what color has your car?<br />
+<li>Item Q: What colour is your car?<br />
(this item depends on item 1 with value = yes)</li>
-<li>Item Q: why you have not a car?<br />
+<li>Item Q: Why don\'t you have a car?<br />
(this item depends on item 1 with value = no)</li>
<li> ... other items</li>
-</ol>
-That is all. Have fun!';
-$string['dependitem'] = 'depend item';
-$string['dependvalue'] = 'depend value';
+</ol>';
+$string['dependitem'] = 'Dependence item';
+$string['dependvalue'] = 'Dependence value';
$string['description'] = 'Description';
$string['do_not_analyse_empty_submits'] = 'Do not analyse empty submits';
$string['dropdown'] = 'Multiple choice - single answer allowed (dropdownlist)';
Overview of this plugin type at http://docs.moodle.org/dev/Quiz_reports
-=== earlier versions ===
+=== 2.3 ===
-* ... API changes were not documented properly. Sorry. (There weren't many!)
+* Support for the old way of doing cron in a separate cron.php file has been removed.
+Instead, you need a lib.php file inside the plugin with a cron function
+called quiz_myreportname_cron(). The statistics report is an example of how
+it should be done.
+
+* There was a big refactor of the quiz reports, in issues MDL-32300, MDL-32322 and MDL-3030.
+It is difficult to explain the changes. Probably the best way to understand what
+happened is to look at
+ git log mod/quiz/report/overview
+ git log mod/quiz/report/responses
+and so on. Here are some notes on a few of the changes:
+
+The class quiz_attempt_report was renamed to quiz_attempts_report (with an extra s).
+
+Some globally defined constants with the prefix QUIZ_REPORT_ATTEMPTS_ moved into
+the quiz_attempts_report class. Specifically
+
+quiz_attempts_report::ALL_WITH replaces QUIZ_REPORT_ATTEMPTS_ALL
+quiz_attempts_report::ENROLLED_ALL replaces QUIZ_REPORT_ATTEMPTS_ALL_STUDENTS
+quiz_attempts_report::ENROLLED_WITH replaces QUIZ_REPORT_ATTEMPTS_STUDENTS_WITH
+quiz_attempts_report::ENROLLED_WITHOUT replaces QUIZ_REPORT_ATTEMPTS_STUDENTS_WITH_NO
+
+Your if you have a table class, it needs to be renamed like
+quiz_report_myreportname_table -> quiz_myreportname_table. That is, all the
+class names in your plugin should start with the frankenstyle plugin name
+quiz_myreportname.
=== 2.2 ===
frequency should be defined in version.php, not in the quiz_reports table.
-=== 2.3 ===
+=== earlier versions ===
-* Support for the old way of doing cron in a separate cron.php file has been removed.
+* ... API changes were not documented properly. Sorry. (There weren't many!)
WHERE i.id = d.datasetdefinition AND i.category = ?";
if ($records = $DB->get_records_sql($sql, array($category))) {
foreach ($records as $r) {
+ $key = "$r->type-$r->category-$r->name";
$sql1 = "SELECT q.*
FROM {question} q
WHERE q.id = ?";
- if (!isset ($datasetdefs["$r->type-$r->category-$r->name"])) {
- $datasetdefs["$r->type-$r->category-$r->name"]= $r;
+ if (!isset($datasetdefs[$key])) {
+ $datasetdefs[$key] = $r;
}
if ($questionb = $DB->get_records_sql($sql1, array($r->question))) {
- $datasetdefs["$r->type-$r->category-$r->name"]->questions[
- $r->question]->name = $questionb[$r->question]->name;
- $datasetdefs["$r->type-$r->category-$r->name"]->questions[
- $r->question]->id = $questionb[$r->question]->id;
+ $datasetdefs[$key]->questions[$r->question] = new stdClass();
+ $datasetdefs[$key]->questions[$r->question]->name =
+ $questionb[$r->question]->name;
+ $datasetdefs[$key]->questions[$r->question]->id =
+ $questionb[$r->question]->id;
}
}
}
$string['addmoreqblanks'] = '{no} More Sets of Blanks';
$string['availablechoices'] = 'Available choices';
-$string['correctansweris'] = 'The correct answer is: {$a}.';
+$string['correctansweris'] = 'The correct answer is: {$a}';
$string['filloutthreeqsandtwoas'] = 'You must provide at least two questions and three answers. You can provide extra wrong answers by giving an answer with a blank question. Entries where both the question and the answer are blank will be ignored.';
$string['nomatchinganswer'] = 'You must specify an answer matching the question \'{$a}\'.';
$string['nomatchinganswerforq'] = 'You must specify an answer for this question.';
$string['pluginnameediting'] = 'Editing an Embedded answers (Cloze) question';
$string['pluginnamesummary'] = 'Questions of this type are very flexible, but can only be created by entering text containing special codes that create embedded multiple-choice, short answers and numerical questions.';
$string['qtypenotrecognized'] = 'questiontype {$a} not recognized';
-$string['questionnadded'] = 'Question added';
$string['questiondefinition'] = 'Question definition';
$string['questiondeleted'] = 'Question deleted';
$string['questioninquiz'] = '
<li>change the questions order in the text,</li>
<li>change their question type (numerical, shortanswer, multiple choice). </li></ul>
';
+$string['questionsadded'] = 'Question added';
$string['questionsless'] = '{$a} question(s) less than in the multianswer question stored in the database';
$string['questionsmissing'] = 'The question text must include at least one embedded answer.';
$string['questionsmore'] = '{$a} question(s) more than in the multianswer question stored in the database';
$string['choiceno'] = 'Choice {$a}';
$string['choices'] = 'Available choices';
$string['clozeaid'] = 'Enter missing word';
-$string['correctansweris'] = 'The correct answer is: {$a}.';
+$string['correctansweris'] = 'The correct answer is: {$a}';
$string['correctfeedback'] = 'For any correct response';
$string['errgradesetanswerblank'] = 'Grade set, but the Answer is blank';
$string['errfractionsaddwrong'] = 'The positive grades you have chosen do not add up to 100%<br />Instead, they add up to {$a}%';
$string['caseno'] = 'No, case is unimportant';
$string['casesensitive'] = 'Case sensitivity';
$string['caseyes'] = 'Yes, case must match';
-$string['correctansweris'] = 'The correct answer is: {$a}.';
+$string['correctansweris'] = 'The correct answer is: {$a}';
$string['correctanswers'] = 'Correct answers';
$string['filloutoneanswer'] = 'You must provide at least one possible answer. Answers left blank will not be used. \'*\' can be used as a wildcard to match any characters. The first matching answer will be used to determine the score and feedback.';
$string['notenoughanswers'] = 'This type of question requires at least {$a} answers';
h1.headerheading {margin:14px 11px 8px 11px;float:left;font-size:200%;}
h2.main, h3.main, h4.main {margin:1em;padding:0;text-align:center;}
-p {margin:0}
-
/* page-header */
#page-header{line-height:0;overflow:hidden;}
defined('MOODLE_INTERNAL') || die();
-$version = 2012082300.00; // YYYYMMDD = weekly release date of this DEV branch
+$version = 2012082300.01; // YYYYMMDD = weekly release date of this DEV branch
// RR = release increments - 00 in DEV branches
// .XX = incremental changes