From 3bb92bbe041c4fcb8fa2e6afe0704425d751b867 Mon Sep 17 00:00:00 2001 From: sam_marshall Date: Mon, 14 May 2007 12:11:47 +0000 Subject: [PATCH] MDL-9382: Added fields and orderby parameters to get_user_capability_course, which allows for greatly improved performance in the case where you want more information about the courses. (However, the function does still basically suck.) --- lib/accesslib.php | 76 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 16 deletions(-) diff --git a/lib/accesslib.php b/lib/accesslib.php index 5651691919..fd2304bf78 100755 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -3709,26 +3709,70 @@ function count_role_users($roleid, $context, $parent=false) { } /** - * This function gets the list of courses that this user has a particular capability in - * This is not the most efficient way of doing this - * @param string capability - * @param int $userid - * @return array - */ -function get_user_capability_course($capability, $userid=NULL) { - - $usercourses = array(); - $courses = get_records_select('course', '', '', 'id, id'); - - foreach ($courses as $course) { - if (has_capability($capability, get_context_instance(CONTEXT_COURSE, $course->id), $userid)) { - $usercourses[] = $course; + * This function gets the list of courses that this user has a particular capability in. + * It is still not very efficient. + * @param string $capability Capability in question + * @param int $userid User ID or null for current user + * @param bool $doanything True if 'doanything' is permitted (default) + * @param string $fieldsexceptid Leave blank if you only need 'id' in the course records; + * otherwise use a comma-separated list of the fields you require, not including id + * @param string $orderby If set, use a comma-separated list of fields from course + * table with sql modifiers (DESC) if needed + * @return array Array of courses, may have zero entries. Or false if query failed. + */ +function get_user_capability_course($capability, $userid=NULL,$doanything=true,$fieldsexceptid='',$orderby='') { + // Convert fields list and ordering + $fieldlist=''; + if($fieldsexceptid) { + $fields=explode(',',$fieldsexceptid); + foreach($fields as $field) { + $fieldlist.=',c.'.$field; + } + } + if($orderby) { + $fields=explode(',',$orderby); + $orderby=''; + foreach($fields as $field) { + if($orderby) { + $orderby.=','; + } + $orderby.='c.'.$field; + } + $orderby='ORDER BY '.$orderby; + } + + // Obtain a list of everything relevant about all courses including context. + // Note the result can be used directly as a context (we are going to), the course + // fields are just appended. + global $CFG; + $rs=get_recordset_sql(" +SELECT + x.*,c.id AS courseid$fieldlist +FROM + {$CFG->prefix}course c + INNER JOIN {$CFG->prefix}context x ON c.id=x.instanceid AND x.contextlevel=".CONTEXT_COURSE." +$orderby +"); + if(!$rs) { + return false; + } + + // Check capability for each course in turn + $courses=array(); + while($coursecontext=rs_fetch_next_record($rs)) { + if(has_capability($capability,$coursecontext,$userid,$doanything)) { + // We've got the capability. Make the record look like a course record + // and store it + $coursecontext->id=$coursecontext->courseid; + unset($coursecontext->courseid); + unset($coursecontext->contextlevel); + unset($coursecontext->instanceid); + $courses[]=$coursecontext; } } - return $usercourses; + return $courses; } - /** This function finds the roles assigned directly to this context only * i.e. no parents role * @param object $context -- 2.39.5