MDL-40121 Added plugin format_singleactivity
authorMarina Glancy <marina@moodle.com>
Fri, 12 Jul 2013 01:46:27 +0000 (11:46 +1000)
committerMarina Glancy <marina@moodle.com>
Mon, 15 Jul 2013 11:41:31 +0000 (21:41 +1000)
course/format/singleactivity/format.php [new file with mode: 0644]
course/format/singleactivity/lang/en/format_singleactivity.php [new file with mode: 0644]
course/format/singleactivity/lib.php [new file with mode: 0644]
course/format/singleactivity/renderer.php [new file with mode: 0644]
course/format/singleactivity/settings.php [new file with mode: 0644]
course/format/singleactivity/settingslib.php [new file with mode: 0644]
course/format/singleactivity/styles.css [new file with mode: 0644]
course/format/singleactivity/version.php [new file with mode: 0644]

diff --git a/course/format/singleactivity/format.php b/course/format/singleactivity/format.php
new file mode 100644 (file)
index 0000000..5996ef4
--- /dev/null
@@ -0,0 +1,31 @@
+<?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/>.
+
+/**
+ * format.php - course format featuring single activity included from view.php
+ *
+ * if we are not redirected before this point this means we want to
+ * either manage orphaned activities - i.e. display section 1,
+ * or the activity is not setup, does not have url or is not accessible at the
+ * moment
+ *
+ * @package    format_singleactivity
+ * @copyright  2012 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$courserenderer = $PAGE->get_renderer('format_singleactivity');
+echo $courserenderer->display($course, $section != 0);
diff --git a/course/format/singleactivity/lang/en/format_singleactivity.php b/course/format/singleactivity/lang/en/format_singleactivity.php
new file mode 100644 (file)
index 0000000..9b2887b
--- /dev/null
@@ -0,0 +1,34 @@
+<?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/>.
+
+/**
+ * Strings for component 'format_singleactivity'
+ *
+ * @package    format_singleactivity
+ * @copyright  2012 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+$string['activitytype'] = 'Type of activity';
+$string['activitytype_help'] = 'Choose the type of activity or resource to use in this course';
+$string['defactivitytype'] = 'Default type of activity';
+$string['defactivitytypedesc'] = 'Specify the activity type that will be selected by default when creating a new course';
+$string['erroractivitytype'] = 'Type of activity is not set up in Course settings';
+$string['orphaned'] = 'Orphaned';
+$string['orphanedwarning'] = 'These activities are unreachable by users!';
+$string['pluginname'] = 'Single activity format';
+$string['sectionname'] = '';
+$string['warningchangeformat'] = 'When changing the existing course format to "Single activity" make sure that you removed all extra activities from the course including the "News forum". Note that sections structure may be modified.';
diff --git a/course/format/singleactivity/lib.php b/course/format/singleactivity/lib.php
new file mode 100644 (file)
index 0000000..957519c
--- /dev/null
@@ -0,0 +1,392 @@
+<?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/>.
+
+/**
+ * This file contains main class for the course format singleactivity
+ *
+ * @package    format_singleactivity
+ * @copyright  2012 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+require_once($CFG->dirroot. '/course/format/lib.php');
+
+/**
+ * Main class for the singleactivity course format
+ *
+ * @package    format_singleactivity
+ * @copyright  2012 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class format_singleactivity extends format_base {
+    /** @var cm_info the current activity. Use get_activity() to retrieve it. */
+    private $activity = false;
+
+    /**
+     * The URL to use for the specified course
+     *
+     * @param int|stdClass $section Section object from database or just field course_sections.section
+     *     if null the course view page is returned
+     * @param array $options options for view URL. At the moment core uses:
+     *     'navigation' (bool) if true and section has no separate page, the function returns null
+     *     'sr' (int) used by multipage formats to specify to which section to return
+     * @return null|moodle_url
+     */
+    public function get_view_url($section, $options = array()) {
+        $sectionnum = $section;
+        if (is_object($sectionnum)) {
+            $sectionnum = $section->section;
+        }
+        if ($sectionnum == 1) {
+            return new moodle_url('/course/view.php', array('id' => $this->courseid, 'section' => 1));
+        }
+        if (!empty($options['navigation']) && $section !== null) {
+            return null;
+        }
+        return new moodle_url('/course/view.php', array('id' => $this->courseid));
+    }
+
+    /**
+     * Loads all of the course sections into the navigation
+     *
+     * @param global_navigation $navigation
+     * @param navigation_node $node The course node within the navigation
+     */
+    public function extend_course_navigation($navigation, navigation_node $node) {
+        // Display orphaned activities for the users who can see them.
+        $context = context_course::instance($this->courseid);
+        if (has_all_capabilities(array('moodle/course:viewhiddensections',
+                'moodle/course:viewhiddenactivities'), $context)) {
+            $modinfo = get_fast_modinfo($this->courseid);
+            if (!empty($modinfo->sections[1])) {
+                $section1 = $modinfo->get_section_info(1);
+                // Show orphaned activities.
+                $orphanednode = $node->add(get_string('orphaned', 'format_singleactivity'),
+                        $this->get_view_url(1), navigation_node::TYPE_SECTION, null, $section1->id);
+                $orphanednode->nodetype = navigation_node::NODETYPE_BRANCH;
+                $orphanednode->add_class('orphaned');
+                foreach ($modinfo->sections[1] as $cmid) {
+                    $this->navigation_add_activity($orphanednode, $modinfo->cms[$cmid]);
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds a course module to the navigation node
+     *
+     * This is basically copied from function global_navigation::load_section_activities()
+     * because it is not accessible from outside.
+     *
+     * @param navigation_node $node
+     * @param cm_info $cm
+     * @return null|navigation_node
+     */
+    protected function navigation_add_activity(navigation_node $node, $cm) {
+        if (!$cm->uservisible) {
+            return null;
+        }
+        $action = $cm->get_url();
+        if (!$action) {
+            // Do not add to navigation activity without url (i.e. labels).
+            return null;
+        }
+        $activityname = format_string($cm->name, true, array('context' => context_module::instance($cm->id)));
+        if ($cm->icon) {
+            $icon = new pix_icon($cm->icon, $cm->modfullname, $cm->iconcomponent);
+        } else {
+            $icon = new pix_icon('icon', $cm->modfullname, $cm->modname);
+        }
+        $activitynode = $node->add($activityname, $action, navigation_node::TYPE_ACTIVITY, null, $cm->id, $icon);
+        if (global_navigation::module_extends_navigation($cm->modname)) {
+            $activitynode->nodetype = navigation_node::NODETYPE_BRANCH;
+        } else {
+            $activitynode->nodetype = navigation_node::NODETYPE_LEAF;
+        }
+        return $activitynode;
+    }
+
+    /**
+     * Returns the list of blocks to be automatically added for the newly created course
+     *
+     * @return array of default blocks, must contain two keys BLOCK_POS_LEFT and BLOCK_POS_RIGHT
+     *     each of values is an array of block names (for left and right side columns)
+     */
+    public function get_default_blocks() {
+        // No blocks for this format because course view page is not displayed anyway.
+        return array(
+            BLOCK_POS_LEFT => array(),
+            BLOCK_POS_RIGHT => array()
+        );
+    }
+
+    /**
+     * Definitions of the additional options that this course format uses for course
+     *
+     * Singleactivity course format uses one option 'activitytype'
+     *
+     * @param bool $foreditform
+     * @return array of options
+     */
+    public function course_format_options($foreditform = false) {
+        static $courseformatoptions = false;
+        if ($courseformatoptions === false) {
+            $config = get_config('format_singleactivity');
+            $courseformatoptions = array(
+                'activitytype' => array(
+                    'default' => $config->activitytype,
+                    'type' => PARAM_TEXT,
+                ),
+            );
+        }
+        if ($foreditform && !isset($courseformatoptions['activitytype']['label'])) {
+            $availabletypes = get_module_types_names();
+            $courseformatoptionsedit = array(
+                'activitytype' => array(
+                    'label' => new lang_string('activitytype', 'format_singleactivity'),
+                    'help' => 'activitytype',
+                    'help_component' => 'format_singleactivity',
+                    'element_type' => 'select',
+                    'element_attributes' => array($availabletypes),
+                ),
+            );
+            $courseformatoptions = array_merge_recursive($courseformatoptions, $courseformatoptionsedit);
+        }
+        return $courseformatoptions;
+    }
+
+    /**
+     * Adds format options elements to the course/section edit form
+     *
+     * This function is called from {@link course_edit_form::definition_after_data()}
+     *
+     * Format singleactivity adds a warning when format of the course is about to be changed.
+     *
+     * @param MoodleQuickForm $mform form the elements are added to
+     * @param bool $forsection 'true' if this is a section edit form, 'false' if this is course edit form
+     * @return array array of references to the added form elements
+     */
+    public function create_edit_form_elements(&$mform, $forsection = false) {
+        global $PAGE;
+        $elements = parent::create_edit_form_elements($mform, $forsection);
+        if (!$forsection && ($course = $PAGE->course) && !empty($course->format) &&
+                $course->format !== 'site' && $course->format !== 'singleactivity') {
+            // This is the existing course in other format, display a warning.
+            $element = $mform->addElement('static', '', '',
+                    html_writer::tag('span', get_string('warningchangeformat', 'format_singleactivity'),
+                            array('class' => 'error')));
+            array_unshift($elements, $element);
+        }
+        return $elements;
+    }
+
+    /**
+     * Make sure that current active activity is in section 0
+     *
+     * All other activities are moved to section 1 that will be displayed as 'Orphaned'.
+     * It may be needed after the course format was changed or activitytype in
+     * course settings has been changed.
+     *
+     * @return null|cm_info current activity
+     */
+    public function reorder_activities() {
+        course_create_sections_if_missing($this->courseid, array(0, 1));
+        foreach ($this->get_sections() as $sectionnum => $section) {
+            if (($sectionnum && $section->visible) ||
+                    (!$sectionnum && !$section->visible)) {
+                // Make sure that 0 section is visible and all others are hidden.
+                set_section_visible($this->courseid, $sectionnum, $sectionnum == 0);
+            }
+        }
+        $modinfo = get_fast_modinfo($this->courseid);
+
+        // Find the current activity (first activity with the specified type in all course activities).
+        $activitytype = $this->get_activitytype();
+        $activity = null;
+        if (!empty($activitytype)) {
+            foreach ($modinfo->sections as $sectionnum => $cmlist) {
+                foreach ($cmlist as $cmid) {
+                    if ($modinfo->cms[$cmid]->modname === $activitytype) {
+                        $activity = $modinfo->cms[$cmid];
+                        break 2;
+                    }
+                }
+            }
+        }
+
+        // Make sure the current activity is in the 0-section.
+        if ($activity && $activity->sectionnum != 0) {
+            moveto_module($activity, $modinfo->get_section_info(0));
+            // Cache was reset so get modinfo again.
+            $modinfo = get_fast_modinfo($this->courseid);
+        }
+
+        // Move all other activities into section 1 (the order must be kept).
+        $hasvisibleactivities = false;
+        $firstorphanedcm = null;
+        foreach ($modinfo->sections as $sectionnum => $cmlist) {
+            if ($sectionnum && !empty($cmlist) && $firstorphanedcm === null) {
+                $firstorphanedcm = reset($cmlist);
+            }
+            foreach ($cmlist as $cmid) {
+                if ($sectionnum > 1) {
+                    moveto_module($modinfo->get_cm($cmid), $modinfo->get_section_info(1));
+                } else if (!$hasvisibleactivities && $sectionnum == 1 && $modinfo->get_cm($cmid)->visible) {
+                    $hasvisibleactivities = true;
+                }
+            }
+        }
+        if (!empty($modinfo->sections[0])) {
+            foreach ($modinfo->sections[0] as $cmid) {
+                if (!$activity || $cmid != $activity->id) {
+                    moveto_module($modinfo->get_cm($cmid), $modinfo->get_section_info(1), $firstorphanedcm);
+                }
+            }
+        }
+        if ($hasvisibleactivities) {
+            set_section_visible($this->courseid, 1, false);
+        }
+        return $activity;
+    }
+
+    /**
+     * Returns the name of activity type used for this course
+     *
+     * @return string|null
+     */
+    protected function get_activitytype() {
+        $options = $this->get_format_options();
+        $availabletypes = get_module_types_names();
+        if (!empty($options['activitytype']) &&
+                array_key_exists($options['activitytype'], $availabletypes)) {
+            return $options['activitytype'];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Returns the current activity if exists
+     *
+     * @return null|cm_info
+     */
+    protected function get_activity() {
+        if ($this->activity === false) {
+            $this->activity = $this->reorder_activities();
+        }
+        return $this->activity;
+    }
+
+    /**
+     * Allows course format to execute code on moodle_page::set_course()
+     *
+     * This function is executed before the output starts.
+     *
+     * If everything is configured correctly, user is redirected from the
+     * default course view page to the activity view page.
+     *
+     * "Section 1" is the administrative page to manage orphaned activities
+     *
+     * If user is on course view page and there is no module added to the course
+     * and the user has 'moodle/course:manageactivities' capability, redirect to create module
+     * form.
+     *
+     * @param moodle_page $page instance of page calling set_course
+     */
+    public function page_set_course(moodle_page $page) {
+        global $PAGE;
+        $page->add_body_class('format-'. $this->get_format());
+        if ($PAGE == $page && $page->has_set_url() &&
+                $page->url->compare(new moodle_url('/course/view.php'), URL_MATCH_BASE)) {
+            $edit = optional_param('edit', -1, PARAM_BOOL);
+            if (($edit == 0 || $edit == 1) && confirm_sesskey()) {
+                // This is a request to turn editing mode on or off, do not redirect here, /course/view.php will do redirection.
+                return;
+            }
+            $cm = $this->get_activity();
+            $cursection = optional_param('section', null, PARAM_INT);
+            if (!empty($cursection) && has_capability('moodle/course:viewhiddensections',
+                    context_course::instance($this->courseid))) {
+                // Display orphaned activities (course view page, section 1).
+                return;
+            }
+            if (!$this->get_activitytype()) {
+                if (has_capability('moodle/course:update', context_course::instance($this->courseid))) {
+                    // Teacher is redirected to edit course page.
+                    $url = new moodle_url('/course/edit.php', array('id' => $this->courseid));
+                    redirect($url, get_string('erroractivitytype', 'format_singleactivity'));
+                } else {
+                    // Student sees an empty course page.
+                    return;
+                }
+            }
+            if ($cm === null) {
+                if (has_capability('moodle/course:manageactivities', context_course::instance($this->courseid))) {
+                    // Teacher is redirected to create a new activity.
+                    $url = new moodle_url('/course/modedit.php',
+                            array('course' => $this->courseid, 'section' => 0, 'add' => $this->get_activitytype()));
+                    redirect($url);
+                } else {
+                    // Student views an empty course page.
+                    return;
+                }
+            } else if (!$cm->uservisible || !$cm->get_url()) {
+                // Activity is set but not visible to current user or does not have url.
+                // Display course page (either empty or with availability restriction info).
+                return;
+            } else {
+                // Everything is set up and accessible, redirect to the activity page!
+                redirect($cm->get_url());
+            }
+        }
+    }
+
+    /**
+     * Allows course format to execute code on moodle_page::set_cm()
+     *
+     * If we are inside the main module for this course, remove extra node level
+     * from navigation: substitute course node with activity node, move all children
+     *
+     * @param moodle_page $page instance of page calling set_cm
+     */
+    public function page_set_cm(moodle_page $page) {
+        global $PAGE;
+        parent::page_set_cm($page);
+        if ($PAGE == $page && ($cm = $this->get_activity()) &&
+                $cm->uservisible &&
+                ($cm->id === $page->cm->id) &&
+                ($activitynode = $page->navigation->find($cm->id, navigation_node::TYPE_ACTIVITY)) &&
+                ($node = $page->navigation->find($page->course->id, navigation_node::TYPE_COURSE))) {
+            // Substitute course node with activity node, move all children.
+            $node->action = $activitynode->action;
+            $node->type = $activitynode->type;
+            $node->id = $activitynode->id;
+            $node->key = $activitynode->key;
+            $node->isactive = $node->isactive || $activitynode->isactive;
+            $node->icon = null;
+            if ($activitynode->children->count()) {
+                foreach ($activitynode->children as &$child) {
+                    $child->remove();
+                    $node->add_node($child);
+                }
+            } else {
+                $node->search_for_active_node();
+            }
+            $activitynode->remove();
+        }
+    }
+}
diff --git a/course/format/singleactivity/renderer.php b/course/format/singleactivity/renderer.php
new file mode 100644 (file)
index 0000000..31aa866
--- /dev/null
@@ -0,0 +1,60 @@
+<?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/>.
+
+/**
+ * Renderer for outputting the singleactivity course format.
+ *
+ * @package    format_singleactivity
+ * @copyright  2013 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Basic renderer for singleactivity format.
+ *
+ * @package    format_singleactivity
+ * @copyright  2013 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class format_singleactivity_renderer extends plugin_renderer_base {
+
+    /**
+     * Displays the activities list in cases when course view page is not
+     * redirected to the activity page.
+     *
+     * @param stdClass $course record from table course
+     * @param bool $orphaned if false displays the main activity (if present)
+     *     if true displays all other activities
+     */
+    public function display($course, $orphaned) {
+        $courserenderer = $this->page->get_renderer('core', 'course');
+        if ($orphaned) {
+            $modinfo = get_fast_modinfo($course);
+
+            $output = '';
+            if (!empty($modinfo->sections[1])) {
+                $output .= $this->output->heading(get_string('orphaned', 'format_singleactivity'), 3, 'sectionname');
+                $output .= $this->output->box(get_string('orphanedwarning', 'format_singleactivity'));
+                $output .= $courserenderer->course_section_cm_list($course, 1, 1);
+            }
+            return $output;
+        } else {
+            return $courserenderer->course_section_cm_list($course, 0, 0);
+        }
+    }
+}
diff --git a/course/format/singleactivity/settings.php b/course/format/singleactivity/settings.php
new file mode 100644 (file)
index 0000000..8573600
--- /dev/null
@@ -0,0 +1,33 @@
+<?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/>.
+
+/**
+ * Settings for format_singleactivity
+ *
+ * @package    format_singleactivity
+ * @copyright  2012 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die;
+require_once($CFG->dirroot. '/course/format/singleactivity/settingslib.php');
+
+if ($ADMIN->fulltree) {
+    $settings->add(new format_singleactivity_admin_setting_activitytype('format_singleactivity/activitytype',
+            new lang_string('defactivitytype', 'format_singleactivity'),
+            new lang_string('defactivitytypedesc', 'format_singleactivity'),
+            'forum', null));
+}
diff --git a/course/format/singleactivity/settingslib.php b/course/format/singleactivity/settingslib.php
new file mode 100644 (file)
index 0000000..75494fc
--- /dev/null
@@ -0,0 +1,52 @@
+<?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/>.
+
+/**
+ * Settings class for format_singleactivity
+ *
+ * @package    format_singleactivity
+ * @copyright  2013 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die;
+
+/**
+ * Admin settings class for the format singleactivity activitytype choice
+ *
+ * @package    format_singleactivity
+ * @copyright  2013 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class format_singleactivity_admin_setting_activitytype extends admin_setting_configselect {
+    /**
+     * This function may be used in ancestors for lazy loading of choices
+     *
+     * Override this method if loading of choices is expensive, such
+     * as when it requires multiple db requests.
+     *
+     * @return bool true if loaded, false if error
+     */
+    public function load_choices() {
+        global $CFG;
+        require_once($CFG->dirroot. '/course/lib.php');
+        if (is_array($this->choices)) {
+            return true;
+        }
+        $this->choices = get_module_types_names();
+        return true;
+    }
+}
diff --git a/course/format/singleactivity/styles.css b/course/format/singleactivity/styles.css
new file mode 100644 (file)
index 0000000..65f7875
--- /dev/null
@@ -0,0 +1,10 @@
+/* Hide confusing form elements "Display description on course page" and
+"Save and return to course" from module edit form because they
+are not applicable in single activity course format */
+body.format-singleactivity.path-mod.pagelayout-admin form.mform #fitem_id_showdescription,
+body.format-singleactivity.path-mod.pagelayout-admin form.mform .fitem_actionbuttons#fgroup_id_buttonar #id_submitbutton {display:none;}
+
+/* In mod_quiz hide "Back to course" button */
+body.format-singleactivity.path-mod-quiz .quizattempt .continuebutton {display:none;}
+
+body.format-singleactivity .tree_item.orphaned a {color:red;}
diff --git a/course/format/singleactivity/version.php b/course/format/singleactivity/version.php
new file mode 100644 (file)
index 0000000..dea4103
--- /dev/null
@@ -0,0 +1,29 @@
+<?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/>.
+
+/**
+ * Version details
+ *
+ * @package    format_singleactivity
+ * @copyright  2012 Marina Glancy
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+$plugin->version   = 2013071200;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->requires  = 2013070800;        // Requires this Moodle version (2.6)
+$plugin->component = 'format_singleactivity';    // Full name of the plugin (used for diagnostics).