From 1554cfcd8fc9a7392586df8dfb0dc0c7eae5087a Mon Sep 17 00:00:00 2001 From: Dan Marsden Date: Fri, 5 Jul 2013 13:18:10 +1200 Subject: [PATCH] MDL-39926 SCORM: new Objectives report type --- .../lang/en/scormreport_objectives.php | 32 + mod/scorm/report/objectives/report.php | 661 ++++++++++++++++++ .../objectives/responsessettings_form.php | 60 ++ mod/scorm/report/objectives/version.php | 30 + 4 files changed, 783 insertions(+) create mode 100644 mod/scorm/report/objectives/lang/en/scormreport_objectives.php create mode 100644 mod/scorm/report/objectives/report.php create mode 100644 mod/scorm/report/objectives/responsessettings_form.php create mode 100644 mod/scorm/report/objectives/version.php diff --git a/mod/scorm/report/objectives/lang/en/scormreport_objectives.php b/mod/scorm/report/objectives/lang/en/scormreport_objectives.php new file mode 100644 index 00000000000..7f2d17f8a3d --- /dev/null +++ b/mod/scorm/report/objectives/lang/en/scormreport_objectives.php @@ -0,0 +1,32 @@ +. + +/** + * Strings for component 'scorm_objectives' report plugin + * + * @package scormreport_objectives + * @author Dan Marsden + * @copyright 2013 Dan Marsden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$string['pluginname'] = 'Objectives report'; +$string['objectivex'] = 'Objective {$a}'; +$string['objectivescore'] = 'Show objective score'; +$string['score'] = 'score'; +$string['status'] = 'status'; diff --git a/mod/scorm/report/objectives/report.php b/mod/scorm/report/objectives/report.php new file mode 100644 index 00000000000..da3de0573ae --- /dev/null +++ b/mod/scorm/report/objectives/report.php @@ -0,0 +1,661 @@ +. +/** + * Core Report class of objectives SCORM report plugin + * @package scormreport_objectives + * @author Dan Marsden + * @copyright 2013 Dan Marsden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->dirroot.'/mod/scorm/report/objectives/responsessettings_form.php'); + +/** + * Objectives report class + * + * @copyright 2013 Dan Marsden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class scorm_objectives_report extends scorm_default_report { + /** + * displays the full report + * @param stdClass $scorm full SCORM object + * @param stdClass $cm - full course_module object + * @param stdClass $course - full course object + * @param string $download - type of download being requested + */ + public function display($scorm, $cm, $course, $download) { + global $CFG, $DB, $OUTPUT, $PAGE; + + $contextmodule = context_module::instance($cm->id); + $action = optional_param('action', '', PARAM_ALPHA); + $attemptids = optional_param_array('attemptid', array(), PARAM_RAW); + $attemptsmode = optional_param('attemptsmode', SCORM_REPORT_ATTEMPTS_ALL_STUDENTS, PARAM_INT); + $PAGE->set_url(new moodle_url($PAGE->url, array('attemptsmode' => $attemptsmode))); + + if ($action == 'delete' && has_capability('mod/scorm:deleteresponses', $contextmodule) && confirm_sesskey()) { + if (scorm_delete_responses($attemptids, $scorm)) { // Delete responses. + add_to_log($course->id, 'scorm', 'delete attempts', 'report.php?id=' . $cm->id, implode(",", $attemptids), $cm->id); + echo $OUTPUT->notification(get_string('scormresponsedeleted', 'scorm'), 'notifysuccess'); + } + } + // Find out current groups mode. + $currentgroup = groups_get_activity_group($cm, true); + + // Detailed report. + $mform = new mod_scorm_report_objectives_settings($PAGE->url, compact('currentgroup')); + if ($fromform = $mform->get_data()) { + $pagesize = $fromform->pagesize; + $showobjectivescore = $fromform->objectivescore; + set_user_preference('scorm_report_pagesize', $pagesize); + set_user_preference('scorm_report_objectives_score', $showobjectivescore); + } else { + $pagesize = get_user_preferences('scorm_report_pagesize', 0); + $showobjectivescore = get_user_preferences('scorm_report_objectives_score', 0); + } + if ($pagesize < 1) { + $pagesize = SCORM_REPORT_DEFAULT_PAGE_SIZE; + } + + // Select group menu. + $displayoptions = array(); + $displayoptions['attemptsmode'] = $attemptsmode; + $displayoptions['objectivescore'] = $showobjectivescore; + + $mform->set_data($displayoptions + array('pagesize' => $pagesize)); + if ($groupmode = groups_get_activity_groupmode($cm)) { // Groups are being used. + if (!$download) { + groups_print_activity_menu($cm, new moodle_url($PAGE->url, $displayoptions)); + } + } + $formattextoptions = array('context' => context_course::instance($course->id)); + + // We only want to show the checkbox to delete attempts + // if the user has permissions and if the report mode is showing attempts. + $candelete = has_capability('mod/scorm:deleteresponses', $contextmodule) + && ($attemptsmode != SCORM_REPORT_ATTEMPTS_STUDENTS_WITH_NO); + // Select the students. + $nostudents = false; + + if (empty($currentgroup)) { + // All users who can attempt scoes. + if (!$students = get_users_by_capability($contextmodule, 'mod/scorm:savetrack', 'u.id', '', '', '', '', '', false)) { + echo $OUTPUT->notification(get_string('nostudentsyet')); + $nostudents = true; + $allowedlist = ''; + } else { + $allowedlist = array_keys($students); + } + unset($students); + } else { + // All users who can attempt scoes and who are in the currently selected group. + $groupstudents = get_users_by_capability($contextmodule, 'mod/scorm:savetrack', + 'u.id', '', '', '', $currentgroup, '', false); + if (!$groupstudents) { + echo $OUTPUT->notification(get_string('nostudentsingroup')); + $nostudents = true; + $groupstudents = array(); + } + $allowedlist = array_keys($groupstudents); + unset($groupstudents); + } + if ( !$nostudents ) { + // Now check if asked download of data. + $coursecontext = context_course::instance($course->id); + if ($download) { + $filename = clean_filename("$course->shortname ".format_string($scorm->name, true, $formattextoptions)); + } + + // Define table columns. + $columns = array(); + $headers = array(); + if (!$download && $candelete) { + $columns[] = 'checkbox'; + $headers[] = null; + } + if (!$download && $CFG->grade_report_showuserimage) { + $columns[] = 'picture'; + $headers[] = ''; + } + $columns[] = 'fullname'; + $headers[] = get_string('name'); + + $extrafields = get_extra_user_fields($coursecontext); + foreach ($extrafields as $field) { + $columns[] = $field; + $headers[] = get_user_field_name($field); + } + $columns[] = 'attempt'; + $headers[] = get_string('attempt', 'scorm'); + $columns[] = 'start'; + $headers[] = get_string('started', 'scorm'); + $columns[] = 'finish'; + $headers[] = get_string('last', 'scorm'); + $columns[] = 'score'; + $headers[] = get_string('score', 'scorm'); + $scoes = $DB->get_records('scorm_scoes', array("scorm"=>$scorm->id), 'id'); + foreach ($scoes as $sco) { + if ($sco->launch != '') { + $columns[] = 'scograde'.$sco->id; + $headers[] = format_string($sco->title, '', $formattextoptions); + } + } + + $params = array(); + list($usql, $params) = $DB->get_in_or_equal($allowedlist, SQL_PARAMS_NAMED); + // Construct the SQL. + $select = 'SELECT DISTINCT '.$DB->sql_concat('u.id', '\'#\'', 'COALESCE(st.attempt, 0)').' AS uniqueid, '; + $select .= 'st.scormid AS scormid, st.attempt AS attempt, ' . + 'u.id AS userid, u.idnumber, u.firstname, u.lastname, u.picture, u.imagealt, u.email'. + get_extra_user_fields_sql($coursecontext, 'u', '', array('email', 'idnumber')) . ' '; + + // This part is the same for all cases - join users and scorm_scoes_track tables. + $from = 'FROM {user} u '; + $from .= 'LEFT JOIN {scorm_scoes_track} st ON st.userid = u.id AND st.scormid = '.$scorm->id; + switch ($attemptsmode) { + case SCORM_REPORT_ATTEMPTS_STUDENTS_WITH: + // Show only students with attempts. + $where = ' WHERE u.id ' .$usql. ' AND st.userid IS NOT NULL'; + break; + case SCORM_REPORT_ATTEMPTS_STUDENTS_WITH_NO: + // Show only students without attempts. + $where = ' WHERE u.id ' .$usql. ' AND st.userid IS NULL'; + break; + case SCORM_REPORT_ATTEMPTS_ALL_STUDENTS: + // Show all students with or without attempts. + $where = ' WHERE u.id ' .$usql. ' AND (st.userid IS NOT NULL OR st.userid IS NULL)'; + break; + } + + $countsql = 'SELECT COUNT(DISTINCT('.$DB->sql_concat('u.id', '\'#\'', 'COALESCE(st.attempt, 0)').')) AS nbresults, '; + $countsql .= 'COUNT(DISTINCT('.$DB->sql_concat('u.id', '\'#\'', 'st.attempt').')) AS nbattempts, '; + $countsql .= 'COUNT(DISTINCT(u.id)) AS nbusers '; + $countsql .= $from.$where; + + $nbmaincolumns = count($columns); // Get number of main columns used. + + $objectives = get_scorm_objectives($scorm->id); + $nosort = array(); + foreach ($objectives as $scoid => $sco) { + foreach ($sco as $id => $objectivename) { + $colid = $scoid.'objectivestatus' . $id; + $columns[] = $colid; + $nosort[] = $colid; + + if (!$displayoptions['objectivescore']) { + // Display the objective name only. + $headers[] = $objectivename; + } else { + // Display the objective status header with a "status" suffix to avoid confusion. + $headers[] = $objectivename. ' '. get_string('status', 'scormreport_objectives'); + + // Now print objective score headers. + $colid = $scoid.'objectivescore' . $id; + $columns[] = $colid; + $nosort[] = $colid; + $headers[] = $objectivename. ' '. get_string('score', 'scormreport_objectives'); + } + } + } + + $emptycell = ''; // Used when an empty cell is being printed - in html we add a space. + if (!$download) { + $emptycell = ' '; + $table = new flexible_table('mod-scorm-report'); + + $table->define_columns($columns); + $table->define_headers($headers); + $table->define_baseurl($PAGE->url); + + $table->sortable(true); + $table->collapsible(true); + + // This is done to prevent redundant data, when a user has multiple attempts. + $table->column_suppress('picture'); + $table->column_suppress('fullname'); + foreach ($extrafields as $field) { + $table->column_suppress($field); + } + foreach ($nosort as $field) { + $table->no_sorting($field); + } + + $table->no_sorting('start'); + $table->no_sorting('finish'); + $table->no_sorting('score'); + + foreach ($scoes as $sco) { + if ($sco->launch != '') { + $table->no_sorting('scograde'.$sco->id); + } + } + + $table->column_class('picture', 'picture'); + $table->column_class('fullname', 'bold'); + $table->column_class('score', 'bold'); + + $table->set_attribute('cellspacing', '0'); + $table->set_attribute('id', 'attempts'); + $table->set_attribute('class', 'generaltable generalbox'); + + // Start working -- this is necessary as soon as the niceties are over. + $table->setup(); + } else if ($download == 'ODS') { + require_once("$CFG->libdir/odslib.class.php"); + + $filename .= ".ods"; + // Creating a workbook. + $workbook = new MoodleODSWorkbook("-"); + // Sending HTTP headers. + $workbook->send($filename); + // Creating the first worksheet. + $sheettitle = get_string('report', 'scorm'); + $myxls = $workbook->add_worksheet($sheettitle); + // Format types. + $format = $workbook->add_format(); + $format->set_bold(0); + $formatbc = $workbook->add_format(); + $formatbc->set_bold(1); + $formatbc->set_align('center'); + $formatb = $workbook->add_format(); + $formatb->set_bold(1); + $formaty = $workbook->add_format(); + $formaty->set_bg_color('yellow'); + $formatc = $workbook->add_format(); + $formatc->set_align('center'); + $formatr = $workbook->add_format(); + $formatr->set_bold(1); + $formatr->set_color('red'); + $formatr->set_align('center'); + $formatg = $workbook->add_format(); + $formatg->set_bold(1); + $formatg->set_color('green'); + $formatg->set_align('center'); + // Here starts workshhet headers. + + $colnum = 0; + foreach ($headers as $item) { + $myxls->write(0, $colnum, $item, $formatbc); + $colnum++; + } + $rownum = 1; + } else if ($download =='Excel') { + require_once("$CFG->libdir/excellib.class.php"); + + $filename .= ".xls"; + // Creating a workbook. + $workbook = new MoodleExcelWorkbook("-"); + // Sending HTTP headers. + $workbook->send($filename); + // Creating the first worksheet. + $sheettitle = get_string('report', 'scorm'); + $myxls = $workbook->add_worksheet($sheettitle); + // Format types. + $format = $workbook->add_format(); + $format->set_bold(0); + $formatbc = $workbook->add_format(); + $formatbc->set_bold(1); + $formatbc->set_align('center'); + $formatb = $workbook->add_format(); + $formatb->set_bold(1); + $formaty = $workbook->add_format(); + $formaty->set_bg_color('yellow'); + $formatc = $workbook->add_format(); + $formatc->set_align('center'); + $formatr = $workbook->add_format(); + $formatr->set_bold(1); + $formatr->set_color('red'); + $formatr->set_align('center'); + $formatg = $workbook->add_format(); + $formatg->set_bold(1); + $formatg->set_color('green'); + $formatg->set_align('center'); + + $colnum = 0; + foreach ($headers as $item) { + $myxls->write(0, $colnum, $item, $formatbc); + $colnum++; + } + $rownum = 1; + } else if ($download == 'CSV') { + $csvexport = new csv_export_writer("tab"); + $csvexport->set_filename($filename, ".txt"); + $csvexport->add_data($headers); + } + + if (!$download) { + $sort = $table->get_sql_sort(); + } else { + $sort = ''; + } + // Fix some wired sorting. + if (empty($sort)) { + $sort = ' ORDER BY uniqueid'; + } else { + $sort = ' ORDER BY '.$sort; + } + + if (!$download) { + // Add extra limits due to initials bar. + list($twhere, $tparams) = $table->get_sql_where(); + if ($twhere) { + $where .= ' AND '.$twhere; // Initial bar. + $params = array_merge($params, $tparams); + } + + if (!empty($countsql)) { + $count = $DB->get_record_sql($countsql, $params); + $totalinitials = $count->nbresults; + if ($twhere) { + $countsql .= ' AND '.$twhere; + } + $count = $DB->get_record_sql($countsql, $params); + $total = $count->nbresults; + } + + $table->pagesize($pagesize, $total); + + echo '
'; + if ( $count->nbresults == $count->nbattempts ) { + echo get_string('reportcountattempts', 'scorm', $count); + } else if ( $count->nbattempts>0 ) { + echo get_string('reportcountallattempts', 'scorm', $count); + } else { + echo $count->nbusers.' '.get_string('users'); + } + echo '
'; + } + + // Fetch the attempts. + if (!$download) { + $attempts = $DB->get_records_sql($select.$from.$where.$sort, $params, + $table->get_page_start(), $table->get_page_size()); + echo '
'; + if ($candelete) { + // Start form. + $strreallydel = addslashes_js(get_string('deleteattemptcheck', 'scorm')); + echo '
'; + echo ''; + echo ''; + echo '
'; + echo html_writer::input_hidden_params($PAGE->url); + echo '
'; + echo '
'; + } + $table->initialbars($totalinitials>20); // Build table rows. + } else { + $attempts = $DB->get_records_sql($select.$from.$where.$sort, $params); + } + if ($attempts) { + foreach ($attempts as $scouser) { + $row = array(); + if (!empty($scouser->attempt)) { + $timetracks = scorm_get_sco_runtime($scorm->id, false, $scouser->userid, $scouser->attempt); + } else { + $timetracks = ''; + } + if (in_array('checkbox', $columns)) { + if ($candelete && !empty($timetracks->start)) { + $row[] = ''; + } else if ($candelete) { + $row[] = ''; + } + } + if (in_array('picture', $columns)) { + $user = (object)array( + 'id'=>$scouser->userid, + 'picture'=>$scouser->picture, + 'imagealt'=>$scouser->imagealt, + 'email'=>$scouser->email, + 'firstname'=>$scouser->firstname, + 'lastname'=>$scouser->lastname); + $row[] = $OUTPUT->user_picture($user, array('courseid'=>$course->id)); + } + if (!$download) { + $row[] = ''.fullname($scouser).''; + } else { + $row[] = fullname($scouser); + } + foreach ($extrafields as $field) { + $row[] = s($scouser->{$field}); + } + if (empty($timetracks->start)) { + $row[] = '-'; + $row[] = '-'; + $row[] = '-'; + $row[] = '-'; + } else { + if (!$download) { + $row[] = ''.$scouser->attempt.''; + } else { + $row[] = $scouser->attempt; + } + if ($download =='ODS' || $download =='Excel' ) { + $row[] = userdate($timetracks->start, get_string("strftimedatetime", "langconfig")); + } else { + $row[] = userdate($timetracks->start); + } + if ($download =='ODS' || $download =='Excel' ) { + $row[] = userdate($timetracks->finish, get_string('strftimedatetime', 'langconfig')); + } else { + $row[] = userdate($timetracks->finish); + } + $row[] = scorm_grade_user_attempt($scorm, $scouser->userid, $scouser->attempt); + } + // Print out all scores of attempt. + foreach ($scoes as $sco) { + if ($sco->launch != '') { + if ($trackdata = scorm_get_tracks($sco->id, $scouser->userid, $scouser->attempt)) { + if ($trackdata->status == '') { + $trackdata->status = 'notattempted'; + } + $strstatus = get_string($trackdata->status, 'scorm'); + + if ($trackdata->score_raw != '') { // If raw score exists, print it. + $score = $trackdata->score_raw; + // Add max score if it exists. + if (isset($trackdata->score_max)) { + $score .= '/'.$trackdata->score_max; + } + + } else { // ...else print out status. + $score = $strstatus; + } + if (!$download) { + $row[] = ''.
+                                             $strstatus.'
'.$score.''; + } else { + $row[] = $score; + } + // Iterate over tracks and match objective id against values. + $keywords = array("cmi.objectives_", ".id"); + $objectivestatus = array(); + $objectivescore = array(); + foreach ($trackdata as $name => $value) { + if (strpos($name, 'cmi.objectives_') === 0 && strrpos($name, '.id') !== false) { + $num = trim(str_ireplace($keywords, '', $name)); + if (is_numeric($num)) { + if (scorm_version_check($scorm->version, SCORM_13)) { + $element='cmi.objectives_'.$num.'.completion_status'; + } else { + $element='cmi.objectives_'.$num.'.status'; + } + if (isset($trackdata->$element)) { + $objectivestatus[$value] = $trackdata->$element; + } else { + $objectivestatus[$value] = ''; + } + if ($displayoptions['objectivescore']) { + $element='cmi.objectives_'.$num.'.score.raw'; + if (isset($trackdata->$element)) { + $objectivescore[$value] = $trackdata->$element; + } else { + $objectivescore[$value] = ''; + } + } + } + } + } + + // Interaction data. + if (!empty($objectives[$trackdata->scoid])) { + foreach ($objectives[$trackdata->scoid] as $name) { + if (isset($objectivestatus[$name])) { + $row[] = s($objectivestatus[$name]); + } else { + $row[] = $emptycell; + } + if ($displayoptions['objectivescore']) { + if (isset($objectivescore[$name])) { + $row[] = s($objectivescore[$name]); + } else { + $row[] = $emptycell; + } + + } + } + } + // End of interaction data. + } else { + // If we don't have track data, we haven't attempted yet. + $strstatus = get_string('notattempted', 'scorm'); + if (!$download) { + $row[] = ''.
+                                             $strstatus.'
'.$strstatus; + } else { + $row[] = $strstatus; + } + // Complete the empty cells. + for ($i=0; $i < count($columns) - $nbmaincolumns; $i++) { + $row[] = $emptycell; + } + } + } + } + + if (!$download) { + $table->add_data($row); + } else if ($download == 'Excel' or $download == 'ODS') { + $colnum = 0; + foreach ($row as $item) { + $myxls->write($rownum, $colnum, $item, $format); + $colnum++; + } + $rownum++; + } else if ($download == 'CSV') { + $csvexport->add_data($row); + } + } + if (!$download) { + $table->finish_output(); + if ($candelete) { + echo ''; + echo '
'; + echo ''. + get_string('selectall', 'scorm').' / '; + echo ''. + get_string('selectnone', 'scorm').' '; + echo '  '; + echo ''; + echo '
'; + // Close form. + echo '
'; + echo '
'; + } + echo '
'; + if (!empty($attempts)) { + echo ''; + echo '\n"; + echo '\n"; + echo '\n"; + echo "\n"; + echo '
'; + echo $OUTPUT->single_button(new moodle_url($PAGE->url, + array('download'=>'ODS') + $displayoptions), + get_string('downloadods')); + echo "'; + echo $OUTPUT->single_button(new moodle_url($PAGE->url, + array('download'=>'Excel') + $displayoptions), + get_string('downloadexcel')); + echo "'; + echo $OUTPUT->single_button(new moodle_url($PAGE->url, + array('download'=>'CSV') + $displayoptions), + get_string('downloadtext')); + echo ""; + echo "
'; + } + } + } else { + if ($candelete && !$download) { + echo ''; + echo ''; + $table->finish_output(); + } + echo ''; + } + // Show preferences form irrespective of attempts are there to report or not. + if (!$download) { + $mform->set_data(compact('detailedrep', 'pagesize', 'attemptsmode')); + $mform->display(); + } + if ($download == 'Excel' or $download == 'ODS') { + $workbook->close(); + exit; + } else if ($download == 'CSV') { + $csvexport->download_file(); + exit; + } + } else { + echo $OUTPUT->notification(get_string('noactivity', 'scorm')); + } + }// Function ends. +} + +/** + * Returns The maximum numbers of Objectives associated with an Scorm Pack + * + * @param int $scormid Scorm instance id + * @return array an array of possible objectives. + */ +function get_scorm_objectives($scormid) { + global $DB; + $objectives = array(); + $params = array(); + $select = "scormid = ? AND "; + $select .= $DB->sql_like("element", "?", false); + $params[] = $scormid; + $params[] = "cmi.objectives_%.id"; + $rs = $DB->get_recordset_select("scorm_scoes_track", $select, $params, 'value', 'DISTINCT value, scoid'); + if ($rs->valid()) { + foreach ($rs as $record) { + $objectives[$record->scoid][] = $record->value; + } + // Now naturally sort the sco arrays. + foreach ($objectives as $scoid => $sco) { + natsort($objectives[$scoid]); + } + } + $rs->close(); + return $objectives; +} \ No newline at end of file diff --git a/mod/scorm/report/objectives/responsessettings_form.php b/mod/scorm/report/objectives/responsessettings_form.php new file mode 100644 index 00000000000..37279790487 --- /dev/null +++ b/mod/scorm/report/objectives/responsessettings_form.php @@ -0,0 +1,60 @@ +. + +/** + * Defines the version of scorm_objectives + * @package scormreport_objectives + * @author Dan Marsden + * @copyright 2013 Dan Marsden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +require_once("$CFG->libdir/formslib.php"); +/** + * A form that displays the objective report settings + * + * @copyright 2013 Dan Marsden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class mod_scorm_report_objectives_settings extends moodleform { + /** + * Definition of the setting form elements + */ + protected function definition() { + global $COURSE; + $mform =& $this->_form; + + $mform->addElement('header', 'preferencespage', get_string('preferencespage', 'scorm')); + + $options = array(); + if ($COURSE->id != SITEID) { + $options[SCORM_REPORT_ATTEMPTS_ALL_STUDENTS] = get_string('optallstudents', 'scorm'); + $options[SCORM_REPORT_ATTEMPTS_STUDENTS_WITH] = get_string('optattemptsonly', 'scorm'); + $options[SCORM_REPORT_ATTEMPTS_STUDENTS_WITH_NO] = get_string('optnoattemptsonly', 'scorm'); + } + $mform->addElement('select', 'attemptsmode', get_string('show', 'scorm'), $options); + $mform->addElement('advcheckbox', 'objectivescore', '', get_string('objectivescore', 'scormreport_objectives')); + + $mform->addElement('header', 'preferencesuser', get_string('preferencesuser', 'scorm')); + + $mform->addElement('text', 'pagesize', get_string('pagesize', 'scorm')); + $mform->setType('pagesize', PARAM_INT); + + $this->add_action_buttons(false, get_string('savepreferences')); + } +} diff --git a/mod/scorm/report/objectives/version.php b/mod/scorm/report/objectives/version.php new file mode 100644 index 00000000000..c07a4a3fa68 --- /dev/null +++ b/mod/scorm/report/objectives/version.php @@ -0,0 +1,30 @@ +. + + +/** + * Defines the version of scorm_objectives + * @package scormreport_objectives + * @author Dan Marsden + * @copyright 2013 Dan Marsden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +$plugin->version = 2013061700; +$plugin->requires = 2011070800; +$plugin->component = 'scormreport_objectives';