Skip to content
Snippets Groups Projects
block_course_overview_uwmoodle.php 8.54 KiB
Newer Older
<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Course overview block for UW Moodle
 *
 * This block improves on the default course_summary block by filtering courses by term.
 * The block is dependent on the UW enrollment plugins and is largely coped from the existing course_overview block.
 * I've left copyright statements for the original authors on most files.
defined('MOODLE_INTERNAL') || die;

require_once($CFG->dirroot.'/blocks/course_overview_uwmoodle/locallib.php');
require_once($CFG->dirroot.'/user/profile/lib.php');
require_once($CFG->dirroot.'/blocks/moodleblock.class.php');

class block_course_overview_uwmoodle extends block_base {
    /**
     * block initializations
     */
    public function init() {
        $this->title   = get_string('pluginname', 'block_course_overview_uwmoodle');
        if($CFG->version < '2013051400'){
            $PAGE->requires->css('/blocks/course_overview_uwmoodle/js/jquery-ui.min.css');
        }

    /**
     * Require jQuery and jQuery ui plugins for rendering the block
     */
    public function get_required_javascript() {
        parent::get_required_javascript();

        if($CFG->version >= '2013051400') {
            $this->page->requires->jquery();
            $this->page->requires->jquery_plugin('ui');
            $this->page->requires->jquery_plugin('ui-css');
            $this->page->requires->jquery_plugin('block_course_overview_uwmoodle-animate-enhanced', 'block_course_overview_uwmoodle');
        }else{
            $this->page->requires->js('/blocks/course_overview_uwmoodle/js/jquery-ui.min.js');
        }
        $this->page->requires->js('/blocks/course_overview_uwmoodle/js/course_overview_uwmoodle.js');
    }

    const TERM_OTHER = 0;  // our "term_code" for non-timetable classes

    /**
     * block contents
     *
     * @return object
     */
    public function get_content() {
        if($this->content !== NULL) {
            return $this->content;
        }

        $config = get_config('block_course_overview_uwmoodle');
        $this->content = new stdClass();
        $this->content->text = '';
        // start rendering the welcome section and then determine if this is AJAX load or php load
        $renderer = $this->page->get_renderer('block_course_overview_uwmoodle');
        if (!empty($config->showwelcomearea)) {
            require_once($CFG->dirroot.'/message/lib.php');
            $msgcount = message_count_unread_messages();
            $this->content->text = $renderer->welcome_area($msgcount);
        // next render the news section if there is any content
        if(!empty($config->news)){
            $this->content->text .= $renderer->render_news($config->news);
        }

        // Finally render the legend
        $this->content->text .= $renderer->render_create_course_and_legend();
        $usephp = optional_param('usephp', '', PARAM_ALPHA);
        IF(empty($usephp)){ // set up course blocks, but then let ajax load courses
            $this->content->text .= $renderer->use_ajax(true, $this->config); // adds in a javascript variable for using ajax
            $this->content->text .= $renderer->ajax_course_block();

            $this->content->text .= $renderer->ajax_other_course_block();
        }else{ // load courses without using ajax to load them on the client side
            $this->content->text .= $renderer->use_ajax(false); // adds in javascript variable to not use ajax

            // Get user's courses and sort by term
            $courses = block_course_overview_uwmoodle_get_sorted_courses();
            $terms = block_course_overview_uwmoodle_group_courses_by_term($courses);

            $currentterm = block_course_overview_uwmoodle_get_current_term();
            $selectedterm = optional_param('term', $currentterm, PARAM_INT);
            if (!isset($terms[$currentterm])) {
                $terms[$currentterm] = array();
            // If selectedterm is not valid, select currentterm
            if (!isset($terms[$selectedterm])) {
                $selectedterm = $currentterm;
            }

            // Get course overviews
            //$overviews = block_course_overview_uwmoodle_get_overviews($courses);
            $overviews = array(); // for now course overviews are disabled

            // Sort the terms with newest first
            block_course_overview_uwmoodle_sort_term_array($terms);
            $displayedterms = $terms;
            $othercourses = false;
            if (empty($this->config->combineongoing)) {
                unset($displayedterms[self::TERM_OTHER]);
                if (!empty($terms[self::TERM_OTHER])) {
                    $othercourses = $terms[self::TERM_OTHER];
                }
            }

            // Render the block
            $this->content->text .= $renderer->course_block($displayedterms, $overviews, $selectedterm);
            if (!empty($othercourses)) {
                $this->content->text .= $renderer->other_course_block($othercourses, $overviews);
            }
        $this->content->footer = $renderer->footer();
        return $this->content;
    }

    /**
     * Get the current term from the datastore, and update user show/hide preferences when it changes.
     *
     * @return boolean true on success
     */
    public function update_current_term() {
        global $CFG, $DB;

        $oldcurrentterm = get_config('block_course_overview_uwmoodle', 'currentterm');
        try {
            $currentterm = $this->get_current_term();
        } catch (Exception $e) {
            mtrace("Error fetching current term: ".$e->getMessage());
            return false;
        }
        if ($currentterm === false) {
            mtrace("No current term found");
            return false;
        }

        if ($currentterm && $currentterm != $oldcurrentterm) {
            // store new term
            mtrace('new current term: '.$currentterm);
            set_config('currentterm', $currentterm, 'block_course_overview_uwmoodle');
     * Fetch current term from CHUB.  Throw exception on CHUB error.
     *
     * @return string|false  term_code or false if none found.
     */
    public function get_current_term() {
        global $CFG;

        require_once($CFG->dirroot.'/enrol/wisc/lib/datastore.php');
        $datastore = wisc_timetable_datastore::get_timetable_datastore();
        $terms = $datastore->getAvailableTerms();

        $now = time();
        $futureterms = array();
        foreach ($terms as $term) {
            // check that term hasn't ended and doesn't have an odd termCode
            // odd term codes (e.g. Winter) are never considered the current term
            if ($term->endDate > $now && ($term->termCode % 2 != 1)) {
                $futureterms[] = $term->termCode;
            }
        }
        if (!empty($futureterms)) {
            $currentterm = min($futureterms);
        } else {
            $currentterm = false;
        }
        return $currentterm;
    }

    /**
     * allow the block to have a configuration page
     *
     * @return boolean
     */
    public function has_config() {
     * locations where block can be displayed
     *
     * @return array
     */
    public function applicable_formats() {
        return array('my-index'=>true);
    }

    /**
     * Block cron to update currentterm
     *
     * @return boolean true on success
     */
    public function cron() {
        return $this->update_current_term();
    }

    /**
     * Sets block header to be hidden or visible
     *
     * @return bool if true then header will be visible.
     */
    public function hide_header() {
        // Hide header if welcome area is show.
        $config = get_config('block_course_overview_uwmoodle');
        return !empty($config->showwelcomearea);
    }