diff --git a/mod/data/lib.php b/mod/data/lib.php index 77da8d46b3e..5eff5594da4 100644 --- a/mod/data/lib.php +++ b/mod/data/lib.php @@ -3467,21 +3467,28 @@ function data_user_can_delete_preset($context, $preset) { /** * Get all of the record ids from a database activity. * - * @param int $dataid The dataid of the database module. - * @return array $idarray An array of record ids + * @param int $dataid The dataid of the database module. + * @param object $selectdata Contains an additional sql statement for the + * where clause for group and approval fields. + * @param array $params Parameters that coincide with the sql statement. + * @return array $idarray An array of record ids */ -function data_get_all_recordids($dataid) { +function data_get_all_recordids($dataid, $selectdata = '', $params = null) { global $DB; - $initsql = 'SELECT c.recordid - FROM {data_fields} f, - {data_content} c - WHERE f.dataid = :dataid - AND f.id = c.fieldid - GROUP BY c.recordid'; - $initrecord = $DB->get_recordset_sql($initsql, array('dataid' => $dataid)); + $initsql = 'SELECT r.id + FROM {data_records} r + WHERE r.dataid = :dataid'; + if ($selectdata != '') { + $initsql .= $selectdata; + $params = array_merge(array('dataid' => $dataid), $params); + } else { + $params = array('dataid' => $dataid); + } + $initsql .= ' GROUP BY r.id'; + $initrecord = $DB->get_recordset_sql($initsql, $params); $idarray = array(); foreach ($initrecord as $data) { - $idarray[] = $data->recordid; + $idarray[] = $data->id; } // Close the record set and free up resources. $initrecord->close(); @@ -3626,8 +3633,7 @@ function data_get_advanced_search_sql($sort, $data, $recordids, $selectdata, $so } else { list($insql, $inparam) = $DB->get_in_or_equal(array('-1'), SQL_PARAMS_NAMED); } - $nestfromsql .= ' AND c.recordid ' . $insql . $groupsql; - $nestfromsql = "$nestfromsql $selectdata"; + $nestfromsql .= ' AND c.recordid ' . $insql . $selectdata . $groupsql; $sqlselect['sql'] = "$nestselectsql $nestfromsql $sortorder"; $sqlselect['params'] = $inparam; return $sqlselect; diff --git a/mod/data/view.php b/mod/data/view.php index 456eafa5110..63215964d23 100644 --- a/mod/data/view.php +++ b/mod/data/view.php @@ -322,6 +322,13 @@ groups_print_activity_menu($cm, $returnurl); $currentgroup = groups_get_activity_group($cm); $groupmode = groups_get_activity_groupmode($cm); + // If a student is not part of a group and seperate groups is enabled, we don't + // want them seeing all records. + if ($currentgroup == 0 && $groupmode == 1 && !has_capability('mod/data:manageentries', $context)) { + $canviewallrecords = false; + } else { + $canviewallrecords = true; + } // detect entries not approved yet and show hint instead of not found error if ($record and $data->approval and !$record->approved and $record->userid != $USER->id and !has_capability('mod/data:manageentries', $context)) { @@ -466,7 +473,13 @@ if ($showactivity) { $groupselect = " AND (r.groupid = :currentgroup OR r.groupid = 0)"; $params['currentgroup'] = $currentgroup; } else { - $groupselect = ' '; + if ($canviewallrecords) { + $groupselect = ' '; + } else { + // If separate groups are enabled and the user isn't in a group or + // a teacher, manager, admin etc, then just show them entries for 'All participants'. + $groupselect = " AND r.groupid = 0"; + } } // Init some variables to be used by advanced search @@ -590,10 +603,19 @@ if ($showactivity) { $fromsql = "FROM $tables $advtables $where $advwhere $groupselect $approveselect $searchselect $advsearchselect"; $allparams = array_merge($params, $advparams); - $recordids = data_get_all_recordids($data->id); + // Provide initial sql statements and parameters to reduce the number of total records. + $selectdata = $groupselect . $approveselect; + $initialparams = array(); + if ($currentgroup) { + $initialparams['currentgroup'] = $params['currentgroup']; + } + if (!$approvecap && $data->approval && isloggedin()) { + $initialparams['myid1'] = $params['myid1']; + } + + $recordids = data_get_all_recordids($data->id, $selectdata, $initialparams); $newrecordids = data_get_advance_search_ids($recordids, $search_array, $data->id); $totalcount = count($newrecordids); - $selectdata = $groupselect . $approveselect; if (!empty($advanced)) { $advancedsearchsql = data_get_advanced_search_sql($sort, $data, $newrecordids, $selectdata, $sortorder); diff --git a/mod/upgrade.txt b/mod/upgrade.txt index 23e666b700e..17a763004e2 100644 --- a/mod/upgrade.txt +++ b/mod/upgrade.txt @@ -10,12 +10,19 @@ required changes in code: * textlib->asort() replaced by specialized collatorlib::asort() * use new make_temp_directory() and make_cache_directory() +optional - no changes needed: + +* mod/data/lib.php data_get_all_recordids() now has two new optional variables: $selectdata and $params. === 2.1 === required changes in code: * add new support for basic restore from 1.9 +optional - no changes needed: + +* mod/data/lib.php data_get_all_recordids() now has two new optional variables: $selectdata and $params. + === 2.0 ===