|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 00008 class block_online_users extends block_base { 00009 function init() { 00010 $this->title = get_string('pluginname','block_online_users'); 00011 } 00012 00013 function has_config() {return true;} 00014 00015 function get_content() { 00016 global $USER, $CFG, $DB, $OUTPUT; 00017 00018 if ($this->content !== NULL) { 00019 return $this->content; 00020 } 00021 00022 $this->content = new stdClass; 00023 $this->content->text = ''; 00024 $this->content->footer = ''; 00025 00026 if (empty($this->instance)) { 00027 return $this->content; 00028 } 00029 00030 $timetoshowusers = 300; //Seconds default 00031 if (isset($CFG->block_online_users_timetosee)) { 00032 $timetoshowusers = $CFG->block_online_users_timetosee * 60; 00033 } 00034 $timefrom = 100 * floor((time()-$timetoshowusers) / 100); // Round to nearest 100 seconds for better query cache 00035 00036 //Calculate if we are in separate groups 00037 $isseparategroups = ($this->page->course->groupmode == SEPARATEGROUPS 00038 && $this->page->course->groupmodeforce 00039 && !has_capability('moodle/site:accessallgroups', $this->page->context)); 00040 00041 //Get the user current group 00042 $currentgroup = $isseparategroups ? groups_get_course_group($this->page->course) : NULL; 00043 00044 $groupmembers = ""; 00045 $groupselect = ""; 00046 $params = array(); 00047 00048 //Add this to the SQL to show only group users 00049 if ($currentgroup !== NULL) { 00050 $groupmembers = ", {groups_members} gm"; 00051 $groupselect = "AND u.id = gm.userid AND gm.groupid = :currentgroup"; 00052 $params['currentgroup'] = $currentgroup; 00053 } 00054 00055 $userfields = user_picture::fields('u', array('username')); 00056 00057 if ($this->page->course->id == SITEID or $this->page->context->contextlevel < CONTEXT_COURSE) { // Site-level 00058 $sql = "SELECT $userfields, MAX(u.lastaccess) AS lastaccess 00059 FROM {user} u $groupmembers 00060 WHERE u.lastaccess > $timefrom 00061 $groupselect 00062 GROUP BY $userfields 00063 ORDER BY lastaccess DESC "; 00064 00065 $csql = "SELECT COUNT(u.id) 00066 FROM {user} u $groupmembers 00067 WHERE u.lastaccess > $timefrom 00068 $groupselect"; 00069 00070 } else { 00071 // Course level - show only enrolled users for now 00072 // TODO: add a new capability for viewing of all users (guests+enrolled+viewing) 00073 00074 list($esqljoin, $eparams) = get_enrolled_sql($this->page->context); 00075 $params = array_merge($params, $eparams); 00076 00077 $sql = "SELECT $userfields, MAX(ul.timeaccess) AS lastaccess 00078 FROM {user_lastaccess} ul $groupmembers, {user} u 00079 JOIN ($esqljoin) euj ON euj.id = u.id 00080 WHERE ul.timeaccess > $timefrom 00081 AND u.id = ul.userid 00082 AND ul.courseid = :courseid 00083 $groupselect 00084 GROUP BY $userfields 00085 ORDER BY lastaccess DESC"; 00086 00087 $csql = "SELECT COUNT(u.id) 00088 FROM {user_lastaccess} ul $groupmembers, {user} u 00089 JOIN ($esqljoin) euj ON euj.id = u.id 00090 WHERE ul.timeaccess > $timefrom 00091 AND u.id = ul.userid 00092 AND ul.courseid = :courseid 00093 $groupselect"; 00094 00095 $params['courseid'] = $this->page->course->id; 00096 } 00097 00098 //Calculate minutes 00099 $minutes = floor($timetoshowusers/60); 00100 00101 // Verify if we can see the list of users, if not just print number of users 00102 if (!has_capability('block/online_users:viewlist', $this->page->context)) { 00103 if (!$usercount = $DB->count_records_sql($csql, $params)) { 00104 $usercount = get_string("none"); 00105 } 00106 $this->content->text = "<div class=\"info\">".get_string("periodnminutes","block_online_users",$minutes).": $usercount</div>"; 00107 return $this->content; 00108 } 00109 00110 if ($users = $DB->get_records_sql($sql, $params, 0, 50)) { // We'll just take the most recent 50 maximum 00111 foreach ($users as $user) { 00112 $users[$user->id]->fullname = fullname($user); 00113 } 00114 } else { 00115 $users = array(); 00116 } 00117 00118 if (count($users) < 50) { 00119 $usercount = ""; 00120 } else { 00121 $usercount = $DB->count_records_sql($csql, $params); 00122 $usercount = ": $usercount"; 00123 } 00124 00125 $this->content->text = "<div class=\"info\">(".get_string("periodnminutes","block_online_users",$minutes)."$usercount)</div>"; 00126 00127 //Now, we have in users, the list of users to show 00128 //Because they are online 00129 if (!empty($users)) { 00130 //Accessibility: Don't want 'Alt' text for the user picture; DO want it for the envelope/message link (existing lang string). 00131 //Accessibility: Converted <div> to <ul>, inherit existing classes & styles. 00132 $this->content->text .= "<ul class='list'>\n"; 00133 if (isloggedin() && has_capability('moodle/site:sendmessage', $this->page->context) 00134 && !empty($CFG->messaging) && !isguestuser()) { 00135 $canshowicon = true; 00136 } else { 00137 $canshowicon = false; 00138 } 00139 foreach ($users as $user) { 00140 $this->content->text .= '<li class="listentry">'; 00141 $timeago = format_time(time() - $user->lastaccess); //bruno to calculate correctly on frontpage 00142 00143 if (isguestuser($user)) { 00144 $this->content->text .= '<div class="user">'.$OUTPUT->user_picture($user, array('size'=>16)); 00145 $this->content->text .= get_string('guestuser').'</div>'; 00146 00147 } else { 00148 $this->content->text .= '<div class="user">'.$OUTPUT->user_picture($user, array('size'=>16)); 00149 $this->content->text .= '<a href="'.$CFG->wwwroot.'/user/view.php?id='.$user->id.'&course='.$this->page->course->id.'" title="'.$timeago.'">'.$user->fullname.'</a></div>'; 00150 } 00151 if ($canshowicon and ($USER->id != $user->id) and !isguestuser($user)) { // Only when logged in and messaging active etc 00152 $anchortagcontents = '<img class="iconsmall" src="'.$OUTPUT->pix_url('t/message') . '" alt="'. get_string('messageselectadd') .'" />'; 00153 $anchortag = '<a href="'.$CFG->wwwroot.'/message/index.php?id='.$user->id.'" title="'.get_string('messageselectadd').'">'.$anchortagcontents .'</a>'; 00154 00155 $this->content->text .= '<div class="message">'.$anchortag.'</div>'; 00156 } 00157 $this->content->text .= "</li>\n"; 00158 } 00159 $this->content->text .= '</ul><div class="clearer"><!-- --></div>'; 00160 } else { 00161 $this->content->text .= "<div class=\"info\">".get_string("none")."</div>"; 00162 } 00163 00164 return $this->content; 00165 } 00166 } 00167 00168