/** * @return void */ function disconnect_user_of_chat() { $list_info_user_in_chat = users_list_in_chat(); $course_id = api_get_course_int_id(); $groupId = api_get_group_id(); $now = time(); $cd_date = date('Y-m-d', $now); $cdate_h = date('H', $now); $cdate_m = date('i', $now); $cdate_s = date('s', $now); $cd_count_time_seconds = $cdate_h * 3600 + $cdate_m * 60 + $cdate_s; if (is_array($list_info_user_in_chat) && count($list_info_user_in_chat) > 0) { foreach ($list_info_user_in_chat as $list_info_user) { $date_db_date = date('Y-m-d', api_strtotime($list_info_user['last_connection'], 'UTC')); $date_db_h = date('H', api_strtotime($list_info_user['last_connection'], 'UTC')); $date_db_m = date('i', api_strtotime($list_info_user['last_connection'], 'UTC')); $date_db_s = date('s', api_strtotime($list_info_user['last_connection'], 'UTC')); $date_count_time_seconds = $date_db_h * 3600 + $date_db_m * 60 + $date_db_s; if ($cd_date == $date_db_date) { if ($cd_count_time_seconds - $date_count_time_seconds > 5) { $tbl_chat_connected = Database::get_course_table(TABLE_CHAT_CONNECTED); $sql = 'DELETE FROM ' . $tbl_chat_connected . ' WHERE c_id = ' . $course_id . ' AND user_id = ' . $list_info_user['user_id'] . ' AND to_group_id = ' . $groupId . ' '; Database::query($sql); } } } } }
function validate($values, $options) { if (!is_array($values[0]) && !is_array($values[1])) { return api_strtotime($values[0]) < api_strtotime($values[1]); } else { $compareFn = create_function('$a, $b', 'return mktime($a[\'H\'],$a[\'i\'],0,$a[\'M\'],$a[\'d\'],$a[\'Y\']) <= mktime($b[\'H\'],$b[\'i\'],0,$b[\'M\'],$b[\'d\'],$b[\'Y\'] );'); return $compareFn($values[0], $values[1]); } }
/** * Refreshes the chat windows (usually called every x seconds through AJAX) * @return void (prints JSON array of chat windows) */ public function heartbeat() { $to_user_id = api_get_user_id(); $minutes = 60; $now = time() - $minutes * 60; $now = api_get_utc_datetime($now); //OR sent > '$now' $sql = "SELECT * FROM " . $this->table . "\n WHERE to_user = '******' AND ( recd = 0 ) ORDER BY id ASC"; $result = Database::query($sql); $chat_list = array(); while ($chat = Database::fetch_array($result, 'ASSOC')) { $chat_list[$chat['from_user']]['items'][] = $chat; } $items = array(); foreach ($chat_list as $from_user_id => $rows) { $rows = $rows['items']; $user_info = api_get_user_info($from_user_id, true); //Cleaning tsChatBoxes unset($_SESSION['tsChatBoxes'][$from_user_id]); foreach ($rows as $chat) { $chat['message'] = Security::remove_XSS($chat['message']); $item = array('s' => '0', 'f' => $from_user_id, 'm' => $chat['message'], 'username' => $user_info['complete_name'], 'id' => $chat['id']); $items[$from_user_id]['items'][] = $item; $items[$from_user_id]['user_info']['user_name'] = $user_info['complete_name']; $items[$from_user_id]['user_info']['online'] = $user_info['user_is_online']; $_SESSION['openChatBoxes'][$from_user_id] = api_strtotime($chat['sent'], 'UTC'); } $_SESSION['chatHistory'][$from_user_id]['items'][] = $item; $_SESSION['chatHistory'][$from_user_id]['user_info']['user_name'] = $user_info['complete_name']; $_SESSION['chatHistory'][$from_user_id]['user_info']['online'] = $user_info['user_is_online']; } if (!empty($_SESSION['openChatBoxes'])) { foreach ($_SESSION['openChatBoxes'] as $user_id => $time) { if (!isset($_SESSION['tsChatBoxes'][$user_id])) { $now = time() - $time; $time = api_convert_and_format_date($time, DATE_TIME_FORMAT_SHORT_TIME_FIRST); $message = sprintf(get_lang('SentAtX'), $time); if ($now > 180) { $item = array('s' => '2', 'f' => $user_id, 'm' => $message); if (isset($_SESSION['chatHistory'][$user_id])) { $_SESSION['chatHistory'][$user_id]['items'][] = $item; } $_SESSION['tsChatBoxes'][$user_id] = 1; } } } } $sql = "UPDATE " . $this->table . " SET recd = 1 WHERE to_user = '******' AND recd = 0"; Database::query($sql); if ($items != '') { //$items = substr($items, 0, -1); } echo json_encode(array('items' => $items)); }
/** * Validate 2 dates * @param string $operator The operator to use (default '==') * @return boolean True if the 2 given dates match the operator */ function validate($values, $operator = null) { $datetime1 = api_strtotime($values[0]); $datetime2 = api_strtotime($values[1]); if (strpos($operator, 'allow_empty') !== false) { $operator = str_replace('allow_empty', '', $operator); if (!$datetime2 || empty($datetime2)) { return true; } } $result = parent::validate(array($datetime1, $datetime2), $operator); return $result; }
/** * * @param int student id * @param int years * @param bool show warning_message * @param bool return_timestamp */ public static function delete_inactive_student($student_id, $years = 2, $warning_message = false, $return_timestamp = false) { $tbl_track_login = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN); $sql = 'SELECT login_date FROM ' . $tbl_track_login . ' WHERE login_user_id = ' . intval($student_id) . ' ORDER BY login_date DESC LIMIT 0,1'; if (empty($years)) { $years = 1; } $inactive_time = $years * 31536000; //1 year $rs = Database::query($sql); if (Database::num_rows($rs) > 0) { if ($last_login_date = Database::result($rs, 0, 0)) { $last_login_date = api_get_local_time($last_login_date, null, date_default_timezone_get()); if ($return_timestamp) { return api_strtotime($last_login_date); } else { if (!$warning_message) { return api_format_date($last_login_date, DATE_FORMAT_SHORT); } else { $timestamp = api_strtotime($last_login_date); $currentTimestamp = time(); //If the last connection is > than 7 days, the text is red //345600 = 7 days in seconds 63072000= 2 ans // if ($currentTimestamp - $timestamp > 184590 ) if ($currentTimestamp - $timestamp > $inactive_time && UserManager::delete_user($student_id)) { Display::display_normal_message(get_lang('UserDeleted')); echo '<p>', 'id', $student_id, ':', $last_login_date, '</p>'; } } } } } return false; }
/** * @param int $exe_id * @return array|mixed */ public function get_stat_track_exercise_info_by_exe_id($exe_id) { $track_exercises = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); $exe_id = intval($exe_id); $sql_track = "SELECT * FROM {$track_exercises} WHERE exe_id = {$exe_id} "; $result = Database::query($sql_track); $new_array = array(); if (Database::num_rows($result) > 0) { $new_array = Database::fetch_array($result, 'ASSOC'); $new_array['duration'] = null; $start_date = api_get_utc_datetime($new_array['start_date'], true); $end_date = api_get_utc_datetime($new_array['exe_date'], true); if (!empty($start_date) && !empty($end_date)) { $start_date = api_strtotime($start_date, 'UTC'); $end_date = api_strtotime($end_date, 'UTC'); if ($start_date && $end_date) { $mytime = $end_date - $start_date; $new_learnpath_item = new learnpathItem(null); $time_attemp = $new_learnpath_item->get_scorm_time('js', $mytime); $h = get_lang('h'); $time_attemp = str_replace('NaN', '00' . $h . '00\'00"', $time_attemp); $new_array['duration'] = $time_attemp; } } } return $new_array; }
/** * This function checks if the learnpath is visible for student after the progress of its prerequisite is completed, and considering time availability * @param int Learnpath id * @param int Student id * @param string Course code (optional) * @return bool True if */ public static function is_lp_visible_for_student($lp_id, $student_id, $course_code = null) { $lp_id = (int) $lp_id; $course_info = api_get_course_info($course_code); $tbl_learnpath = Database::get_course_table(TABLE_LP_MAIN); // Get current prerequisite $sql = "SELECT id, prerequisite, subscribe_users, publicated_on, expired_on\n FROM {$tbl_learnpath} WHERE c_id = " . $course_info['real_id'] . " AND id = {$lp_id}"; $rs = Database::query($sql); $now = time(); $session_id = api_get_session_id(); if (Database::num_rows($rs) > 0) { $row = Database::fetch_array($rs, 'ASSOC'); $prerequisite = $row['prerequisite']; $is_visible = true; $progress = 0; //Checking LP prerequisites if (!empty($prerequisite)) { $progress = intval(self::get_db_progress($prerequisite, $student_id, '%', '', false, $session_id)); if ($progress < 100) { $is_visible = false; } } // Also check the time availability of the LP if ($is_visible) { //Adding visibility restrictions if (!empty($row['publicated_on']) && $row['publicated_on'] != '0000-00-00 00:00:00') { if ($now < api_strtotime($row['publicated_on'], 'UTC')) { //api_not_allowed(); $is_visible = false; } } //Blocking empty start times see BT#2800 global $_custom; if (isset($_custom['lps_hidden_when_no_start_date']) && $_custom['lps_hidden_when_no_start_date']) { if (empty($row['publicated_on']) || $row['publicated_on'] == '0000-00-00 00:00:00') { //api_not_allowed(); $is_visible = false; } } if (!empty($row['expired_on']) && $row['expired_on'] != '0000-00-00 00:00:00') { if ($now > api_strtotime($row['expired_on'], 'UTC')) { //api_not_allowed(); $is_visible = false; } } } //Check if the subscription users/group to a LP is ON if (isset($row['subscribe_users']) && $row['subscribe_users'] == 1) { //Checking only the user visibility $userVisibility = api_get_item_visibility($course_info, 'learnpath', $row['id'], $session_id, $student_id, 'LearnpathSubscription'); if ($userVisibility == 1) { $is_visible = true; } else { $is_visible = false; } //the group visibility is not going to be checked because the user *must* be related to the LP /*$groupList = GroupManager::get_group_ids($course_info['real_id'], $student_id); if (!empty($groupList)) { foreach($groupList as $groupId) { $groupVisibility = api_get_item_visibility($course_info, 'learnpath', $row['id'], $session_id, 0, 'LearnpathSubscription', $groupId); if ($groupVisibility == 1) { $is_visible = true; break; } } }*/ } return $is_visible; } return false; }
SystemAnnouncementManager::delete_announcement($_GET['id']); Display::display_confirmation_message(get_lang('AnnouncementDeleted')); break; case 'delete_selected': foreach ($_POST['id'] as $index => $id) { SystemAnnouncementManager::delete_announcement($id); } Display::display_confirmation_message(get_lang('AnnouncementDeleted')); $action_todo = false; break; case 'add': // Add an announcement. $values['action'] = 'add'; // Set default time window: NOW -> NEXT WEEK $values['start'] = date('Y-m-d H:i:s', api_strtotime(api_get_local_time())); $values['end'] = date('Y-m-d H:i:s', api_strtotime(api_get_local_time()) + 7 * 24 * 60 * 60); $values['range'] = substr(api_get_local_time(time()), 0, 16) . ' / ' . substr(api_get_local_time(time() + 7 * 24 * 60 * 60), 0, 16); $action_todo = true; break; case 'edit': // Edit an announcement. $announcement = SystemAnnouncementManager::get_announcement($_GET['id']); $values['id'] = $announcement->id; $values['title'] = $announcement->title; $values['content'] = $announcement->content; $values['start'] = api_get_local_time($announcement->date_start); $values['end'] = api_get_local_time($announcement->date_end); $values['range'] = substr(api_get_local_time($announcement->date_start), 0, 16) . ' / ' . substr(api_get_local_time($announcement->date_end), 0, 16); $values['visible_teacher'] = $announcement->visible_teacher; $values['visible_student'] = $announcement->visible_student; $values['visible_guest'] = $announcement->visible_guest;
} if (isset($error_checkdate) && $error_checkdate) { $message = get_lang('InvalidDate'); Display::display_error_message($message, false); } if (isset($action) && $action == 'calendar_add') { $groupList = GroupManager::get_group_list(null, null, 1); $groupIdList = array('--'); foreach ($groupList as $group) { $groupIdList[$group['id']] = $group['name']; } // calendar add form $form = new FormValidator('attendance_calendar_add', 'POST', 'index.php?action=calendar_add&attendance_id=' . $attendance_id . $param_gradebook . '&' . api_get_cidreq(), ''); $form->addElement('header', get_lang('AddADateTime')); $form->addElement('date_time_picker', 'date_time'); $defaults['date_time'] = date('Y-m-d H:i', api_strtotime(api_get_local_time())); $form->addElement('checkbox', 'repeat', null, get_lang('RepeatDate'), array('onclick' => "javascript: if(this.checked){document.getElementById('repeat-date-attendance').style.display='block';}else{document.getElementById('repeat-date-attendance').style.display='none';}")); $defaults['repeat'] = isset($repeat) ? $repeat : null; if ($defaults['repeat']) { $form->addElement('html', '<div id="repeat-date-attendance" style="display:block">'); } else { $form->addElement('html', '<div id="repeat-date-attendance" style="display:none">'); } $a_repeat_type = array('daily' => get_lang('RepeatDaily'), 'weekly' => get_lang('RepeatWeekly'), 'monthlyByDate' => get_lang('RepeatMonthlyByDate')); $form->addElement('select', 'repeat_type', get_lang('RepeatType'), $a_repeat_type); $form->addElement('date_picker', 'end_date_time', get_lang('RepeatEnd'), array('form_name' => 'attendance_calendar_add')); $defaults['end_date_time'] = date('Y-m-d'); $form->addElement('html', '</div>'); $defaults['repeat_type'] = 'weekly'; $form->addSelect('groups', get_lang('Group'), $groupIdList); $form->addButtonCreate(get_lang('Save'));
/** * Adds x months to a UNIX timestamp * @param int The timestamp * @param int The number of years to add * @return int The new timestamp */ private function add_month($timestamp, $num = 1) { $values = api_get_utc_datetime($timestamp); $values = str_replace(array(':', '-', ' '), '/', $values); list($y, $m, $d, $h, $n, $s) = split('/', $values); if ($m + $num > 12) { $y += floor($num / 12); $m += $num % 12; } else { $m += $num; } //date_default_timezone_set('UTC'); // return mktime($h, $n, $s, $m, $d, $y); $result = api_strtotime($y . '-' . $m . '-' . $d . ' ' . $h . ':' . $n . ':' . $s, 'UTC'); if (!empty($result)) { return $result; } return false; }
/** * Gets all the course meetings saved in the plugin_bbb_meeting table * @return array Array of current open meeting rooms */ public function getCourseMeetings() { $pass = $this->getUserMeetingPassword(); $meetingList = Database::select('*', $this->table, array('where' => array('c_id = ? AND session_id = ? ' => array(api_get_course_int_id(), api_get_session_id())))); $newMeetingList = array(); $item = array(); foreach ($meetingList as $meetingDB) { $meetingBBB = $this->getMeetingInfo(array('meetingId' => $meetingDB['remote_id'], 'password' => $pass)); if ($meetingBBB === false) { //checking with the remote_id didn't work, so just in case and // to provide backwards support, check with the id $params = array('meetingId' => $meetingDB['id'], 'password' => $pass); $meetingBBB = $this->getMeetingInfo($params); } if ($meetingDB['visibility'] == 0 and $this->isTeacher() == false) { continue; } $meetingBBB['end_url'] = api_get_self() . '?' . api_get_cidreq() . '&action=end&id=' . $meetingDB['id']; if ((string) $meetingBBB['returncode'] == 'FAILED') { if ($meetingDB['status'] == 1 && $this->isTeacher()) { $this->endMeeting($meetingDB['id']); } } else { $meetingBBB['add_to_calendar_url'] = api_get_self() . '?' . api_get_cidreq() . '&action=add_to_calendar&id=' . $meetingDB['id'] . '&start=' . api_strtotime($meetingDB['created_at']); } $recordArray = array(); $actionLinksArray = array(); if ($meetingDB['record'] == 1) { // backwards compatibility (when there was no remote ID) $mId = $meetingDB['remote_id']; if (empty($mId)) { $mId = $meetingDB['id']; } if (empty($mId)) { // if the id is still empty (should *never* occur as 'id' is // the table's primary key), skip this conference continue; } $recordingParams = array('meetingId' => $mId); //To see the recording list in your BBB server do: bbb-record --list $records = $this->api->getRecordingsWithXmlResponseArray($recordingParams); if (!empty($records)) { $count = 1; if (isset($records['message']) && !empty($records['message'])) { if ($records['messageKey'] == 'noRecordings') { $recordArray[] = get_lang('NoRecording'); if ($meetingDB['visibility'] == 0) { $actionLinksArray[] = Display::url(Display::return_icon('invisible.png', get_lang('MakeVisible'), array(), ICON_SIZE_MEDIUM), api_get_self() . '?' . api_get_cidreq() . '&action=publish&id=' . $meetingDB['id']); } else { $actionLinksArray[] = Display::url(Display::return_icon('visible.png', get_lang('MakeInvisible'), array(), ICON_SIZE_MEDIUM), api_get_self() . '?' . api_get_cidreq() . '&action=unpublish&id=' . $meetingDB['id']); } } else { //$recordArray[] = $records['message']; } } else { foreach ($records as $record) { //if you get several recordings here and you used a // previous version of Chamilo, you might want to // only keep the last result for each chamilo conf // (see show_links after the end of this loop) if (is_array($record) && isset($record['recordId'])) { $url = Display::url(get_lang('ViewRecord') . " [~" . $record['playbackFormatLength'] . "']", $record['playbackFormatUrl'], array('target' => '_blank')); $actionLinks = ''; if ($this->isTeacher()) { $actionLinks .= Display::url(Display::return_icon('link.gif', get_lang('CopyToLinkTool')), api_get_self() . '?' . api_get_cidreq() . '&action=copy_record_to_link_tool&id=' . $meetingDB['id']); $actionLinks .= Display::url(Display::return_icon('agenda.png', get_lang('AddToCalendar')), api_get_self() . '?' . api_get_cidreq() . '&action=add_to_calendar&id=' . $meetingDB['id'] . '&start=' . api_strtotime($meetingDB['created_at']) . '&url=' . $record['playbackFormatUrl']); $actionLinks .= Display::url(Display::return_icon('delete.png', get_lang('Delete')), api_get_self() . '?' . api_get_cidreq() . '&action=delete_record&id=' . $meetingDB['id']); if ($meetingDB['visibility'] == 0) { $actionLinks .= Display::url(Display::return_icon('invisible.png', get_lang('MakeVisible'), array(), ICON_SIZE_MEDIUM), api_get_self() . '?' . api_get_cidreq() . '&action=publish&id=' . $meetingDB['id']); } else { $actionLinks .= Display::url(Display::return_icon('visible.png', get_lang('MakeInvisible'), array(), ICON_SIZE_MEDIUM), api_get_self() . '?' . api_get_cidreq() . '&action=unpublish&id=' . $meetingDB['id']); } } //$url .= api_get_self().'?action=publish&id='.$record['recordID']; $count++; $recordArray[] = $url; $actionLinksArray[] = $actionLinks; } else { /*if (is_array($record) && isset($record['recordID']) && isset($record['playbacks'])) { //Fix the bbb timestamp //$record['startTime'] = substr($record['startTime'], 0, strlen($record['startTime']) -3); //$record['endTime'] = substr($record['endTime'], 0, strlen($record['endTime']) -3); //.' - '.api_convert_and_format_date($record['startTime']).' - '.api_convert_and_format_date($record['endTime']) foreach($record['playbacks'] as $item) { $url = Display::url(get_lang('ViewRecord'), $item['url'], array('target' => '_blank')); //$url .= Display::url(get_lang('DeleteRecord'), api_get_self().'?action=delete_record&'.$record['recordID']); if ($this->isTeacher()) { $url .= Display::url(Display::return_icon('link.gif',get_lang('CopyToLinkTool')), api_get_self().'?action=copy_record_to_link_tool&id='.$meetingDB['id'].'&record_id='.$record['recordID']); $url .= Display::url(Display::return_icon('agenda.png',get_lang('AddToCalendar')), api_get_self().'?action=add_to_calendar&id='.$meetingDB['id'].'&start='.api_strtotime($meetingDB['created_at']).'&url='.$item['url']); $url .= Display::url(Display::return_icon('delete.png',get_lang('Delete')), api_get_self().'?action=delete_record&id='.$record['recordID']); } //$url .= api_get_self().'?action=publish&id='.$record['recordID']; $count++; $recordArray[] = $url; } }*/ } } } } else { $actionLinks = ''; if ($this->isTeacher()) { if ($meetingDB['visibility'] == 0) { $actionLinks .= Display::url(Display::return_icon('invisible.png', get_lang('MakeVisible'), array(), ICON_SIZE_MEDIUM), api_get_self() . '?' . api_get_cidreq() . '&action=publish&id=' . $meetingDB['id']); } else { $actionLinks .= Display::url(Display::return_icon('visible.png', get_lang('MakeInvisible'), array(), ICON_SIZE_MEDIUM), api_get_self() . '?' . api_get_cidreq() . '&action=unpublish&id=' . $meetingDB['id']); } } $actionLinksArray[] = $actionLinks; $item['action_links'] = implode('<br />', $actionLinksArray); } //var_dump($recordArray); $item['show_links'] = implode('<br />', $recordArray); $item['action_links'] = implode('<br />', $actionLinksArray); } $item['created_at'] = api_convert_and_format_date($meetingDB['created_at']); //created_at $meetingDB['created_at'] = $item['created_at']; //avoid overwrite in array_merge() below $item['publish_url'] = api_get_self() . '?' . api_get_cidreq() . '&action=publish&id=' . $meetingDB['id']; $item['unpublish_url'] = api_get_self() . '?' . api_get_cidreq() . '&action=unpublish&id=' . $meetingDB['id']; if ($meetingDB['status'] == 1) { $joinParams = array('meetingId' => $meetingDB['remote_id'], 'username' => $this->user_complete_name, 'password' => $pass, 'createTime' => '', 'userID' => '', 'webVoiceConf' => ''); $item['go_url'] = $this->protocol . $this->api->getJoinMeetingURL($joinParams); } $item = array_merge($item, $meetingDB, $meetingBBB); $newMeetingList[] = $item; } return $newMeetingList; }
/** * Adds a repetitive item to the database * @param array Course info * @param int The original event's id * @param string Type of repetition * @param int Timestamp of end of repetition (repeating until that date) * @param array $userList * @param string a comment about a attachment file into agenda * @return boolean False if error, True otherwise */ private function addRepeatItem($course_info, $orig_id, $type, $end, $userList, $file_comment = '') { $t_agenda = Database::get_course_table(TABLE_AGENDA); $t_agenda_r = Database::get_course_table(TABLE_AGENDA_REPEAT); $course_id = $course_info['real_id']; $sql = 'SELECT title, content, start_date as sd, end_date as ed FROM ' . $t_agenda . ' WHERE c_id = ' . $course_id . ' AND id ="' . intval($orig_id) . '" '; $res = Database::query($sql); if (Database::num_rows($res) !== 1) { return false; } $row = Database::fetch_array($res); $orig_start = api_strtotime(api_get_local_time($row['sd'])); $orig_end = api_strtotime(api_get_local_time($row['ed'])); $diff = $orig_end - $orig_start; $orig_title = $row['title']; $orig_content = $row['content']; $now = time(); $type = Database::escape_string($type); $end = intval($end); if (1 <= $end && $end <= 500) { //we assume that, with this type of value, the user actually gives a count of repetitions //and that he wants us to calculate the end date with that (particularly in case of imports from ical) switch ($type) { case 'daily': $end = $orig_start + 86400 * $end; break; case 'weekly': $end = $this->addWeek($orig_start, $end); break; case 'monthlyByDate': $end = $this->addMonth($orig_start, $end); break; case 'monthlyByDay': //TODO break; case 'monthlyByDayR': //TODO break; case 'yearly': $end = $this->addYear($orig_start, $end); break; } } if ($end > $now && in_array($type, array('daily', 'weekly', 'monthlyByDate', 'monthlyByDay', 'monthlyByDayR', 'yearly'))) { $sql = "INSERT INTO {$t_agenda_r} (c_id, cal_id, cal_type, cal_end)\n VALUES ({$course_id}, '{$orig_id}', '{$type}', {$end})"; Database::query($sql); switch ($type) { case 'daily': for ($i = $orig_start + 86400; $i <= $end; $i += 86400) { $this->add_event(date('Y-m-d H:i:s', $i), date('Y-m-d H:i:s', $i + $diff), false, null, $orig_title, $orig_content, $userList, false, $orig_id); } break; case 'weekly': for ($i = $orig_start + 604800; $i <= $end; $i += 604800) { $this->add_event(date('Y-m-d H:i:s', $i), date('Y-m-d H:i:s', $i + $diff), false, null, $orig_title, $orig_content, $userList, false, $orig_id); //$res = agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $i), date('Y-m-d H:i:s', $i + $diff), $userList, $orig_id, $file_comment); } break; case 'monthlyByDate': $next_start = $this->addMonth($orig_start); while ($next_start <= $end) { $this->add_event(date('Y-m-d H:i:s', $next_start), date('Y-m-d H:i:s', $next_start + $diff), false, null, $orig_title, $orig_content, $userList, false, $orig_id); //$res = agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $next_start), date('Y-m-d H:i:s', $next_start + $diff), $userList, $orig_id, $file_comment); $next_start = $this->addMonth($next_start); } break; case 'monthlyByDay': //not yet implemented break; case 'monthlyByDayR': //not yet implemented break; case 'yearly': $next_start = $this->addYear($orig_start); while ($next_start <= $end) { $this->add_event(date('Y-m-d H:i:s', $next_start), date('Y-m-d H:i:s', $next_start + $diff), false, null, $orig_title, $orig_content, $userList, false, $orig_id); //agenda_add_item($course_info, $orig_title, $orig_content, date('Y-m-d H:i:s', $next_start), date('Y-m-d H:i:s', $next_start + $diff), $userList, $orig_id, $file_comment); $next_start = $this->addYear($next_start); } break; } } return true; }
} } if (!$objExercise) { //Redirect to the exercise overview //Check if the exe_id exists header("Location: overview.php?exerciseId=" . $exerciseId); exit; } $time_control = false; $clock_expired_time = ExerciseLib::get_session_time_control_key($objExercise->id, $learnpath_id, $learnpath_item_id); if ($objExercise->expired_time != 0 && !empty($clock_expired_time)) { $time_control = true; } if ($time_control) { // Get time left for exipiring time $time_left = api_strtotime($clock_expired_time, 'UTC') - time(); $htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH) . 'javascript/epiclock/stylesheet/jquery.epiclock.css'); $htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH) . 'javascript/epiclock/renderers/minute/epiclock.minute.css'); $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.dateformat.min.js'); $htmlHeadXtra[] = api_get_js('epiclock/javascript/jquery.epiclock.min.js'); $htmlHeadXtra[] = api_get_js('epiclock/renderers/minute/epiclock.minute.js'); $htmlHeadXtra[] = $objExercise->show_time_control_js($time_left); } $exe_id = intval(Session::read('exe_id')); $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id); if (!empty($exercise_stat_info['data_tracking'])) { $question_list = explode(',', $exercise_stat_info['data_tracking']); } if (empty($exercise_stat_info) || empty($question_list)) { api_not_allowed(); }
/** * @param array $session_info * @param string $course_code * @param bool $ignore_visibility_for_admins * @param bool $check_coach_dates * @return bool */ function api_get_session_date_validation($session_info, $course_code, $ignore_visibility_for_admins = true, $check_coach_dates = true) { if (api_is_platform_admin()) { if ($ignore_visibility_for_admins) { return true; } } $session_id = $session_info['id']; $now = time(); $access = false; if ($session_info) { // I don't care the field visibility because there are not limit dates. if (empty($session_info['access_start_date']) && empty($session_info['access_end_date']) || $session_info['access_start_date'] == '0000-00-00 00:00:00' && $session_info['access_end_date'] == '0000-00-00 00:00:00') { return true; } else { $accessStart = true; // If access_start_date is set if (!empty($session_info['access_start_date']) && $session_info['access_start_date'] != '0000-00-00 00:00:00') { if ($now > api_strtotime($session_info['access_start_date'], 'UTC')) { $access = true; } else { $access = false; $accessStart = false; } } if ($accessStart == true) { //if access_end_date is set if (!empty($session_info['access_end_date']) && $session_info['access_end_date'] != '0000-00-00 00:00:00') { //only if access_end_date said that it was ok if ($now <= api_strtotime($session_info['access_end_date'], 'UTC')) { //date still available $access = true; } else { //session ends $access = false; } } } } if ($check_coach_dates) { //2. If I'm a coach $is_coach = api_is_coach($session_id, $course_code); if ($is_coach) { if (isset($session_info['access_end_date']) && !empty($session_info['access_end_date']) && $session_info['access_end_date'] != '0000-00-00 00:00:00' && isset($session_info['coach_access_end_date']) && !empty($session_info['coach_access_end_date']) && $session_info['coach_access_end_date'] != '0000-00-00 00:00:00') { $end_date_extra_for_coach = api_strtotime($session_info['coach_access_end_date'], 'UTC'); if ($now <= $end_date_extra_for_coach) { $access = true; } else { $access = false; } } //Test start date if (isset($session_info['access_start_date']) && !empty($session_info['access_start_date']) && $session_info['access_start_date'] != '0000-00-00 00:00:00' && isset($session_info['coach_start_date']) && !empty($session_info['coach_start_date']) && $session_info['coach_start_date'] != '0000-00-00 00:00:00') { $start_date_for_coach = api_strtotime($session_info['coach_start_date'], 'UTC'); if ($now > $start_date_for_coach) { $access = true; } else { $access = false; } } } } return $access; } }
/** * It's used for controlling attendance calendar (list, add, edit, delete), * render to attendance_calendar view * @param string $action (optional, by default 'calendar_list') * @param int $attendance_id (optional) * @param int $calendar_id (optional) */ public function attendance_calendar($action = 'calendar_list', $attendance_id = 0, $calendar_id = 0) { $attendance = new Attendance(); $calendar_id = intval($calendar_id); $data = array(); $data['attendance_id'] = $attendance_id; $attendance_id = intval($attendance_id); $groupList = isset($_POST['groups']) ? array($_POST['groups']) : array(); if ($action == 'calendar_add') { if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") { if (!isset($_POST['cancel'])) { if (isset($_POST['repeat'])) { //@todo check this error_logs $start_datetime = api_strtotime(api_get_utc_datetime($_POST['date_time']), 'UTC'); $end_datetime = api_strtotime(api_get_utc_datetime($_POST['end_date_time'] . ' 23:59:59'), 'UTC'); $checkdate = api_is_valid_date(api_get_utc_datetime($_POST['end_date_time'] . ' 23:59:59')); $repeat_type = $_POST['repeat_type']; if ($end_datetime > $start_datetime && $checkdate) { $attendance->attendance_repeat_calendar_add($attendance_id, $start_datetime, $end_datetime, $repeat_type, $groupList); $action = 'calendar_list'; } else { if (!$checkdate) { $data['error_checkdate'] = true; } else { $data['error_repeat_date'] = true; } $data['repeat'] = true; $action = 'calendar_add'; } } else { $datetime = $_POST['date_time']; $datetimezone = api_get_utc_datetime($datetime); if (!empty($datetime)) { $attendance->set_date_time($datetimezone); $attendance->attendance_calendar_add($attendance_id, $groupList); $action = 'calendar_list'; } else { $data['error_date'] = true; $action = 'calendar_add'; } } } else { $action = 'calendar_list'; } } } else { if ($action == 'calendar_edit') { $data['calendar_id'] = $calendar_id; if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") { if (!isset($_POST['cancel'])) { $datetime = $_POST['date_time']; $datetimezone = api_get_utc_datetime($datetime); $attendance->set_date_time($datetimezone); $attendance->attendance_calendar_edit($calendar_id, $attendance_id); $data['calendar_id'] = 0; $action = 'calendar_list'; } else { $action = 'calendar_list'; } } } else { if ($action == 'calendar_delete') { $attendance->attendance_calendar_delete($calendar_id, $attendance_id); $action = 'calendar_list'; } else { if ($action == 'calendar_all_delete') { $attendance->attendance_calendar_delete(0, $attendance_id, true); $action = 'calendar_list'; } } } } $data['action'] = $action; $data['attendance_calendar'] = $attendance->get_attendance_calendar($attendance_id, 'all', null, null, true); $data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id); // render to the view $this->view->set_data($data); $this->view->set_layout('layout'); $this->view->set_template('attendance_calendar'); $this->view->render(); }
/** * Returns the number of days the student has left in a session when using * sessions durations * @param int $userId * @param int $sessionId * @param int $duration in days * @return int */ public static function getDayLeftInSession($sessionId, $userId, $duration) { // Get an array with the details of the first access of the student to // this session $courseAccess = CourseManager::getFirstCourseAccessPerSessionAndUser($sessionId, $userId); $currentTime = time(); // If no previous access, return false if (count($courseAccess) == 0) { return false; } $firstAccess = api_strtotime($courseAccess['login_course_date'], 'UTC'); $endDateInSeconds = $firstAccess + $duration * 24 * 60 * 60; $leftDays = round(($endDateInSeconds - $currentTime) / 60 / 60 / 24); return $leftDays; }
/** * Prints the session and course list (user_portal.php) * @param int $user_id * @return string */ public function return_courses_and_sessions($user_id) { global $_configuration; $load_history = (isset($_GET['history']) && intval($_GET['history']) == 1) ? true : false; if ($load_history) { // Load sessions in category in *history* $session_categories = UserManager::get_sessions_by_category( $user_id, true ); } else { // Load sessions in category $session_categories = UserManager::get_sessions_by_category( $user_id, false ); } $html = ''; // Showing history title if ($load_history) { $html .= Display::page_subheader(get_lang('HistoryTrainingSession')); if (empty($session_categories)) { $html .= get_lang('YouDoNotHaveAnySessionInItsHistory'); } } $courses_html = ''; $special_courses = ''; // If we're not in the history view... if (!isset($_GET['history'])) { // Display special courses. $special_courses = CourseManager::display_special_courses($user_id, $this->load_directories_preview); // Display courses. $courses_html .= CourseManager::display_courses($user_id, $this->load_directories_preview); } $sessions_with_category = ''; $sessions_with_no_category = ''; if (is_array($session_categories)) { foreach ($session_categories as $session_category) { $session_category_id = $session_category['session_category']['id']; // Sessions and courses that are not in a session category if ($session_category_id == 0 && isset($session_category['sessions']) ) { // Independent sessions foreach ($session_category['sessions'] as $session) { $session_id = $session['session_id']; // Don't show empty sessions. if (count($session['courses']) < 1) { continue; } // Courses inside the current session. $date_session_start = $session['date_start']; $date_session_end = $session['date_end']; $days_access_before_beginning = $session['nb_days_access_before_beginning']; $days_access_after_end = $session['nb_days_access_after_end']; $session_now = time(); $count_courses_session = 0; // Loop course content $html_courses_session = ''; $atLeastOneCourseIsVisible = false; foreach ($session['courses'] as $course) { $is_coach_course = api_is_coach($session_id, $course['code']); $allowed_time = 0; $dif_time_after = 0; if ($date_session_start != '0000-00-00') { if ($is_coach_course) { $allowed_time = api_strtotime($date_session_start.' 00:00:00') - ($days_access_before_beginning * 86400); } else { $allowed_time = api_strtotime($date_session_start.' 00:00:00'); } if (!isset($_GET['history'])) { if ($date_session_end != '0000-00-00') { $endSessionToTms = api_strtotime($date_session_end.' 23:59:59'); if ($session_now > $endSessionToTms) { $dif_time_after = $session_now - $endSessionToTms; $dif_time_after = round($dif_time_after/86400); } } } } if ($session_now > $allowed_time && $days_access_after_end > $dif_time_after - 1 ) { // Read only and accessible. $atLeastOneCourseIsVisible = true; if (api_get_setting('hide_courses_in_sessions') == 'false') { $c = CourseManager::get_logged_user_course_html( $course, $session_id, 'session_course_item', true, $this->load_directories_preview ); $html_courses_session .= isset($c[1]) ? $c[1] : null; } $count_courses_session++; } } // No courses to show. if ($atLeastOneCourseIsVisible == false) { if (empty($html_courses_session)) { continue; } } if ($count_courses_session > 0) { $params = array(); $session_box = Display::get_session_title_box($session_id); $params['icon'] = Display::return_icon( 'window_list.png', $session_box['title'], array('id' => 'session_img_' . $session_id), ICON_SIZE_LARGE ); $extra_info = !empty($session_box['coach']) ? $session_box['coach'] : null; $extra_info .= !empty($session_box['coach']) ? ' - '.$session_box['dates'] : $session_box['dates']; $extra_info .= isset($session_box['duration']) ? ' '.$session_box['duration'] : null; if (api_is_drh()) { $session_link = $session_box['title']; $params['link'] = null; } else { $session_link = Display::tag( 'a', $session_box['title'], array( 'href' => api_get_path( WEB_CODE_PATH ) . 'session/index.php?session_id=' . $session_id ) ); $params['link'] = api_get_path(WEB_CODE_PATH).'session/index.php?session_id='.$session_id; } $params['title'] = $session_link; $params['subtitle'] = $extra_info; $params['right_actions'] = ''; if (api_is_platform_admin()) { $params['right_actions'] .= '<a href="'.api_get_path(WEB_CODE_PATH).'admin/resume_session.php?id_session='.$session_id.'">'; $params['right_actions'] .= Display::return_icon('edit.png', get_lang('Edit'), array('align' => 'absmiddle'), ICON_SIZE_SMALL).'</a>'; } if (api_get_setting('hide_courses_in_sessions') == 'false') { // $params['extra'] .= $html_courses_session; } $params['description'] = isset($session_box['description']) ? $session_box['description'] : null; $parentInfo = CourseManager::course_item_html($params, true); if (isset($_configuration['show_simple_session_info']) && $_configuration['show_simple_session_info'] ) { $params['title'] = $session_box['title']; $parentInfo = CourseManager::course_item_html_no_icon($params); } $sessions_with_no_category .= CourseManager::course_item_parent( $parentInfo, $html_courses_session ); } } } else { // All sessions included in $count_courses_session = 0; $html_sessions = ''; if (isset($session_category['sessions'])) { foreach ($session_category['sessions'] as $session) { $session_id = $session['session_id']; // Don't show empty sessions. if (count($session['courses']) < 1) { continue; } $date_session_start = $session['date_start']; $date_session_end = $session['date_end']; $days_access_before_beginning = $session['nb_days_access_before_beginning']; $days_access_after_end = $session['nb_days_access_after_end']; $session_now = time(); $html_courses_session = ''; $count = 0; foreach ($session['courses'] as $course) { $is_coach_course = api_is_coach( $session_id, $course['code'] ); $dif_time_after = 0; $allowed_time = 0; if ($is_coach_course) { // 24 hours = 86400 if ($date_session_start != '0000-00-00') { $allowed_time = api_strtotime($date_session_start . ' 00:00:00') - ($days_access_before_beginning * 86400); } if (!isset($_GET['history'])) { if ($date_session_end != '0000-00-00') { $endSessionToTms = api_strtotime( $date_session_end . ' 23:59:59' ); if ($session_now > $endSessionToTms) { $dif_time_after = $session_now - $endSessionToTms; $dif_time_after = round( $dif_time_after / 86400 ); } } } } else { $allowed_time = api_strtotime( $date_session_start . ' 00:00:00' ); } if ($session_now > $allowed_time && $days_access_after_end > $dif_time_after - 1 ) { if (api_get_setting('hide_courses_in_sessions') == 'false') { $c = CourseManager:: get_logged_user_course_html( $course, $session_id, 'session_course_item' ); $html_courses_session .= $c[1]; } $count_courses_session++; $count++; } } $params = array(); if ($count > 0) { $session_box = Display:: get_session_title_box( $session_id ); $params['icon'] = Display::return_icon( 'window_list.png', $session_box['title'], array( 'width' => '48px', 'align' => 'absmiddle', 'id' => 'session_img_' . $session_id ) ) . ' '; if (api_is_drh()) { $session_link = $session_box['title']; $params['link'] = null; } else { $session_link = Display::tag( 'a', $session_box['title'], array( 'href' => api_get_path(WEB_CODE_PATH) . 'session/index.php?session_id=' . $session_id ) ); $params['link'] = api_get_path(WEB_CODE_PATH) . 'session/index.php?session_id=' . $session_id; } $params['title'] = $session_link; $params['subtitle'] = (!empty($session_box['coach']) ? $session_box['coach'] . ' | ' : '') . $session_box['dates']; if (api_is_platform_admin()) { $params['right_actions'] = '<a href="' . api_get_path(WEB_CODE_PATH) . 'admin/resume_session.php?id_session=' . $session_id . '">' . Display::return_icon( 'edit.png', get_lang('Edit'), array('align' => 'absmiddle'), ICON_SIZE_SMALL ) . '</a>'; } $parentInfo = CourseManager::course_item_html( $params, true ); if (isset($_configuration['show_simple_session_info']) && $_configuration['show_simple_session_info']) { $params['title'] = $session_box['title']; $parentInfo = CourseManager::course_item_html_no_icon( $params ); } $html_sessions .= $parentInfo . $html_courses_session; } } } if ($count_courses_session > 0) { $params = array(); $params['icon'] = Display::return_icon('folder_blue.png', $session_category['session_category']['name'], array(), ICON_SIZE_LARGE); if (api_is_platform_admin()) { $params['right_actions'] = '<a href="'.api_get_path(WEB_CODE_PATH).'admin/session_category_edit.php?&id='.$session_category['session_category']['id'].'">'.Display::return_icon('edit.png', get_lang('Edit'), array(), ICON_SIZE_SMALL).'</a>'; } $params['title'] = $session_category['session_category']['name']; if (api_is_platform_admin()) { $params['link'] = api_get_path(WEB_CODE_PATH).'admin/session_category_edit.php?&id='.$session_category['session_category']['id']; } $session_category_start_date = $session_category['session_category']['date_start']; $session_category_end_date = $session_category['session_category']['date_end']; if (!empty($session_category_start_date) && $session_category_start_date != '0000-00-00' && !empty($session_category_end_date) && $session_category_end_date != '0000-00-00' ) { $params['subtitle'] = sprintf(get_lang('FromDateXToDateY'), $session_category['session_category']['date_start'], $session_category['session_category']['date_end']); } else { if (!empty($session_category_start_date) && $session_category_start_date != '0000-00-00') { $params['subtitle'] = get_lang('From').' '.$session_category_start_date; } if (!empty($session_category_end_date) && $session_category_end_date != '0000-00-00') { $params['subtitle'] = get_lang('Until').' '.$session_category_end_date; } } $sessions_with_category .= CourseManager::course_item_parent( CourseManager::course_item_html($params, true), $html_sessions ); } } } } return $sessions_with_category. $sessions_with_no_category. $courses_html.$special_courses; }
/** * Get tickets by userId * @param $from * @param $number_of_items * @param $column * @param $direction * @param null $user_id * @return array */ public static function get_tickets_by_user_id( $from, $number_of_items, $column, $direction, $user_id = null ) { global $plugin; $table_support_category = Database::get_main_table( TABLE_TICKET_CATEGORY ); $table_support_tickets = Database::get_main_table(TABLE_TICKET_TICKET); $table_support_priority = Database::get_main_table( TABLE_TICKET_PRIORITY ); $table_support_status = Database::get_main_table(TABLE_TICKET_STATUS); $table_support_messages = Database::get_main_table( TABLE_TICKET_MESSAGE ); $table_main_user = Database::get_main_table(TABLE_MAIN_USER); $table_main_admin = Database::get_main_table(TABLE_MAIN_ADMIN); if (is_null($direction)) { $direction = "DESC"; } if (is_null($user_id) || $user_id == 0) { $user_id = api_get_user_id(); } $isAdmin = UserManager::is_admin($user_id); $sql = "SELECT ticket.*, ticket.ticket_id AS col0, ticket.start_date AS col1, ticket.sys_lastedit_datetime AS col2, cat.name AS col3, user.username AS col4, priority.priority AS col5, priority.priority AS col6, status.name AS col7, ticket.total_messages AS col8, msg.message AS col9, ticket.request_user AS user_id, ticket.assigned_last_user AS responsible FROM $table_support_tickets ticket, $table_support_category cat, $table_support_priority priority, $table_support_status status, $table_main_user user, $table_support_messages msg WHERE cat.category_id = ticket.category_id AND ticket.priority_id = priority.priority_id AND ticket.status_id = status.status_id AND user.user_id = ticket.request_user AND ticket.ticket_id= msg.ticket_id AND message_id=1 "; if (!$isAdmin) { $sql .= " AND request_user = '******' "; } $keyword_unread = Database::escape_string( trim($_GET['keyword_unread']) ); //Search simple if (isset($_GET['submit_simple'])) { if ($_GET['keyword'] != '') { $keyword = Database::escape_string(trim($_GET['keyword'])); $sql .= " AND (ticket.ticket_code = '$keyword' OR ticket.ticket_id = '$keyword' OR user.firstname LIKE '%$keyword%' OR user.lastname LIKE '%$keyword%' OR concat(user.firstname,' ',user.lastname) LIKE '%$keyword%' OR concat(user.lastname,' ',user.firstname) LIKE '%$keyword%' OR user.username LIKE '%$keyword%')"; } } //Search advanced if (isset($_GET['submit_advanced'])) { $keyword_category = Database::escape_string( trim($_GET['keyword_category']) ); $keyword_request_user = Database::escape_string( trim($_GET['keyword_request_user']) ); $keyword_admin = Database::escape_string( trim($_GET['keyword_admin']) ); $keyword_start_date_start = Database::escape_string( trim($_GET['keyword_start_date_start']) ); $keyword_start_date_end = Database::escape_string( trim($_GET['keyword_start_date_end']) ); $keyword_status = Database::escape_string( trim($_GET['keyword_status']) ); $keyword_source = Database::escape_string( trim($_GET['keyword_source']) ); $keyword_priority = Database::escape_string( trim($_GET['keyword_priority']) ); $keyword_range = Database::escape_string( trim($_GET['keyword_dates']) ); $keyword_course = Database::escape_string( trim($_GET['keyword_course']) ); if ($keyword_category != '') { $sql .= " AND ticket.category_id = '$keyword_category' "; } if ($keyword_request_user != '') { $sql .= " AND (ticket.request_user = '******' OR user.firstname LIKE '%$keyword_request_user%' OR user.official_code LIKE '%$keyword_request_user%' OR user.lastname LIKE '%$keyword_request_user%' OR concat(user.firstname,' ',user.lastname) LIKE '%$keyword_request_user%' OR concat(user.lastname,' ',user.firstname) LIKE '%$keyword_request_user%' OR user.username LIKE '%$keyword_request_user%') "; } if ($keyword_admin != '') { $sql .= " AND ticket.assigned_last_user = '******' "; } if ($keyword_status != '') { $sql .= " AND ticket.status_id = '$keyword_status' "; } if ($keyword_range == '' && $keyword_start_date_start != '') { $sql .= " AND DATE_FORMAT( ticket.start_date,'%d/%m/%Y') = '$keyword_start_date_start' "; } if ($keyword_range == '1' && $keyword_start_date_start != '' && $keyword_start_date_end != '') { $sql .= " AND DATE_FORMAT( ticket.start_date,'%d/%m/%Y') >= '$keyword_start_date_start' AND DATE_FORMAT( ticket.start_date,'%d/%m/%Y') <= '$keyword_start_date_end'"; } if ($keyword_priority != '') { $sql .= " AND ticket.priority_id = '$keyword_priority' "; } if ($keyword_source != '') { $sql .= " AND ticket.source = '$keyword_source' "; } if ($keyword_priority != '') { $sql .= " AND ticket.priority_id = '$keyword_priority' "; } if ($keyword_course != '') { $course_table = Database :: get_main_table(TABLE_MAIN_COURSE); $sql .= " AND ticket.course_id IN ( "; $sql .= "SELECT id FROM $course_table WHERE (title LIKE '%$keyword_course%' OR code LIKE '%$keyword_course%' OR visual_code LIKE '%$keyword_course%' ) )"; } } if ($keyword_unread == 'yes') { $sql .= " AND ticket.ticket_id IN (SELECT ticket.ticket_id FROM $table_support_tickets ticket, $table_support_messages message, $table_main_user user WHERE ticket.ticket_id = message.ticket_id AND message.status = 'NOL' AND message.sys_insert_user_id = user.user_id AND user.user_id NOT IN (SELECT user_id FROM $table_main_admin) AND ticket.status_id != 'REE' GROUP BY ticket.ticket_id)"; } else { if ($keyword_unread == 'no') { $sql .= " AND ticket.ticket_id NOT IN (SELECT ticket.ticket_id FROM $table_support_tickets ticket, $table_support_messages message, $table_main_user user WHERE ticket.ticket_id = message.ticket_id AND message.status = 'NOL' AND message.sys_insert_user_id = user.user_id AND user.user_id NOT IN ( SELECT user_id FROM $table_main_admin ) AND ticket.status_id != 'REE' GROUP BY ticket.ticket_id)"; } } $sql .= " ORDER BY col$column $direction"; $sql .= " LIMIT $from,$number_of_items"; $result = Database::query($sql); $tickets = array(); $webPath = api_get_path(WEB_PATH); $webCodePath = api_get_path(WEB_CODE_PATH); while ($row = Database::fetch_assoc($result)) { $sql_unread = "SELECT COUNT(DISTINCT message.message_id) AS unread FROM $table_support_tickets ticket, $table_support_messages message, $table_main_user user WHERE ticket.ticket_id = message.ticket_id AND ticket.ticket_id = '{$row['col0']}' AND message.status = 'NOL' AND message.sys_insert_user_id = user.user_id "; if ($isAdmin) { $sql_unread .= " AND user.user_id NOT IN (SELECT user_id FROM $table_main_admin) AND ticket.status_id != 'REE' "; } else { $sql_unread .= " AND user.user_id IN (SELECT user_id FROM $table_main_admin) "; } $result_unread = Database::query($sql_unread); $unread = Database::fetch_object($result_unread)->unread; $userInfo = UserManager::get_user_info_by_id($row['user_id']); $hrefUser = $webPath . 'main/admin/user_information.php?user_id=' . $row['user_id']; $name = "<a href='$hrefUser'> {$userInfo['username']} </a>"; $actions = ""; if ($row['responsible'] != 0) { $row['responsible'] = api_get_user_info($row['responsible']); if (!empty($row['responsible'])) { $hrefResp = $webPath . 'main/admin/user_information.php?user_id=' . $row['responsible']['user_id']; $row['responsible'] = "<a href='$hrefResp'> {$row['responsible']['username']} </a>"; } else { $row['responsible'] = get_lang('UnknownUser'); } } else { if ($row['status_id'] != 'REE') { $row['responsible'] = '<span style="color:#ff0000;">' . $plugin->get_lang('ToBeAssigned') . '</span>'; } else { $row['responsible'] = '<span style="color:#00ff00;">' . get_lang('MessageResent') . '</span>'; } } switch ($row['source']) { case 'PRE': $img_source = 'icons/32/user.png'; break; case 'MAI': $img_source = 'icons/32/mail.png'; break; case 'TEL': $img_source = 'icons/32/event.png'; break; default: $img_source = 'icons/32/course_home.png'; break; } $row['col1'] = api_get_local_time($row['col1']); $row['col2'] = api_get_local_time($row['col2']); if ($isAdmin) { $actions .= '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . Display::return_icon( 'synthese_view.gif', get_lang('Info') ) . '</a> '; if ($row['priority_id'] == 'HGH' && $row['status_id'] != 'CLS') { $actions .= '<img src="' . $webCodePath . 'img/exclamation.png" border="0" />'; } $row['col0'] = Display::return_icon( $img_source, get_lang('Info') ) . '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . $row['ticket_code'] . '</a>'; if ($row['col7'] == 'PENDIENTE') { $row['col7'] = '<span style="color: #f00; font-weight:bold;">' . $row['col7'] . '</span>'; } $ticket = array( $row['col0'], api_format_date($row['col1'], '%d/%m/%y - %I:%M:%S %p'), api_format_date($row['col2'], '%d/%m/%y - %I:%M:%S %p'), $row['col3'], $name, $row['responsible'], $row['col7'], $row['col8'], $actions, eregi_replace("[\n|\r|\n\r|\r\n]", ' ', strip_tags($row['col9'])) ); } else { $actions = ""; $actions .= '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . Display::return_icon( 'synthese_view.gif', get_lang('Info') ) . '</a> '; $row['col0'] = Display::return_icon( $img_source, get_lang('Info') ) . '<a href="ticket_details.php?ticket_id=' . $row['col0'] . '">' . $row['ticket_code'] . '</a>'; $now = api_strtotime(api_get_utc_datetime()); $last_edit_date = api_strtotime($row['sys_lastedit_datetime']); $dif = $now - $last_edit_date; if ($dif > 172800 && $row['priority_id'] == 'NRM' && $row['status_id'] != 'CLS') { $actions .= '<a href="myticket.php?ticket_id=' . $row['ticket_id'] . '&action=alert"> <img src="' . $webPath . 'main/img/exclamation.png" border="0" /></a>'; } if ($row['priority_id'] == 'HGH') { $actions .= '<img src="' . $webCodePath . 'img/admin_star.png" border="0" />'; } $ticket = array( $row['col0'], api_format_date($row['col1'], '%d/%m/%y - %I:%M:%S %p'), api_format_date($row['col2'], '%d/%m/%y - %I:%M:%S %p'), $row['col3'], $row['col7'], $actions ); } if ($unread > 0) { $ticket['0'] = $ticket['0'] . ' (' . $unread . ')<a href="ticket_details.php?ticket_id=' . $row['ticket_id'] . '"> <img src="' . $webPath . 'main/img/message_new.png" border="0" title="' . $unread . ' ' . get_lang('Messages') . '"/> </a>'; } if ($isAdmin) { $ticket['0'] .= ' <a href="javascript:void(0)" onclick="load_history_ticket(\'div_' . $row['ticket_id'] . '\',' . $row['ticket_id'] . ')"> <img onclick="load_course_list(\'div_' . $row['ticket_id'] . '\',' . $row['ticket_id'] . ')" onmouseover="clear_course_list (\'div_' . $row['ticket_id'] . '\')" src="' . $webPath . 'main/img/history.gif" title="' . get_lang( 'Historial' ) . '" alt="' . get_lang('Historial') . '"/> <div class="blackboard_hide" id="div_' . $row['ticket_id'] . '"> </div> </a> '; } $tickets[] = $ticket; } return $tickets; }
/** * Shows the user progress (when clicking in the Progress tab) * * @param int $user_id * @param int $session_id * @param string $extra_params * @param bool $show_courses * @param bool $showAllSessions * * @return string */ public static function show_user_progress($user_id, $session_id = 0, $extra_params = '', $show_courses = true, $showAllSessions = true) { $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); $tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER); $tbl_access_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE); $tbl_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); $tbl_access_rel_session = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION); $user_id = intval($user_id); $session_id = intval($session_id); if (api_is_multiple_url_enabled()) { $sql = "SELECT c.code, title\n FROM {$tbl_course_user} cu\n INNER JOIN {$tbl_course} c\n ON (cu.c_id = c.id)\n INNER JOIN {$tbl_access_rel_course} a\n ON (a.c_id = c.id)\n WHERE\n cu.user_id = {$user_id} AND\n relation_type<> " . COURSE_RELATION_TYPE_RRHH . " AND\n access_url_id = " . api_get_current_access_url_id() . "\n ORDER BY title"; } else { $sql = "SELECT c.code, title\n FROM {$tbl_course_user} u\n INNER JOIN {$tbl_course} c ON (c_id = c.id)\n WHERE\n u.user_id= {$user_id} AND\n relation_type<>" . COURSE_RELATION_TYPE_RRHH . "\n ORDER BY title"; } $rs = Database::query($sql); $courses = $course_in_session = $temp_course_in_session = array(); while ($row = Database::fetch_array($rs, 'ASSOC')) { $courses[$row['code']] = $row['title']; } $orderBy = " ORDER BY name "; $extraInnerJoin = null; if (SessionManager::orderCourseIsEnabled() && !empty($session_id)) { $orderBy = " ORDER BY s.id, position "; $tableSessionRelCourse = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); $extraInnerJoin = " INNER JOIN {$tableSessionRelCourse} src\n ON (cu.c_id = src.c_id AND src.session_id = {$session_id}) "; } $sessionCondition = ''; if (!empty($session_id)) { $sessionCondition = " AND s.id = {$session_id}"; } // Get the list of sessions where the user is subscribed as student if (api_is_multiple_url_enabled()) { $sql = "SELECT DISTINCT c.code, s.id as session_id, name\n FROM {$tbl_session_course_user} cu\n INNER JOIN {$tbl_access_rel_session} a\n ON (a.session_id = cu.session_id)\n INNER JOIN {$tbl_session} s\n ON (s.id = a.session_id)\n INNER JOIN {$tbl_course} c\n ON (c.id = cu.c_id)\n {$extraInnerJoin}\n WHERE\n cu.user_id = {$user_id} AND\n access_url_id = " . api_get_current_access_url_id() . "\n {$sessionCondition}\n {$orderBy} "; } else { $sql = "SELECT DISTINCT c.code, s.id as session_id, name\n FROM {$tbl_session_course_user} cu\n INNER JOIN {$tbl_session} s\n ON (s.id = cu.session_id)\n INNER JOIN {$tbl_course} c\n ON (c.id = cu.c_id)\n {$extraInnerJoin}\n WHERE\n cu.user_id = {$user_id}\n {$sessionCondition}\n {$orderBy} "; } $rs = Database::query($sql); $simple_session_array = array(); while ($row = Database::fetch_array($rs)) { $course_info = CourseManager::get_course_information($row['code']); $temp_course_in_session[$row['session_id']]['course_list'][$course_info['real_id']] = $course_info; $temp_course_in_session[$row['session_id']]['name'] = $row['name']; $simple_session_array[$row['session_id']] = $row['name']; } foreach ($simple_session_array as $my_session_id => $session_name) { $course_list = $temp_course_in_session[$my_session_id]['course_list']; $my_course_data = array(); foreach ($course_list as $course_data) { $my_course_data[$course_data['id']] = $course_data['title']; } if (empty($session_id)) { $my_course_data = ArrayClass::utf8_sort($my_course_data); } $final_course_data = array(); foreach ($my_course_data as $course_id => $value) { $final_course_data[$course_id] = $course_list[$course_id]; } $course_in_session[$my_session_id]['course_list'] = $final_course_data; $course_in_session[$my_session_id]['name'] = $session_name; } $html = ''; // Course list if ($show_courses) { if (!empty($courses)) { $html .= Display::page_subheader(Display::return_icon('course.png', get_lang('MyCourses'), array(), ICON_SIZE_SMALL) . ' ' . get_lang('MyCourses')); $html .= '<table class="data_table" width="100%">'; $html .= '<tr> ' . Display::tag('th', get_lang('Course'), array('width' => '300px')) . ' ' . Display::tag('th', get_lang('TimeSpentInTheCourse'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('Progress'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('Score') . Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array('align' => 'absmiddle', 'hspace' => '3px')), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('LastConnexion'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('Details'), array('class' => 'head')) . ' </tr>'; foreach ($courses as $course_code => $course_title) { $courseInfo = api_get_course_info($course_code); $courseId = $courseInfo['real_id']; $total_time_login = Tracking::get_time_spent_on_the_course($user_id, $courseId); $time = api_time_to_hms($total_time_login); $progress = Tracking::get_avg_student_progress($user_id, $course_code); $percentage_score = Tracking::get_avg_student_score($user_id, $course_code, array()); $last_connection = Tracking::get_last_connection_date_on_the_course($user_id, $courseInfo); if (is_null($progress)) { $progress = '0%'; } else { $progress = $progress . '%'; } if (isset($_GET['course']) && $course_code == $_GET['course'] && empty($_GET['session_id'])) { $html .= '<tr class="row_odd" style="background-color:#FBF09D">'; } else { $html .= '<tr class="row_even">'; } $url = api_get_course_url($course_code, $session_id); $course_url = Display::url($course_title, $url, array('target' => SESSION_LINK_TARGET)); $html .= '<td>' . $course_url . '</td>'; $html .= '<td align="center">' . $time . '</td>'; $html .= '<td align="center">' . $progress . '</td>'; $html .= '<td align="center">'; if (is_numeric($percentage_score)) { $html .= $percentage_score . '%'; } else { $html .= '0%'; } $html .= '</td>'; $html .= '<td align="center">' . $last_connection . '</td>'; $html .= '<td align="center">'; if (isset($_GET['course']) && $course_code == $_GET['course'] && empty($_GET['session_id'])) { $html .= '<a href="#">'; $html .= Display::return_icon('2rightarrow_na.png', get_lang('Details')); } else { $html .= '<a href="' . api_get_self() . '?course=' . $course_code . $extra_params . '">'; $html .= Display::return_icon('2rightarrow.png', get_lang('Details')); } $html .= '</a>'; $html .= '</td></tr>'; } $html .= '</table>'; } } // Session list if (!empty($course_in_session)) { $main_session_graph = ''; //Load graphics only when calling to an specific session $session_graph = array(); $all_exercise_graph_name_list = array(); $my_results = array(); $all_exercise_graph_list = array(); $all_exercise_start_time = array(); foreach ($course_in_session as $my_session_id => $session_data) { $course_list = $session_data['course_list']; $session_name = $session_data['name']; $user_count = count(SessionManager::get_users_by_session($my_session_id)); $exercise_graph_name_list = array(); //$user_results = array(); $exercise_graph_list = array(); foreach ($course_list as $course_data) { $exercise_list = ExerciseLib::get_all_exercises($course_data, $my_session_id, false, null, false, 1); foreach ($exercise_list as $exercise_data) { $exercise_obj = new Exercise($course_data['id']); $exercise_obj->read($exercise_data['id']); //Exercise is not necessary to be visible to show results check the result_disable configuration instead //$visible_return = $exercise_obj->is_visible(); if ($exercise_data['results_disabled'] == 0 || $exercise_data['results_disabled'] == 2) { $best_average = intval(ExerciseLib::get_best_average_score_by_exercise($exercise_data['id'], $course_data['id'], $my_session_id, $user_count)); $exercise_graph_list[] = $best_average; $all_exercise_graph_list[] = $best_average; $user_result_data = ExerciseLib::get_best_attempt_by_user(api_get_user_id(), $exercise_data['id'], $course_data['real_id'], $my_session_id); $score = 0; if (!empty($user_result_data['exe_weighting']) && intval($user_result_data['exe_weighting']) != 0) { $score = intval($user_result_data['exe_result'] / $user_result_data['exe_weighting'] * 100); } $time = api_strtotime($exercise_data['start_time']) ? api_strtotime($exercise_data['start_time'], 'UTC') : 0; $all_exercise_start_time[] = $time; $my_results[] = $score; if (count($exercise_list) <= 10) { $title = cut($course_data['title'], 30) . " \n " . cut($exercise_data['title'], 30); $exercise_graph_name_list[] = $title; $all_exercise_graph_name_list[] = $title; } else { // if there are more than 10 results, space becomes difficult to find, so only show the title of the exercise, not the tool $title = cut($exercise_data['title'], 30); $exercise_graph_name_list[] = $title; $all_exercise_graph_name_list[] = $title; } } } } } // Complete graph if (!empty($my_results) && !empty($all_exercise_graph_list)) { asort($all_exercise_start_time); //Fix exams order $final_all_exercise_graph_name_list = array(); $my_results_final = array(); $final_all_exercise_graph_list = array(); foreach ($all_exercise_start_time as $key => $time) { $label_time = ''; if (!empty($time)) { $label_time = date('d-m-y', $time); } $final_all_exercise_graph_name_list[] = $all_exercise_graph_name_list[$key] . ' ' . $label_time; $my_results_final[] = $my_results[$key]; $final_all_exercise_graph_list[] = $all_exercise_graph_list[$key]; } $main_session_graph = self::generate_session_exercise_graph($final_all_exercise_graph_name_list, $my_results_final, $final_all_exercise_graph_list); } $html .= Display::page_subheader(Display::return_icon('session.png', get_lang('Sessions'), array(), ICON_SIZE_SMALL) . ' ' . get_lang('Sessions')); $html .= '<table class="data_table" width="100%">'; $html .= '<tr> ' . Display::tag('th', get_lang('Session'), array('width' => '300px')) . ' ' . Display::tag('th', get_lang('PublishedExercises'), array('width' => '300px')) . ' ' . Display::tag('th', get_lang('NewExercises'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('AverageExerciseResult'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('Details'), array('class' => 'head')) . ' </tr>'; foreach ($course_in_session as $my_session_id => $session_data) { $course_list = $session_data['course_list']; $session_name = $session_data['name']; if ($showAllSessions == false) { if (isset($session_id) && !empty($session_id)) { if ($session_id != $my_session_id) { continue; } } } $all_exercises = 0; $all_unanswered_exercises_by_user = 0; $all_average = 0; $stats_array = array(); foreach ($course_list as $course_data) { //All exercises in the course @todo change for a real count $exercises = ExerciseLib::get_all_exercises($course_data, $my_session_id); $count_exercises = 0; if (is_array($exercises) && !empty($exercises)) { $count_exercises = count($exercises); } // Count of user results $done_exercises = null; $courseInfo = api_get_course_info($course_data['code']); $answered_exercises = 0; if (!empty($exercises)) { foreach ($exercises as $exercise_item) { $attempts = Event::count_exercise_attempts_by_user(api_get_user_id(), $exercise_item['id'], $courseInfo['real_id'], $my_session_id); if ($attempts > 1) { $answered_exercises++; } } } // Average $average = ExerciseLib::get_average_score_by_course($courseInfo['real_id'], $my_session_id); $all_exercises += $count_exercises; $all_unanswered_exercises_by_user += $count_exercises - $answered_exercises; $all_average += $average; } $all_average = $all_average / count($course_list); if (isset($_GET['session_id']) && $my_session_id == $_GET['session_id']) { $html .= '<tr style="background-color:#FBF09D">'; } else { $html .= '<tr>'; } $url = api_get_path(WEB_CODE_PATH) . "session/index.php?session_id={$my_session_id}"; $html .= Display::tag('td', Display::url($session_name, $url, array('target' => SESSION_LINK_TARGET))); $html .= Display::tag('td', $all_exercises); $html .= Display::tag('td', $all_unanswered_exercises_by_user); //$html .= Display::tag('td', $all_done_exercise); $html .= Display::tag('td', ExerciseLib::convert_to_percentage($all_average)); if (isset($_GET['session_id']) && $my_session_id == $_GET['session_id']) { $icon = Display::url(Display::return_icon('2rightarrow_na.png', get_lang('Details')), '?session_id=' . $my_session_id); } else { $icon = Display::url(Display::return_icon('2rightarrow.png', get_lang('Details')), '?session_id=' . $my_session_id); } $html .= Display::tag('td', $icon); $html .= '</tr>'; } $html .= '</table><br />'; $html .= Display::div($main_session_graph, array('id' => 'session_graph', 'class' => 'chart-session', 'style' => 'position:relative; text-align: center;')); // Checking selected session. if (isset($_GET['session_id'])) { $session_id_from_get = intval($_GET['session_id']); $session_data = $course_in_session[$session_id_from_get]; $course_list = $session_data['course_list']; $html .= Display::tag('h3', $session_data['name'] . ' - ' . get_lang('CourseList')); $html .= '<table class="data_table" width="100%">'; //'.Display::tag('th', get_lang('DoneExercises'), array('class'=>'head')).' $html .= ' <tr> <th width="300px">' . get_lang('Course') . '</th> ' . Display::tag('th', get_lang('PublishedExercises'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('NewExercises'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('MyAverage'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('AverageExerciseResult'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('TimeSpentInTheCourse'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('LPProgress'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('Score') . Display::return_icon('info3.gif', get_lang('ScormAndLPTestTotalAverage'), array('align' => 'absmiddle', 'hspace' => '3px')), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('LastConnexion'), array('class' => 'head')) . ' ' . Display::tag('th', get_lang('Details'), array('class' => 'head')) . ' </tr>'; foreach ($course_list as $course_data) { $course_code = $course_data['code']; $course_title = $course_data['title']; $courseInfo = api_get_course_info($course_code); $courseId = $courseInfo['real_id']; // All exercises in the course @todo change for a real count $exercises = ExerciseLib::get_all_exercises($course_data, $session_id_from_get); $count_exercises = 0; if (!empty($exercises)) { $count_exercises = count($exercises); } $answered_exercises = 0; foreach ($exercises as $exercise_item) { $attempts = Event::count_exercise_attempts_by_user(api_get_user_id(), $exercise_item['id'], $courseId, $session_id_from_get); if ($attempts > 1) { $answered_exercises++; } } $unanswered_exercises = $count_exercises - $answered_exercises; // Average $average = ExerciseLib::get_average_score_by_course($courseId, $session_id_from_get); $my_average = ExerciseLib::get_average_score_by_course_by_user(api_get_user_id(), $courseId, $session_id_from_get); $stats_array[$course_code] = array('exercises' => $count_exercises, 'unanswered_exercises_by_user' => $unanswered_exercises, 'done_exercises' => $done_exercises, 'average' => $average, 'my_average' => $my_average); $weighting = 0; $last_connection = Tracking::get_last_connection_date_on_the_course($user_id, $courseInfo, $session_id_from_get); $progress = Tracking::get_avg_student_progress($user_id, $course_code, array(), $session_id_from_get); $total_time_login = Tracking::get_time_spent_on_the_course($user_id, $courseId, $session_id_from_get); $time = api_time_to_hms($total_time_login); $percentage_score = Tracking::get_avg_student_score($user_id, $course_code, array(), $session_id_from_get); $courseCodeFromGet = isset($_GET['course']) ? $_GET['course'] : null; if ($course_code == $courseCodeFromGet && $_GET['session_id'] == $session_id_from_get) { $html .= '<tr class="row_odd" style="background-color:#FBF09D" >'; } else { $html .= '<tr class="row_even">'; } $url = api_get_course_url($course_code, $session_id_from_get); $course_url = Display::url($course_title, $url, array('target' => SESSION_LINK_TARGET)); $html .= Display::tag('td', $course_url); $html .= Display::tag('td', $stats_array[$course_code]['exercises']); $html .= Display::tag('td', $stats_array[$course_code]['unanswered_exercises_by_user']); //$html .= Display::tag('td', $stats_array[$course_code]['done_exercises']); $html .= Display::tag('td', ExerciseLib::convert_to_percentage($stats_array[$course_code]['my_average'])); $html .= Display::tag('td', $stats_array[$course_code]['average'] == 0 ? '-' : '(' . ExerciseLib::convert_to_percentage($stats_array[$course_code]['average']) . ')'); $html .= Display::tag('td', $time, array('align' => 'center')); if (is_numeric($progress)) { $progress = $progress . '%'; } else { $progress = '0%'; } //Progress $html .= Display::tag('td', $progress, array('align' => 'center')); if (is_numeric($percentage_score)) { $percentage_score = $percentage_score . '%'; } else { $percentage_score = '0%'; } //Score $html .= Display::tag('td', $percentage_score, array('align' => 'center')); $html .= Display::tag('td', $last_connection, array('align' => 'center')); if ($course_code == $courseCodeFromGet && $_GET['session_id'] == $session_id_from_get) { $details = '<a href="#">'; $details .= Display::return_icon('2rightarrow_na.png', get_lang('Details')); } else { $details = '<a href="' . api_get_self() . '?course=' . $course_code . '&session_id=' . $session_id_from_get . $extra_params . '">'; $details .= Display::return_icon('2rightarrow.png', get_lang('Details')); } $details .= '</a>'; $html .= Display::tag('td', $details, array('align' => 'center')); $html .= '</tr>'; } $html .= '</table>'; } } return $html; }
/** * Prepares a block with all the pending exercises in all courses * @param array Array of courses (arrays) of the user * @return void Doesn't return anything but prepares and HTML block for use in templates * @assert () !== 1 */ public function return_exercise_block($personal_course_list, $tpl) { $exercise_list = array(); if (!empty($personal_course_list)) { foreach ($personal_course_list as $course_item) { $course_code = $course_item['c']; $session_id = $course_item['id_session']; $exercises = ExerciseLib::get_exercises_to_be_taken($course_code, $session_id); foreach ($exercises as $exercise_item) { $exercise_item['course_code'] = $course_code; $exercise_item['session_id'] = $session_id; $exercise_item['tms'] = api_strtotime($exercise_item['end_time'], 'UTC'); $exercise_list[] = $exercise_item; } } if (!empty($exercise_list)) { $exercise_list = ArrayClass::msort($exercise_list, 'tms'); $my_exercise = $exercise_list[0]; $url = Display::url($my_exercise['title'], api_get_path(WEB_CODE_PATH) . 'exercice/overview.php?exerciseId=' . $my_exercise['id'] . '&cidReq=' . $my_exercise['course_code'] . '&id_session=' . $my_exercise['session_id']); $tpl->assign('exercise_url', $url); $tpl->assign('exercise_end_date', api_convert_and_format_date($my_exercise['end_time'], DATE_FORMAT_SHORT)); } } }
/** * Gets all the course meetings saved in the plugin_openmeetings table * @return array Array of current open meeting rooms */ public function getCourseMeetings() { $newMeetingsList = array(); $item = array(); $meetingsList = \Database::select('*', $this->table, array('where' => array('c_id = ? ' => api_get_course_int_id(), ' AND session_id = ? ' => api_get_session_id(), ' AND status <> ? ' => 2))); /*$urlWsdl = $this->url."/services/RoomService?wsdl"; $omServices = new \SoapClient($urlWsdl);*/ $room = new Room(); /* try { $rooms = $this->gateway->getRoomsWithCurrentUsersByType(); //$rooms = $omServices->getRoomsPublic(array( //'SID' => $this->sessionId, //'start' => 0, //'max' => 10, //'orderby' => 'name', //'asc' => 'true', //'externalRoomType' => 'chamilo', //'roomtypes_id' => 'chamilo', //) //); } catch (SoapFault $e) { error_log(__FILE__.'+'.__LINE__.' '.$e->faultstring); //error_log($rooms->getDebug()); return false; } */ $room->SID = $this->sessionId; //error_log(__FILE__.'+'.__LINE__.' Meetings found: '.print_r($room->SID,1)); if (!empty($meetingsList)) { foreach ($meetingsList as $meetingDb) { //$room->rooms_id = $meetingDb['room_id']; error_log(__FILE__ . '+' . __LINE__ . ' Meetings found: ' . print_r($meetingDb, 1)); $remoteMeeting = array(); $meetingDb['created_at'] = api_get_local_time($meetingDb['created_at']); $meetingDb['closed_at'] = !empty($meetingDb['closed_at']) ? api_get_local_time($meetingDb['closed_at']) : ''; // Fixed value for now $meetingDb['participantCount'] = 40; $rec = $this->gateway->getFlvRecordingByRoomId($meetingDb['room_id']); $links = array(); // Links to videos look like these: // http://video2.openmeetings.com:5080/openmeetings/DownloadHandler?fileName=flvRecording_4.avi&moduleName=lzRecorderApp&parentPath=&room_id=&sid=dfc0cac396d384f59242aa66e5a9bbdd $link = $this->url . '/DownloadHandler?fileName=%s&moduleName=lzRecorderApp&parentPath=&room_id=%s&sid=%s'; if (!empty($rec)) { $link1 = sprintf($link, $rec['fileHash'], $meetingDb['room_id'], $this->sessionId); $link2 = sprintf($link, $rec['alternateDownload'], $meetingDb['room_id'], $this->sessionId); $links[] = $rec['fileName'] . ' ' . \Display::url('[.flv]', $link1, array('target' => '_blank')) . ' ' . \Display::url('[.avi]', $link2, array('target' => '_blank')); } $item['show_links'] = implode('<br />', $links); // The following code is currently commented because the web service // says this is not allowed by the SOAP user. /* try { // Get the conference room object from OpenMeetings server - requires SID and rooms_id to be defined $objRoomId = $this->gateway->getRoomById($meetingDb['room_id']); if (empty($objRoomId->return)) { error_log(__FILE__.'+'.__LINE__.' Emptyyyyy '); //\Database::delete($this->table, "id = {$meetingDb['id']}"); // Don't delete expired rooms, just mark as closed \Database::update($this->table, array('status' => 0, 'closed_at' => api_get_utc_datetime()), array('id = ? ' => $meetingDb['id'])); continue; } //$objCurUs = $omServices->getRoomWithCurrentUsersById($objCurrentUsers); } catch (SoapFault $e) { error_log(__FILE__.'+'.__LINE__.' '.$e->faultstring); exit; } //if( empty($objCurUs->returnMeetingID) ) continue; $current_room = array( 'roomtype' => $objRoomId->return->roomtype->roomtypes_id, 'meetingName' => $objRoomId->return->name, 'meetingId' => $objRoomId->return->meetingID, 'createTime' => $objRoomId->return->rooms_id, 'showMicrophoneStatus' => $objRoomId->return->showMicrophoneStatus, 'attendeePw' => $objRoomId->return->attendeePW, 'moderatorPw' => $objRoomId->return->moderators, 'isClosed' => $objRoomId->return->isClosed, 'allowRecording' => $objRoomId->return->allowRecording, 'startTime' => $objRoomId->return->startTime, 'endTime' => $objRoomId->return->updatetime, 'participantCount' => count($objRoomId->return->currentusers), 'maxUsers' => $objRoomId->return->numberOfPartizipants, 'moderatorCount' => count($objRoomId->return->moderators) ); // Then interate through attendee results and return them as part of the array: if (!empty($objRoomId->return->currentusers)) { foreach ($objRoomId->return->currentusers as $a) $current_room[] = array( 'userId' => $a->username, 'fullName' => $a->firstname . " " . $a->lastname, 'isMod' => $a->isMod ); } $remoteMeeting = $current_room; */ if (empty($remoteMeeting)) { /* error_log(__FILE__.'+'.__LINE__.' Empty remote Meeting for now'); if ($meetingDb['status'] == 1 && $this->isTeacher()) { $this->endMeeting($meetingDb['id']); } */ } else { $remoteMeeting['add_to_calendar_url'] = api_get_self() . '?action=add_to_calendar&id=' . $meetingDb['id'] . '&start=' . api_strtotime($meetingDb['startTime']); } $remoteMeeting['end_url'] = api_get_self() . '?action=end&id=' . $meetingDb['id']; $remoteMeeting['delete_url'] = api_get_self() . '?action=delete&id=' . $meetingDb['id']; //$record_array = array(); // if ($meetingDb['record'] == 1) { // $recordingParams = array( // 'meetingId' => $meetingDb['id'], //-- OPTIONAL - comma separate if multiple ids // ); // // $records = $this->api->getRecordingsWithXmlResponseArray($recordingParams); // if (!empty($records)) { // $count = 1; // if (isset($records['message']) && !empty($records['message'])) { // if ($records['messageKey'] == 'noRecordings') { // $record_array[] = get_lang('NoRecording'); // } else { // //$record_array[] = $records['message']; // } // } else { // foreach ($records as $record) { // if (is_array($record) && isset($record['recordId'])) { // $url = Display::url(get_lang('ViewRecord'), $record['playbackFormatUrl'], array('target' => '_blank')); // if ($this->is_teacher()) { // $url .= Display::url(Display::return_icon('link.gif',get_lang('CopyToLinkTool')), api_get_self().'?action=copy_record_to_link_tool&id='.$meetingDb['id'].'&record_id='.$record['recordId']); // $url .= Display::url(Display::return_icon('agenda.png',get_lang('AddToCalendar')), api_get_self().'?action=add_to_calendar&id='.$meetingDb['id'].'&start='.api_strtotime($meetingDb['created_at']).'&url='.$record['playbackFormatUrl']); // $url .= Display::url(Display::return_icon('delete.png',get_lang('Delete')), api_get_self().'?action=delete_record&id='.$record['recordId']); // } // //$url .= api_get_self().'?action=publish&id='.$record['recordID']; // $count++; // $record_array[] = $url; // } else { // // } // } // } // } // //var_dump($record_array); // $item['show_links'] = implode('<br />', $record_array); // // } // //$item['created_at'] = api_convert_and_format_date($meetingDb['created_at']); // //created_at // // $item['publish_url'] = api_get_self().'?action=publish&id='.$meetingDb['id']; // $item['unpublish_url'] = api_get_self().'?action=unpublish&id='.$meetingDb['id']; // //if ($meetingDb['status'] == 1) { // $joinParams = array( // 'meetingId' => $meetingDb['id'], //-- REQUIRED - A unique id for the meeting // 'username' => $this->user_complete_name, //-- REQUIRED - The name that will display for the user in the meeting // 'password' => $pass, //-- REQUIRED - The attendee or moderator password, depending on what's passed here // 'createTime' => '', //-- OPTIONAL - string. Leave blank ('') unless you set this correctly. // 'userID' => '', // -- OPTIONAL - string // 'webVoiceConf' => '' // -- OPTIONAL - string // ); // $returnVal = $this->setUserObjectAndGenerateRoomHashByURLAndRecFlag( array('room_id' => $meetingDb['id']) ); // $joinUrl = CONFIG_OPENMEETINGS_SERVER_URL . "?" . // "secureHash=" . $returnVal; // // $item['go_url'] = $joinUrl; //} $item = array_merge($item, $meetingDb, $remoteMeeting); //error_log(__FILE__.'+'.__LINE__.' Item: '.print_r($item,1)); $newMeetingsList[] = $item; } //end foreach $meetingsList } return $newMeetingsList; }
/** * This function retrieves all the personal agenda items and add them to the agenda items found by the other functions. */ function get_personal_agenda_items($user_id, $agendaitems, $day = "", $month = "", $year = "", $week = "", $type) { $tbl_personal_agenda = Database::get_main_table(TABLE_PERSONAL_AGENDA); $user_id = intval($user_id); // 1. creating the SQL statement for getting the personal agenda items in MONTH view if ($type == "month_view" or $type == "") { // we are in month view $sql = "SELECT * FROM " . $tbl_personal_agenda . " WHERE user='******' and MONTH(date)='" . $month . "' AND YEAR(date) = '" . $year . "' ORDER BY date ASC"; } // 2. creating the SQL statement for getting the personal agenda items in WEEK view // we are in week view if ($type == "week_view") { $start_end_day_of_week = calculate_start_end_of_week($week, $year); $start_day = $start_end_day_of_week['start']['day']; $start_month = $start_end_day_of_week['start']['month']; $start_year = $start_end_day_of_week['start']['year']; $end_day = $start_end_day_of_week['end']['day']; $end_month = $start_end_day_of_week['end']['month']; $end_year = $start_end_day_of_week['end']['year']; // in sql statements you have to use year-month-day for date calculations $start_filter = $start_year . "-" . $start_month . "-" . $start_day . " 00:00:00"; $start_filter = api_get_utc_datetime($start_filter); $end_filter = $end_year . "-" . $end_month . "-" . $end_day . " 23:59:59"; $end_filter = api_get_utc_datetime($end_filter); $sql = " SELECT * FROM " . $tbl_personal_agenda . " WHERE user='******' AND date>='" . $start_filter . "' AND date<='" . $end_filter . "'"; } // 3. creating the SQL statement for getting the personal agenda items in DAY view if ($type == "day_view") { // we are in day view // we could use mysql date() function but this is only available from 4.1 and higher $start_filter = $year . "-" . $month . "-" . $day . " 00:00:00"; $start_filter = api_get_utc_datetime($start_filter); $end_filter = $year . "-" . $month . "-" . $day . " 23:59:59"; $end_filter = api_get_utc_datetime($end_filter); $sql = " SELECT * FROM " . $tbl_personal_agenda . " WHERE user='******' AND date>='" . $start_filter . "' AND date<='" . $end_filter . "'"; } $result = Database::query($sql); while ($item = Database::fetch_array($result, 'ASSOC')) { $time_minute = api_convert_and_format_date($item['date'], TIME_NO_SEC_FORMAT); $item['date'] = api_get_local_time($item['date']); $item['start_date_tms'] = api_strtotime($item['date']); $item['content'] = $item['text']; // we break the date field in the database into a date and a time part $agenda_db_date = explode(" ", $item['date']); $date = $agenda_db_date[0]; $time = $agenda_db_date[1]; // we divide the date part into a day, a month and a year $agendadate = explode("-", $item['date']); $year = intval($agendadate[0]); $month = intval($agendadate[1]); $day = intval($agendadate[2]); // we divide the time part into hour, minutes, seconds $agendatime = explode(":", $time); $hour = $agendatime[0]; $minute = $agendatime[1]; $second = $agendatime[2]; if ($type == 'month_view') { $item['calendar_type'] = 'personal'; $item['start_date'] = $item['date']; $agendaitems[$day][] = $item; continue; } // if the student has specified a course we a add a link to that course if ($item['course'] != "") { $url = api_get_path(WEB_CODE_PATH) . "calendar/agenda.php?cidReq=" . urlencode($item['course']) . "&day={$day}&month={$month}&year={$year}#{$day}"; // RH //Patrick Cool: to highlight the relevant agenda item $course_link = "<a href=\"{$url}\" title=\"" . $item['course'] . "\">" . $item['course'] . "</a>"; } else { $course_link = ""; } // Creating the array that will be returned. If we have week or month view we have an array with the date as the key // if we have a day_view we use a half hour as index => key 33 = 16h30 if ($type !== "day_view") { // This is the array construction for the WEEK or MONTH view //Display events in agenda $agendaitems[$day] .= "<div><i>{$time_minute}</i> {$course_link} <a href=\"myagenda.php?action=view&view=personal&day={$day}&month={$month}&year={$year}&id=" . $item['id'] . "#" . $item['id'] . "\" class=\"personal_agenda\">" . $item['title'] . "</a></div><br />"; } else { // this is the array construction for the DAY view $halfhour = 2 * $agendatime['0']; if ($agendatime['1'] >= '30') { $halfhour = $halfhour + 1; } //Display events by list $agendaitems[$halfhour] .= "<div><i>{$time_minute}</i> {$course_link} <a href=\"myagenda.php?action=view&view=personal&day={$day}&month={$month}&year={$year}&id=" . $item['id'] . "#" . $item['id'] . "\" class=\"personal_agenda\">" . $item['title'] . "</a></div>"; } } return $agendaitems; }
/** * It's used for controlling attendace calendar (list, add, edit, delete), * render to attendance_calendar view * @param string action (optional, by default 'calendar_list') * @param int attendance id (optional) * @param int calendar id (optional) */ public function attendance_calendar($action = 'calendar_list', $attendance_id = 0, $calendar_id = 0) { $attendance = new Attendance(); $calendar_id = intval($calendar_id); $data = array(); $data['attendance_id'] = $attendance_id; $attendance_id = intval($attendance_id); if ($action == 'calendar_add') { if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") { if (!isset($_POST['cancel'])) { if (isset($_POST['repeat'])) { //@todo check this error_logs $start_datetime = api_strtotime(api_get_utc_datetime($attendance->build_datetime_from_array($_POST['date_time'])), 'UTC'); //error_log('$start_datetime '.$start_datetime); $_POST['end_date_time']['H'] = $_POST['date_time']['H']; $_POST['end_date_time']['i'] = $_POST['date_time']['i']; //error_log($attendance->build_datetime_from_array($_POST['end_date_time'])); $end_datetime = api_strtotime(api_get_utc_datetime($attendance->build_datetime_from_array($_POST['end_date_time'])), 'UTC'); //error_log('$end_datetime '.$end_datetime); $checkdate = checkdate($_POST['end_date_time']['F'], $_POST['end_date_time']['d'], $_POST['end_date_time']['Y']); $repeat_type = $_POST['repeat_type']; if ($end_datetime > $start_datetime && $checkdate) { $affected_rows = $attendance->attendance_repeat_calendar_add($attendance_id, $start_datetime, $end_datetime, $repeat_type); $action = 'calendar_list'; } else { if (!$checkdate) { $data['error_checkdate'] = true; } else { $data['error_repeat_date'] = true; } $data['repeat'] = true; $action = 'calendar_add'; } } else { $datetime = $attendance->build_datetime_from_array($_POST['date_time']); $datetimezone = api_get_utc_datetime($datetime); if (!empty($datetime)) { $attendance->set_date_time($datetimezone); $affected_rows = $attendance->attendance_calendar_add($attendance_id); $action = 'calendar_list'; } else { $data['error_date'] = true; $action = 'calendar_add'; } } } else { $action = 'calendar_list'; } } } else { if ($action == 'calendar_edit') { $data['calendar_id'] = $calendar_id; if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") { if (!isset($_POST['cancel'])) { $datetime = $attendance->build_datetime_from_array($_POST['date_time']); $datetimezone = api_get_utc_datetime($datetime); $attendance->set_date_time($datetimezone); $affected_rows = $attendance->attendance_calendar_edit($calendar_id, $attendance_id); $data['calendar_id'] = 0; $action = 'calendar_list'; } else { $action = 'calendar_list'; } } } else { if ($action == 'calendar_delete') { $affected_rows = $attendance->attendance_calendar_delete($calendar_id, $attendance_id); $action = 'calendar_list'; } else { if ($action == 'calendar_all_delete') { $affected_rows = $attendance->attendance_calendar_delete(0, $attendance_id, true); $action = 'calendar_list'; } } } } $data['action'] = $action; $data['attendance_calendar'] = $attendance->get_attendance_calendar($attendance_id); $data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id); // render to the view $this->view->set_data($data); $this->view->set_layout('layout'); $this->view->set_template('attendance_calendar'); $this->view->render(); }
/** * @param $user_id * @param $course_list * @param int $session_id * @return array|bool */ static function get_connections_from_course_list($user_id, $course_list, $session_id = 0) { // Database table definitions $tbl_track_course = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS); if (empty($course_list)) { return false; } // protect data $user_id = intval($user_id); $session_id = intval($session_id); $new_course_list = array(); foreach ($course_list as $course_item) { $courseInfo = api_get_course_info($course_item['code']); $courseId = $courseInfo['real_id']; $new_course_list[] = '"' . $courseId . '"'; } $course_list = implode(', ', $new_course_list); if (empty($course_list)) { return false; } $sql = 'SELECT login_course_date, logout_course_date, c_id FROM ' . $tbl_track_course . ' WHERE user_id = ' . $user_id . ' AND c_id IN (' . $course_list . ') AND session_id = ' . $session_id . ' ORDER BY login_course_date ASC'; $rs = Database::query($sql); $connections = array(); while ($row = Database::fetch_array($rs)) { $timestamp_login_date = api_strtotime($row['login_course_date'], 'UTC'); $timestamp_logout_date = api_strtotime($row['logout_course_date'], 'UTC'); $connections[] = array('login' => $timestamp_login_date, 'logout' => $timestamp_logout_date, 'c_id' => $row['c_id']); } return $connections; }
/** * @param string $file * @param bool $moveFile */ private function importStudents($file, $moveFile = true) { $data = Import::csv_to_array($file); /* * Another users import. Unique identifier: official code and username . ok Password should never get updated. ok If an update should need to occur (because it changed in the .csv), we’ll want that logged. We will handle this manually in that case. All other fields should be updateable, though passwords should of course not get updated. ok If a user gets deleted (not there anymore), He should be set inactive one year after the current date. So I presume you’ll just update the expiration date. We want to grant access to courses up to a year after deletion. */ if (!empty($data)) { $language = $this->defaultLanguage; $this->logger->addInfo(count($data) . " records found."); foreach ($data as $row) { $row = $this->cleanUserRow($row); $user_id = UserManager::get_user_id_from_original_id($row['extra_' . $this->extraFieldIdNameList['user']], $this->extraFieldIdNameList['user']); $userInfo = array(); $userInfoByOfficialCode = null; if (!empty($user_id)) { $userInfo = api_get_user_info($user_id); $userInfoByOfficialCode = api_get_user_info_from_official_code($row['official_code']); } $expirationDate = api_get_utc_datetime(strtotime("+" . intval($this->expirationDateInUserCreation) . "years")); if (empty($userInfo) && empty($userInfoByOfficialCode)) { // Create user $result = UserManager::create_user($row['firstname'], $row['lastname'], STUDENT, $row['email'], $row['username'], $row['password'], $row['official_code'], $language, $row['phone'], null, $row['auth_source'], $expirationDate, 1, 0, null, null, false); if ($result) { foreach ($row as $key => $value) { if (substr($key, 0, 6) == 'extra_') { //an extra field UserManager::update_extra_field_value($result, substr($key, 6), $value); } } $this->logger->addInfo("Students - User created: " . $row['username']); } else { $this->logger->addError("Students - User NOT created: " . $row['username'] . " " . $row['firstname'] . " " . $row['lastname']); } } else { if (empty($userInfo)) { $this->logger->addError("Students - Can't update user :"******"Students - User email is not updated : " . $row['username'] . " because the avoid conditions (email)."); // Do not change email keep the old email. $email = $userInfo['email']; } // 2. Condition if (!in_array($userInfo['email'], $avoidUsersWithEmail) && !in_array($row['email'], $avoidUsersWithEmail)) { $email = $userInfo['email']; } // 3. Condition if (in_array($userInfo['email'], $avoidUsersWithEmail) && !in_array($row['email'], $avoidUsersWithEmail)) { $email = $row['email']; } // Blocking password update $avoidUsersWithPassword = $this->conditions['importStudents']['update']['avoid']['password']; if ($userInfo['password'] != api_get_encrypted_password($row['password']) && in_array($row['password'], $avoidUsersWithPassword)) { $this->logger->addInfo("Students - User password is not updated: " . $row['username'] . " because the avoid conditions (password)."); $password = null; $resetPassword = 0; // disallow password change } } } $expirationDate = api_get_utc_datetime(strtotime("+" . intval($this->expirationDateInUserUpdate) . "years")); // Update user $result = UserManager::update_user($userInfo['user_id'], $row['firstname'], $row['lastname'], $row['username'], $password, $row['auth_source'], $email, STUDENT, $userInfo['official_code'], $userInfo['phone'], $userInfo['picture_uri'], $expirationDate, $userInfo['active'], null, 0, null, null, null, false, $resetPassword); if ($result) { if ($row['username'] != $userInfo['username']) { $this->logger->addInfo("Students - Username was changes from '" . $userInfo['username'] . "' to '" . $row['username'] . "' "); } foreach ($row as $key => $value) { if (substr($key, 0, 6) == 'extra_') { //an extra field UserManager::update_extra_field_value($userInfo['user_id'], substr($key, 6), $value); } } $this->logger->addInfo("Students - User updated: " . $row['username']); } else { $this->logger->addError("Students - User NOT updated: " . $row['username'] . " " . $row['firstname'] . " " . $row['lastname']); } } } } if ($moveFile) { $this->moveFile($file); } }
global $src; $learnPath->items[$learnPath->current]->write_to_db(); $TBL_TRACK_EXERCICES = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); $TBL_LP_ITEM_VIEW = Database::get_course_table(TABLE_LP_ITEM_VIEW); $TBL_LP_ITEM = Database::get_course_table(TABLE_LP_ITEM); $safe_item_id = intval($_GET['lp_item_id']); $safe_id = $lp_id; $safe_exe_id = intval($_REQUEST['exeId']); if ($safe_id == strval(intval($safe_id)) && $safe_item_id == strval(intval($safe_item_id))) { $sql = 'SELECT start_date, exe_date, exe_result, exe_weighting, exe_exo_id FROM ' . $TBL_TRACK_EXERCICES . ' WHERE exe_id = ' . $safe_exe_id; $res = Database::query($sql); $row_dates = Database::fetch_array($res); $time_start_date = api_strtotime($row_dates['start_date'], 'UTC'); $time_exe_date = api_strtotime($row_dates['exe_date'], 'UTC'); $mytime = (int) $time_exe_date - (int) $time_start_date; $score = (double) $row_dates['exe_result']; $max_score = (double) $row_dates['exe_weighting']; $sql = "UPDATE {$TBL_LP_ITEM} SET\n max_score = '{$max_score}'\n WHERE c_id = {$course_id} AND id = '" . $safe_item_id . "'"; Database::query($sql); $sql = "SELECT id FROM {$TBL_LP_ITEM_VIEW}\n WHERE\n c_id = {$course_id} AND\n lp_item_id = '{$safe_item_id}' AND\n lp_view_id = '" . $learnPath->lp_view_id . "'\n ORDER BY id DESC\n LIMIT 1"; $res_last_attempt = Database::query($sql); if (Database::num_rows($res_last_attempt) && !api_is_invitee()) { $row_last_attempt = Database::fetch_row($res_last_attempt); $lp_item_view_id = $row_last_attempt[0]; $exercise = new Exercise(api_get_course_int_id()); $exercise->read($row_dates['exe_exo_id']); $status = 'completed'; if (!empty($exercise->pass_percentage)) { $status = 'failed';
echo '<script> datetime_by_attendance("' . $attendance_select_item_id . '", "' . $thematic_advance_id . '"); </script>'; } else { echo '<script> datetime_by_attendance("' . $attendance_select_item_id . '", 0); </script>'; } } } $default['start_date_type'] = 1; $default['custom_start_date'] = date('d-F-Y H:i', api_strtotime(api_get_local_time())); $default['duration_in_hours'] = 1; if (!empty($thematic_advance_data)) { // set default values $default['content'] = $thematic_advance_data['content']; $default['duration_in_hours'] = $thematic_advance_data['duration']; if (empty($thematic_advance_data['attendance_id'])) { $default['start_date_type'] = 2; $default['custom_start_date'] = date('d-F-Y H:i', api_strtotime(api_get_local_time($thematic_advance_data['start_date']))); } else { $default['start_date_type'] = 1; if (!empty($thematic_advance_data['start_date'])) { $default['start_date_by_attendance'] = api_get_local_time($thematic_advance_data['start_date']); } $default['attendance_select'] = $thematic_advance_data['attendance_id']; } } $form->setDefaults($default); // error messages $msg_error = ''; if ($start_date_error) { $msg_error .= get_lang('YouMustSelectAtleastAStartDate') . '<br />'; } if ($duration_error) {
/** * Return true if coach is allowed to access this session * @param int $sessionId * @return bool */ public static function isSessionDateOkForCoach($sessionId) { return api_get_session_visibility($sessionId); $listSessionInfo = api_get_session_info($sessionId); $dateStart = $listSessionInfo['date_start']; $dateEnd = $listSessionInfo['date_end']; $nbDaysAccessBeforeBeginning = $listSessionInfo['nb_days_access_before_beginning']; $nbDaysAccessAfterEnd = $listSessionInfo['nb_days_access_after_end']; // no start date if ($dateStart == '0000-00-00') { return true; } $now = time(); $dateStartForCoach = api_strtotime($dateStart . ' 00:00:00') - $nbDaysAccessBeforeBeginning * 86400; $dateEndForCoach = api_strtotime($dateEnd . ' 00:00:00') + $nbDaysAccessAfterEnd * 86400; if ($dateEnd == '0000-00-00') { // start date but no end date if ($dateStartForCoach <= $now) { return true; } } else { // start date and end date if ($dateStartForCoach <= $now && $now <= $dateEndForCoach) { return true; } } return false; }
/** * Gets the week from a day * @param string Date in UTC (2010-01-01 12:12:12) * @return int Returns an integer with the week number of the year */ function get_week_from_day($date) { if (!empty($date)) { $time = api_strtotime($date, 'UTC'); return date('W', $time); } else { return date('W'); } }
/** * @param string $course_code * @param int $session_id * * @return array */ public static function get_exercises_to_be_taken($course_code, $session_id) { $course_info = api_get_course_info($course_code); $exercises = self::get_all_exercises($course_info, $session_id); $result = array(); $now = time() + 15 * 24 * 60 * 60; foreach ($exercises as $exercise_item) { if (isset($exercise_item['end_time']) && !empty($exercise_item['end_time']) && $exercise_item['end_time'] != '0000-00-00 00:00:00' && api_strtotime($exercise_item['end_time'], 'UTC') < $now) { $result[] = $exercise_item; } } return $result; }