MDL-41192 course: Added property-read cm_info::effectivegroupmode
authorMarina Glancy <marina@moodle.com>
Tue, 27 Aug 2013 02:08:53 +0000 (12:08 +1000)
committerMarina Glancy <marina@moodle.com>
Tue, 10 Sep 2013 04:11:36 +0000 (14:11 +1000)
course/lib.php
lib/grouplib.php
lib/modinfolib.php

index 1473e8c..1ba8ff9 100644 (file)
@@ -1929,18 +1929,13 @@ function course_get_cm_edit_actions(cm_info $mod, $indent = -1, $sr = null) {
 
     // Groupmode.
     if ($hasmanageactivities and plugin_supports('mod', $mod->modname, FEATURE_GROUPS, 0)) {
 
     // Groupmode.
     if ($hasmanageactivities and plugin_supports('mod', $mod->modname, FEATURE_GROUPS, 0)) {
-        if ($mod->coursegroupmodeforce) {
-            $modgroupmode = $mod->coursegroupmode;
-        } else {
-            $modgroupmode = $mod->groupmode;
-        }
-        if ($modgroupmode == SEPARATEGROUPS) {
+        if ($mod->effectivegroupmode == SEPARATEGROUPS) {
             $nextgroupmode = VISIBLEGROUPS;
             $grouptitle = $str->groupsseparate;
             $forcedgrouptitle = $str->forcedgroupsseparate;
             $actionname = 'groupsseparate';
             $groupimage = 't/groups';
             $nextgroupmode = VISIBLEGROUPS;
             $grouptitle = $str->groupsseparate;
             $forcedgrouptitle = $str->forcedgroupsseparate;
             $actionname = 'groupsseparate';
             $groupimage = 't/groups';
-        } else if ($modgroupmode == VISIBLEGROUPS) {
+        } else if ($mod->effectivegroupmode == VISIBLEGROUPS) {
             $nextgroupmode = NOGROUPS;
             $grouptitle = $str->groupsvisible;
             $forcedgrouptitle = $str->forcedgroupsvisible;
             $nextgroupmode = NOGROUPS;
             $grouptitle = $str->groupsvisible;
             $forcedgrouptitle = $str->forcedgroupsvisible;
index 0c71af1..6669ac6 100644 (file)
@@ -463,17 +463,19 @@ function groups_get_course_groupmode($course) {
  * Returns effective groupmode used in activity, course setting
  * overrides activity setting if groupmodeforce enabled.
  *
  * Returns effective groupmode used in activity, course setting
  * overrides activity setting if groupmodeforce enabled.
  *
+ * If $cm is an instance of cm_info it is easier to use $cm->effectivegroupmode
+ *
  * @category group
  * @param cm_info|stdClass $cm the course module object. Only the ->course and ->groupmode need to be set.
  * @param stdClass $course object optional course object to improve perf
  * @return int group mode
  */
 function groups_get_activity_groupmode($cm, $course=null) {
  * @category group
  * @param cm_info|stdClass $cm the course module object. Only the ->course and ->groupmode need to be set.
  * @param stdClass $course object optional course object to improve perf
  * @return int group mode
  */
 function groups_get_activity_groupmode($cm, $course=null) {
+    if ($cm instanceof cm_info) {
+        return $cm->effectivegroupmode;
+    }
     if (isset($course->id) and $course->id == $cm->course) {
         //ok
     if (isset($course->id) and $course->id == $cm->course) {
         //ok
-    } else if (isset($cm->coursegroupmode) && isset($cm->coursegroupmodeforce)) {
-        // This is an instance of cm_info (or clone) and already has the necessary course fields in it.
-        return empty($cm->coursegroupmodeforce) ? $cm->groupmode : $cm->coursegroupmode;
     } else {
         // Get course object (reuse $COURSE if possible).
         $course = get_course($cm->course, false);
     } else {
         // Get course object (reuse $COURSE if possible).
         $course = get_course($cm->course, false);
index 1542a98..a3af70c 100644 (file)
@@ -469,17 +469,20 @@ class course_modinfo extends stdClass {
  *    course_modules table
  * @property-read int $visibleold Old visible setting (if the entire section is hidden, the previous value for
  *    visible is stored in this field) - from course_modules table
  *    course_modules table
  * @property-read int $visibleold Old visible setting (if the entire section is hidden, the previous value for
  *    visible is stored in this field) - from course_modules table
- * @property-read int $groupmode Group mode (one of the constants NONE, SEPARATEGROUPS, or VISIBLEGROUPS) - from
- *    course_modules table
+ * @property-read int $groupmode Group mode (one of the constants NOGROUPS, SEPARATEGROUPS, or VISIBLEGROUPS) - from
+ *    course_modules table. Use {@link cm_info::$effectivegroupmode} to find the actual group mode that may be forced by course.
  * @property-read int $groupingid Grouping ID (0 = all groupings)
  * @property-read int $groupmembersonly Group members only (if set to 1, only members of a suitable group see this link on the
  *    course page; 0 = everyone sees it even if they don't belong to a suitable group) - from
  *    course_modules table
  * @property-read bool $coursegroupmodeforce Indicates whether the course containing the module has forced the groupmode
  *    This means that cm_info::$groupmode should be ignored and cm_info::$coursegroupmode be used instead
  * @property-read int $groupingid Grouping ID (0 = all groupings)
  * @property-read int $groupmembersonly Group members only (if set to 1, only members of a suitable group see this link on the
  *    course page; 0 = everyone sees it even if they don't belong to a suitable group) - from
  *    course_modules table
  * @property-read bool $coursegroupmodeforce Indicates whether the course containing the module has forced the groupmode
  *    This means that cm_info::$groupmode should be ignored and cm_info::$coursegroupmode be used instead
- * @property-read int $coursegroupmode Group mode (one of the constants NONE, SEPARATEGROUPS, or VISIBLEGROUPS) - from
+ * @property-read int $coursegroupmode Group mode (one of the constants NOGROUPS, SEPARATEGROUPS, or VISIBLEGROUPS) - from
  *    course table - as specified for the course containing the module
  *    Effective only if {@link cm_info::$coursegroupmodeforce} is set
  *    course table - as specified for the course containing the module
  *    Effective only if {@link cm_info::$coursegroupmodeforce} is set
+ * @property-read int $effectivegroupmode Effective group mode for this module (one of the constants NOGROUPS, SEPARATEGROUPS,
+ *    or VISIBLEGROUPS). This can be different from groupmode set for the module if the groupmode is forced for the course.
+ *    This value will always be NOGROUPS if module type does not support group mode.
  * @property-read int $indent Indent level on course page (0 = no indent) - from course_modules table
  * @property-read int $completion Activity completion setting for this activity, COMPLETION_TRACKING_xx constant - from
  *    course_modules table
  * @property-read int $indent Indent level on course page (0 = no indent) - from course_modules table
  * @property-read int $completion Activity completion setting for this activity, COMPLETION_TRACKING_xx constant - from
  *    course_modules table
@@ -875,6 +878,7 @@ class cm_info implements IteratorAggregate {
         'course' => 'get_course_id',
         'coursegroupmode' => 'get_course_groupmode',
         'coursegroupmodeforce' => 'get_course_groupmodeforce',
         'course' => 'get_course_id',
         'coursegroupmode' => 'get_course_groupmode',
         'coursegroupmodeforce' => 'get_course_groupmodeforce',
+        'effectivegroupmode' => 'get_effective_groupmode',
         'extra' => false,
         'groupingid' => false,
         'groupmembersonly' => false,
         'extra' => false,
         'groupingid' => false,
         'groupmembersonly' => false,
@@ -1232,6 +1236,22 @@ class cm_info implements IteratorAggregate {
         return $this->modinfo->get_course()->groupmodeforce;
     }
 
         return $this->modinfo->get_course()->groupmodeforce;
     }
 
+    /**
+     * Returns effective groupmode of the module that may be overwritten by forced course groupmode.
+     *
+     * @return int one of constants NOGROUPS, SEPARATEGROUPS, VISIBLEGROUPS
+     */
+    private function get_effective_groupmode() {
+        $groupmode = $this->groupmode;
+        if ($this->modinfo->get_course()->groupmodeforce) {
+            $groupmode = $this->modinfo->get_course()->groupmode;
+            if ($groupmode != NOGROUPS && !plugin_supports('mod', $this->modname, FEATURE_GROUPS, 0)) {
+                $groupmode = NOGROUPS;
+            }
+        }
+        return $groupmode;
+    }
+
     /**
      * @return context_module Current module context
      */
     /**
      * @return context_module Current module context
      */