/** * Prepares section data for inclusion in sectioncache cache, removing items * that are set to defaults, and adding availability data if required. * * Called by build_section_cache in course_modinfo only; do not use otherwise. * @param object $section Raw section data object */ public static function convert_for_section_cache($section) { global $CFG; // Course id stored in course table unset($section->course); // Section number stored in array key unset($section->section); // Sequence stored implicity in modinfo $sections array unset($section->sequence); // Add availability data if turned on if ($CFG->enableavailability) { require_once($CFG->dirroot . '/lib/conditionlib.php'); condition_info_section::fill_availability_conditions($section); if (count($section->conditionscompletion) == 0) { unset($section->conditionscompletion); } if (count($section->conditionsgrade) == 0) { unset($section->conditionsgrade); } } // Remove default data foreach (self::$sectioncachedefaults as $field => $value) { // Exact compare as strings to avoid problems if some strings are set // to "0" etc. if (isset($section->{$field}) && $section->{$field} === $value) { unset($section->{$field}); } } }
if ($mform->is_cancelled()) { // Form cancelled, return to course. redirect(course_get_url($course, $section, array('sr' => $sectionreturn))); } else { if ($data = $mform->get_data()) { // Data submitted and validated, update and return to course. $DB->update_record('course_sections', $data); rebuild_course_cache($course->id, true); if (isset($data->section)) { // Usually edit form does not change relative section number but just in case. $sectionnum = $data->section; } if (!empty($CFG->enableavailability)) { // Update grade and completion conditions. $sectioninfo = get_fast_modinfo($course)->get_section_info($sectionnum); condition_info_section::update_section_from_form($sectioninfo, $data); rebuild_course_cache($course->id, true); } course_get_format($course->id)->update_section_format_options($data); // Set section info, as this might not be present in form_data. if (!isset($data->section)) { $data->section = $sectionnum; } // Trigger an event for course section update. /*$event = \core\event\course_section_updated::create( array( 'objectid' => $data->id, 'courseid' => $course->id, 'context' => $context, 'other' => array('sectionnum' => $data->section) )
public function definition_after_data() { global $CFG, $DB; $mform = $this->_form; $course = $this->_customdata['course']; $context = context_course::instance($course->id); if (!empty($CFG->enableavailability)) { $mform->addElement('header', 'availabilityconditions', get_string('availabilityconditions', 'condition')); $mform->setExpanded('availabilityconditions', false); // String used by conditions more than once $strcondnone = get_string('none', 'condition'); // Grouping conditions - only if grouping is enabled at site level if (!empty($CFG->enablegroupmembersonly)) { $options = array(); if ($groupings = $DB->get_records('groupings', array('courseid' => $course->id))) { foreach ($groupings as $grouping) { $options[$grouping->id] = format_string($grouping->name, true, array('context' => $context)); } } collatorlib::asort($options); $options = array(0 => get_string('none')) + $options; $mform->addElement('select', 'groupingid', get_string('groupingsection', 'group'), $options); $mform->addHelpButton('groupingid', 'groupingsection', 'group'); } // Available from/to defaults to midnight because then the display // will be nicer where it tells users when they can access it (it // shows only the date and not time). $date = usergetdate(time()); $midnight = make_timestamp($date['year'], $date['mon'], $date['mday']); // Date and time conditions. $mform->addElement('date_time_selector', 'availablefrom', get_string('availablefrom', 'condition'), array('optional' => true, 'defaulttime' => $midnight)); $mform->addElement('date_time_selector', 'availableuntil', get_string('availableuntil', 'condition'), array('optional' => true, 'defaulttime' => $midnight)); // Conditions based on grades $gradeoptions = array(); $items = grade_item::fetch_all(array('courseid' => $course->id)); $items = $items ? $items : array(); foreach ($items as $id => $item) { $gradeoptions[$id] = $item->get_name(); } asort($gradeoptions); $gradeoptions = array(0 => $strcondnone) + $gradeoptions; $grouparray = array(); $grouparray[] = $mform->createElement('select', 'conditiongradeitemid', '', $gradeoptions); $grouparray[] = $mform->createElement('static', '', '', ' ' . get_string('grade_atleast', 'condition') . ' '); $grouparray[] = $mform->createElement('text', 'conditiongrademin', '', array('size' => 3)); $grouparray[] = $mform->createElement('static', '', '', '% ' . get_string('grade_upto', 'condition') . ' '); $grouparray[] = $mform->createElement('text', 'conditiongrademax', '', array('size' => 3)); $grouparray[] = $mform->createElement('static', '', '', '%'); $group = $mform->createElement('group', 'conditiongradegroup', get_string('gradecondition', 'condition'), $grouparray); // Get full version (including condition info) of section object $ci = new condition_info_section($this->_customdata['cs']); $fullcs = $ci->get_full_section(); $count = count($fullcs->conditionsgrade) + 1; // Grade conditions $this->repeat_elements(array($group), $count, array('conditiongradegroup[conditiongrademin]' => array('type' => PARAM_RAW), 'conditiongradegroup[conditiongrademax]' => array('type' => PARAM_RAW)), 'conditiongraderepeats', 'conditiongradeadds', 2, get_string('addgrades', 'condition'), true); $mform->addHelpButton('conditiongradegroup[0]', 'gradecondition', 'condition'); // Conditions based on user fields $operators = condition_info::get_condition_user_field_operators(); $useroptions = condition_info::get_condition_user_fields(array('context' => $context)); asort($useroptions); $useroptions = array(0 => $strcondnone) + $useroptions; $grouparray = array(); $grouparray[] =& $mform->createElement('select', 'conditionfield', '', $useroptions); $grouparray[] =& $mform->createElement('select', 'conditionfieldoperator', '', $operators); $grouparray[] =& $mform->createElement('text', 'conditionfieldvalue'); $group = $mform->createElement('group', 'conditionfieldgroup', get_string('userfield', 'condition'), $grouparray); $fieldcount = count($fullcs->conditionsfield) + 1; $this->repeat_elements(array($group), $fieldcount, array('conditionfieldgroup[conditionfieldvalue]' => array('type' => PARAM_RAW)), 'conditionfieldrepeats', 'conditionfieldadds', 2, get_string('adduserfields', 'condition'), true); $mform->addHelpButton('conditionfieldgroup[0]', 'userfield', 'condition'); // Conditions based on completion $completion = new completion_info($course); if ($completion->is_enabled()) { $completionoptions = array(); $modinfo = get_fast_modinfo($course); foreach ($modinfo->cms as $id => $cm) { // Add each course-module if it: // (a) has completion turned on // (b) does not belong to current course-section if ($cm->completion && $fullcs->id != $cm->section) { $completionoptions[$id] = $cm->name; } } asort($completionoptions); $completionoptions = array(0 => $strcondnone) + $completionoptions; $completionvalues = array(COMPLETION_COMPLETE => get_string('completion_complete', 'condition'), COMPLETION_INCOMPLETE => get_string('completion_incomplete', 'condition'), COMPLETION_COMPLETE_PASS => get_string('completion_pass', 'condition'), COMPLETION_COMPLETE_FAIL => get_string('completion_fail', 'condition')); $grouparray = array(); $grouparray[] = $mform->createElement('select', 'conditionsourcecmid', '', $completionoptions); $grouparray[] = $mform->createElement('select', 'conditionrequiredcompletion', '', $completionvalues); $group = $mform->createElement('group', 'conditioncompletiongroup', get_string('completioncondition', 'condition'), $grouparray); $count = count($fullcs->conditionscompletion) + 1; $this->repeat_elements(array($group), $count, array(), 'conditioncompletionrepeats', 'conditioncompletionadds', 2, get_string('addcompletions', 'condition'), true); $mform->addHelpButton('conditioncompletiongroup[0]', 'completionconditionsection', 'condition'); } // Availability conditions - set up form values if (!empty($CFG->enableavailability)) { $num = 0; foreach ($fullcs->conditionsgrade as $gradeitemid => $minmax) { $groupelements = $mform->getElement('conditiongradegroup[' . $num . ']')->getElements(); $groupelements[0]->setValue($gradeitemid); $groupelements[2]->setValue(is_null($minmax->min) ? '' : format_float($minmax->min, 5, true, true)); $groupelements[4]->setValue(is_null($minmax->max) ? '' : format_float($minmax->max, 5, true, true)); $num++; } $num = 0; foreach ($fullcs->conditionsfield as $fieldid => $data) { $groupelements = $mform->getElement('conditionfieldgroup[' . $num . ']')->getElements(); $groupelements[0]->setValue($fieldid); $groupelements[1]->setValue(is_null($data->operator) ? '' : $data->operator); $groupelements[2]->setValue(is_null($data->value) ? '' : $data->value); $num++; } if ($completion->is_enabled()) { $num = 0; foreach ($fullcs->conditionscompletion as $othercmid => $state) { $groupelements = $mform->getElement('conditioncompletiongroup[' . $num . ']')->getElements(); $groupelements[0]->setValue($othercmid); $groupelements[1]->setValue($state); $num++; } } } // Do we display availability info to students? $showhide = array(CONDITION_STUDENTVIEW_SHOW => get_string('showavailabilitysection_show', 'condition'), CONDITION_STUDENTVIEW_HIDE => get_string('showavailabilitysection_hide', 'condition')); $mform->addElement('select', 'showavailability', get_string('showavailabilitysection', 'condition'), $showhide); } $this->add_action_buttons(); }
/** * If section is not visible, display the message about that ('Not available * until...', that sort of thing). Otherwise, returns blank. * * For users with the ability to view hidden sections, it shows the * information even though you can view the section and also may include * slightly fuller information (so that teachers can tell when sections * are going to be unavailable etc). This logic is the same as for * activities. * * @param stdClass $section The course_section entry from DB * @param bool $canviewhidden True if user can view hidden sections * @return string HTML to output */ protected function section_availability_message($section, $canviewhidden) { global $CFG; $o = ''; if (!$section->uservisible) { $o .= html_writer::start_tag('div', array('class' => 'availabilityinfo')); // Note: We only get to this function if availableinfo is non-empty, // so there is definitely something to print. $o .= $section->availableinfo; $o .= html_writer::end_tag('div'); } else { if ($canviewhidden && !empty($CFG->enableavailability) && $section->visible) { $ci = new condition_info_section($section); $fullinfo = $ci->get_full_information(); if ($fullinfo) { $o .= html_writer::start_tag('div', array('class' => 'availabilityinfo')); $o .= get_string($section->showavailability ? 'userrestriction_visible' : 'userrestriction_hidden', 'condition', $fullinfo); $o .= html_writer::end_tag('div'); } } } return $o; }
public function test_section_info_properties() { global $DB, $CFG; $this->resetAfterTest(); $oldcfgenableavailability = $CFG->enableavailability; $oldcfgenablecompletion = $CFG->enablecompletion; set_config('enableavailability', 1); set_config('enablecompletion', 1); $this->setAdminUser(); // Generate the course and pre-requisite module. $course = $this->getDataGenerator()->create_course(array('format' => 'topics', 'numsections' => 3, 'enablecompletion' => 1, 'groupmode' => SEPARATEGROUPS, 'forcegroupmode' => 0), array('createsections' => true)); $coursecontext = context_course::instance($course->id); $prereqforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id), array('completion' => 1)); // Generate the module and add availability conditions. $conditionscompletion = array($prereqforum->cmid => COMPLETION_COMPLETE); $conditionsgrade = array(666 => (object) array('min' => 0.4, 'max' => null, 'name' => '!missing')); $conditionsfield = array('email' => (object) array('fieldname' => 'email', 'operator' => 'contains', 'value' => 'test')); $sectiondb = $DB->get_record('course_sections', array('course' => $course->id, 'section' => 2)); $ci = new condition_info_section((object) array('id' => $sectiondb->id), CONDITION_MISSING_EVERYTHING); foreach ($conditionscompletion as $cmid => $requiredcompletion) { $ci->add_completion_condition($cmid, $requiredcompletion); } foreach ($conditionsgrade as $gradeid => $conditiongrade) { $ci->add_grade_condition($gradeid, $conditiongrade->min, $conditiongrade->max, true); } foreach ($conditionsfield as $conditionfield) { $ci->add_user_field_condition($conditionfield->fieldname, $conditionfield->operator, $conditionfield->value); } // Direct calls to condition_info_section methods do not reset the course cache. Do it manually. rebuild_course_cache($course->id, true); // Create and enrol a student. $studentrole = $DB->get_record('role', array('shortname' => 'student'), '*', MUST_EXIST); $student = $this->getDataGenerator()->create_user(); role_assign($studentrole->id, $student->id, $coursecontext); $enrolplugin = enrol_get_plugin('manual'); $enrolinstance = $DB->get_record('enrol', array('courseid' => $course->id, 'enrol' => 'manual')); $enrolplugin->enrol_user($enrolinstance, $student->id); $this->setUser($student); // Get modinfo. $modinfo = get_fast_modinfo($course->id); $si = $modinfo->get_section_info(2); $this->assertEquals($sectiondb->id, $si->id); $this->assertEquals($sectiondb->course, $si->course); $this->assertEquals($sectiondb->section, $si->section); $this->assertEquals($sectiondb->name, $si->name); $this->assertEquals($sectiondb->visible, $si->visible); $this->assertEquals($sectiondb->summary, $si->summary); $this->assertEquals($sectiondb->summaryformat, $si->summaryformat); $this->assertEquals($sectiondb->showavailability, $si->showavailability); $this->assertEquals($sectiondb->availablefrom, $si->availablefrom); $this->assertEquals($sectiondb->availableuntil, $si->availableuntil); $this->assertEquals($sectiondb->groupingid, $si->groupingid); $this->assertEquals($sectiondb->sequence, $si->sequence); // Since this section does not contain invalid modules. $this->assertEquals($conditionscompletion, $si->conditionscompletion); $this->assertEquals($conditionsgrade, $si->conditionsgrade); $this->assertEquals($conditionsfield, $si->conditionsfield); // Dynamic fields, just test that they can be retrieved (must be carefully tested in each activity type). $this->assertEquals(0, $si->available); $this->assertNotEmpty($si->availableinfo); // Lists all unmet availability conditions. $this->assertEquals(0, $si->uservisible); // Restore settings. set_config('enableavailability', $oldcfgenableavailability); set_config('enablecompletion', $oldcfgenablecompletion); }
/** * Tests the is_available function for sections. */ public function test_section_is_available() { global $DB; // Create course. $generator = $this->getDataGenerator(); $course = $generator->create_course(array('numsections' => 2), array('createsections' => true)); // Set one of the sections unavailable. $time = time() + 100; $avail = '{"op":"|","show":true,"c":[{"type":"date","d":">=","t":' . $time . '}]}'; $DB->set_field('course_sections', 'availability', $avail, array('course' => $course->id, 'section' => 2)); $modinfo = get_fast_modinfo($course); // No conditions. $ci = new condition_info_section($modinfo->get_section_info(1)); $this->assertDebuggingCalled(); $this->assertTrue($ci->is_available($text, false, 0)); $this->assertDebuggingCalled(); $this->assertEquals('', $text); // Date condition. $ci = new condition_info_section($modinfo->get_section_info(2)); $this->assertDebuggingCalled(); $this->assertFalse($ci->is_available($text)); $this->assertDebuggingCalled(); $expectedtime = userdate($time, get_string('strftimedate', 'langconfig')); $this->assertContains($expectedtime, $text); // Full information display. $text = $ci->get_full_information(); $this->assertDebuggingCalled(); $expectedtime = userdate($time, get_string('strftimedate', 'langconfig')); $this->assertContains($expectedtime, $text); }
public function test_section_is_available() { global $DB, $USER; $courseid = $this->make_course(); // Enrol user (needed for groups) $enrolplugin = enrol_get_plugin('manual'); $course = $DB->get_record('course', array('id' => $courseid)); $enrolplugin->add_instance($course); $enrolinstances = enrol_get_instances($courseid, false); foreach ($enrolinstances as $enrolinstance) { if ($enrolinstance->enrol === 'manual') { break; } } $enrolplugin->enrol_user($enrolinstance, $USER->id); // Module for conditions later $cmid = $this->make_course_module($courseid); // No conditions $sectionid = $this->make_section($courseid, array($cmid), 1); $ci = new condition_info_section((object)array('id' => $sectionid), CONDITION_MISSING_EVERYTHING); $this->assertTrue($ci->is_available($text, false, 0)); $this->assertEquals('', $text); // Time (from) $time = time() + 100; $sectionid = $this->make_section($courseid, array(), 2, array('availablefrom' => $time)); $ci = new condition_info_section((object)array('id' => $sectionid), CONDITION_MISSING_EVERYTHING); $this->assertFalse($ci->is_available($text)); $timetext = userdate($time, get_string('strftimedate', 'langconfig')); $this->assertRegExp('~' . preg_quote($timetext) . '~', $text); $time=time()-100; $sectionid = $this->make_section($courseid, array(), 3, array('availablefrom' => $time)); $ci = new condition_info_section((object)array('id' => $sectionid), CONDITION_MISSING_EVERYTHING); $this->assertTrue($ci->is_available($text)); $this->assertEquals('', $text); $timetext = userdate($time, get_string('strftimedate', 'langconfig')); $this->assertRegExp('~' . preg_quote($timetext) . '~', $ci->get_full_information()); // Time (until) $sectionid = $this->make_section($courseid, array(), 4, array('availableuntil' => time() - 100)); $ci = new condition_info_section((object)array('id' => $sectionid), CONDITION_MISSING_EVERYTHING); $this->assertFalse($ci->is_available($text)); $this->assertEquals('', $text); // Completion: first set up cm $sectionid = $this->make_section($courseid, array(), 5); $cm = $DB->get_record('course_modules', array('id' => $cmid)); $cm->completion = COMPLETION_TRACKING_MANUAL; $DB->update_record('course_modules', $cm); // Completion: Reset modinfo after changing the options rebuild_course_cache($courseid); $reset = 'reset'; get_fast_modinfo($reset); // Completion: Add condition $ci = new condition_info_section((object)array('id' => $sectionid), CONDITION_MISSING_EVERYTHING); $ci->add_completion_condition($cmid, COMPLETION_COMPLETE); condition_info_section::wipe_session_cache(); // Completion: Check $this->assertFalse($ci->is_available($text, false)); $this->assertEquals(get_string('requires_completion_1', 'condition', 'xxx'), $text); completion_info::wipe_session_cache(); $completion = new completion_info($DB->get_record('course', array('id' => $courseid))); $completion->update_state($cm, COMPLETION_COMPLETE); completion_info::wipe_session_cache(); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text)); $this->assertFalse($ci->is_available($text, false, $USER->id + 1)); // Completion: Uncheck completion_info::wipe_session_cache(); condition_info_section::wipe_session_cache(); $completion = new completion_info($DB->get_record('course', array('id' => $courseid))); $completion->update_state($cm, COMPLETION_INCOMPLETE); $this->assertFalse($ci->is_available($text)); // Completion: Incomplete condition $ci->wipe_conditions(); $ci->add_completion_condition($cmid, COMPLETION_INCOMPLETE); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text)); $this->assertTrue($ci->is_available($text, false, $USER->id + 1)); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text, true)); // Grade: Add a fake grade item $gradeitemid = $DB->insert_record('grade_items', (object)array( 'courseid' => $courseid, 'itemname' => 'frog')); // Grade: Add a condition on a value existing $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, null, null, true); $this->assertFalse($ci->is_available($text)); $this->assertEquals(get_string('requires_grade_any', 'condition', 'frog'), $text); // Grade: Fake it existing $DB->insert_record('grade_grades', (object)array( 'itemid' => $gradeitemid, 'userid' => $USER->id, 'finalgrade' => 3.78)); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text)); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text, true)); // Grade: Now require that user gets more than 3.78001 $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, 3.78001, null, true); condition_info_section::wipe_session_cache(); $this->assertFalse($ci->is_available($text)); $this->assertEquals(get_string('requires_grade_min', 'condition', 'frog'), $text); // Grade: ...just on 3.78... $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, 3.78, null, true); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text)); // Grade: ...less than 3.78 $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, null, 3.78, true); condition_info_section::wipe_session_cache(); $this->assertFalse($ci->is_available($text)); $this->assertEquals(get_string('requires_grade_max', 'condition', 'frog'), $text); // Grade: ...less than 3.78001 $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, null, 3.78001, true); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text)); // Grade: ...in a range that includes it $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, 3, 4, true); condition_info_section::wipe_session_cache(); $this->assertTrue($ci->is_available($text)); // Grade: ...in a range that doesn't include it $ci->wipe_conditions(); $ci->add_grade_condition($gradeitemid, 4, 5, true); condition_info_section::wipe_session_cache(); $this->assertFalse($ci->is_available($text)); $this->assertEquals(get_string('requires_grade_range', 'condition', 'frog'), $text); // Grouping: Not member $groupingid = $this->make_grouping($courseid, 'Grouping'); $groupid = $this->make_group($courseid, 'Group', $groupingid); $sectionid = $this->make_section($courseid, array(), 6, array('groupingid' => $groupingid)); $ci = new condition_info_section((object)array('id' => $sectionid), CONDITION_MISSING_EVERYTHING); $this->assertFalse($ci->is_available($text)); $this->assertEquals(trim(get_string('groupingnoaccess', 'condition')), $text); // Grouping: Member $this->assertTrue(groups_add_member($groupid, $USER->id)); condition_info_section::init_global_cache(); $this->assertTrue($ci->is_available($text)); $this->assertEquals('', $text); $this->assertTrue($ci->is_available($text, true)); // Grouping: Somebody else $this->assertFalse($ci->is_available($text, false, $USER->id + 1)); $this->assertFalse($ci->is_available($text, true, $USER->id + 1)); }
/** * If section is not visible, display the message about that ('Not available * until...', that sort of thing). Otherwise, returns blank. * * For users with the ability to view hidden sections, it shows the * information even though you can view the section and also may include * slightly fuller information (so that teachers can tell when sections * are going to be unavailable etc). This logic is the same as for * activities. * * @param stdClass $section The course_section entry from DB * @param bool $canviewhidden True if user can view hidden sections * @return string HTML to output */ protected function section_availability_message($section, $canviewhidden) { global $CFG; $o = ''; if (!$section->uservisible) { $o .= html_writer::start_tag('div', array('class' => 'availabilityinfo')); // Note: We only get to this function if availableinfo is non-empty, // so there is definitely something to print. $o .= $section->availableinfo; $o .= html_writer::end_tag('div'); } else if ($canviewhidden && !empty($CFG->enableavailability) && $section->visible) { // The CONDITION_MISSING_EXTRATABLE is to hide a performance warning that // only applies in 2.3 because of the way we construct section objects on // the FIRST view of a course. In future views, we shouldn't have anything // missing. $ci = new condition_info_section($section, CONDITION_MISSING_EXTRATABLE); $fullinfo = $ci->get_full_information(); if ($fullinfo) { $o .= html_writer::start_tag('div', array('class' => 'availabilityinfo')); $o .= get_string( ($section->showavailability ? 'userrestriction_visible' : 'userrestriction_hidden'), 'condition', $fullinfo); $o .= html_writer::end_tag('div'); } } return $o; }
public function definition_after_data() { global $CFG, $DB; $mform = $this->_form; $course = $this->_customdata['course']; if (!empty($CFG->enableavailability)) { // Grouping conditions - only if grouping is enabled at site level if (!empty($CFG->enablegroupmembersonly)) { $options = array(); $options[0] = get_string('none'); if ($groupings = $DB->get_records('groupings', array('courseid' => $course->id))) { foreach ($groupings as $grouping) { $context = context_course::instance($course->id); $options[$grouping->id] = format_string($grouping->name, true, array('context' => $context)); } } $mform->addElement('header', '', get_string('availabilityconditions', 'condition')); $mform->addElement('select', 'groupingid', get_string('groupingsection', 'group'), $options); $mform->addHelpButton('groupingid', 'groupingsection', 'group'); } // Date and time conditions $mform->addElement('date_time_selector', 'availablefrom', get_string('availablefrom', 'condition'), array('optional' => true)); $mform->addElement('date_time_selector', 'availableuntil', get_string('availableuntil', 'condition'), array('optional' => true)); // Conditions based on grades $gradeoptions = array(); $items = grade_item::fetch_all(array('courseid' => $course->id)); $items = $items ? $items : array(); foreach ($items as $id => $item) { $gradeoptions[$id] = $item->get_name(); } asort($gradeoptions); $gradeoptions = array(0 => get_string('none', 'condition')) + $gradeoptions; $grouparray = array(); $grouparray[] = $mform->createElement('select', 'conditiongradeitemid', '', $gradeoptions); $grouparray[] = $mform->createElement('static', '', '', ' ' . get_string('grade_atleast', 'condition') . ' '); $grouparray[] = $mform->createElement('text', 'conditiongrademin', '', array('size' => 3)); $grouparray[] = $mform->createElement('static', '', '', '% ' . get_string('grade_upto', 'condition') . ' '); $grouparray[] = $mform->createElement('text', 'conditiongrademax', '', array('size' => 3)); $grouparray[] = $mform->createElement('static', '', '', '%'); $group = $mform->createElement('group', 'conditiongradegroup', get_string('gradecondition', 'condition'), $grouparray); // Get full version (including condition info) of section object $ci = new condition_info_section($this->_customdata['cs']); $fullcs = $ci->get_full_section(); $count = count($fullcs->conditionsgrade) + 1; // Grade conditions $this->repeat_elements(array($group), $count, array(), 'conditiongraderepeats', 'conditiongradeadds', 2, get_string('addgrades', 'condition'), true); $mform->addHelpButton('conditiongradegroup[0]', 'gradecondition', 'condition'); // Conditions based on completion $completion = new completion_info($course); if ($completion->is_enabled()) { $completionoptions = array(); $modinfo = get_fast_modinfo($course); foreach ($modinfo->cms as $id => $cm) { // Add each course-module if it: // (a) has completion turned on // (b) does not belong to current course-section if ($cm->completion && $fullcs->id != $cm->section) { $completionoptions[$id] = $cm->name; } } asort($completionoptions); $completionoptions = array(0 => get_string('none', 'condition')) + $completionoptions; $completionvalues = array(COMPLETION_COMPLETE => get_string('completion_complete', 'condition'), COMPLETION_INCOMPLETE => get_string('completion_incomplete', 'condition'), COMPLETION_COMPLETE_PASS => get_string('completion_pass', 'condition'), COMPLETION_COMPLETE_FAIL => get_string('completion_fail', 'condition')); $grouparray = array(); $grouparray[] = $mform->createElement('select', 'conditionsourcecmid', '', $completionoptions); $grouparray[] = $mform->createElement('select', 'conditionrequiredcompletion', '', $completionvalues); $group = $mform->createElement('group', 'conditioncompletiongroup', get_string('completioncondition', 'condition'), $grouparray); $count = count($fullcs->conditionscompletion) + 1; $this->repeat_elements(array($group), $count, array(), 'conditioncompletionrepeats', 'conditioncompletionadds', 2, get_string('addcompletions', 'condition'), true); $mform->addHelpButton('conditioncompletiongroup[0]', 'completionconditionsection', 'condition'); } // Availability conditions - set up form values if (!empty($CFG->enableavailability)) { $num = 0; foreach ($fullcs->conditionsgrade as $gradeitemid => $minmax) { $groupelements = $mform->getElement('conditiongradegroup[' . $num . ']')->getElements(); $groupelements[0]->setValue($gradeitemid); $groupelements[2]->setValue(is_null($minmax->min) ? '' : format_float($minmax->min, 5, true, true)); $groupelements[4]->setValue(is_null($minmax->max) ? '' : format_float($minmax->max, 5, true, true)); $num++; } if ($completion->is_enabled()) { $num = 0; foreach ($fullcs->conditionscompletion as $othercmid => $state) { $groupelements = $mform->getElement('conditioncompletiongroup[' . $num . ']')->getElements(); $groupelements[0]->setValue($othercmid); $groupelements[1]->setValue($state); $num++; } } } // Do we display availability info to students? $showhide = array(CONDITION_STUDENTVIEW_SHOW => get_string('showavailabilitysection_show', 'condition'), CONDITION_STUDENTVIEW_HIDE => get_string('showavailabilitysection_hide', 'condition')); $mform->addElement('select', 'showavailability', get_string('showavailabilitysection', 'condition'), $showhide); $mform->setDefault('showavailability', $this->_customdata['showavailability']); } $this->add_action_buttons(); }