Example #1
0
    /**
     * 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});
            }
        }
    }
Example #2
0
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();
 }
Example #4
0
 /**
  * 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);
 }
Example #7
0
    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));
    }
Example #8
0
 /**
  * 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;
 }
Example #9
0
 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();
 }