Update from 1.11.x

pull/3124/head
Julio Montoya 6 years ago
parent 1285bddfab
commit b41209b88a
  1. 730
      public/main/admin/statistics/index.php
  2. 81
      public/main/admin/system_announcements.php
  3. 11
      public/main/auth/courses.php
  4. 30
      public/main/auth/courses_categories.php
  5. 70
      public/main/auth/courses_controller.php
  6. 17
      public/main/auth/profile.php
  7. 373
      public/main/inc/ajax/statistics.ajax.php
  8. 4
      public/main/inc/ajax/user_manager.ajax.php
  9. 61
      public/main/inc/lib/CoursesAndSessionsCatalog.class.php
  10. 42
      public/main/inc/lib/certificate.lib.php
  11. 126
      public/main/inc/lib/system_announcements.lib.php
  12. 29
      public/main/inc/lib/tracking.lib.php
  13. 22
      public/main/lp/lp_final_item.php
  14. 4
      public/main/survey/fillsurvey.php
  15. 4
      public/main/survey/preview.php
  16. 2
      public/main/survey/question.php
  17. 5
      public/main/survey/survey.php
  18. 1
      public/main/survey/surveyUtil.class.php
  19. 2
      public/main/survey/survey_list.php
  20. 28
      src/CoreBundle/Component/Editor/CkEditor/Toolbar/Survey.php
  21. 98
      src/CoreBundle/Component/Editor/CkEditor/Toolbar/SurveyQuestion.php

@ -1,10 +1,9 @@
<?php
/* For licensing terms, see /license.txt */
/**
* This tool show global Statistics on general platform events.
*
* @package chamilo.Statistics
*/
$cidReset = true;
@ -15,11 +14,12 @@ $interbreadcrumb[] = ['url' => '../index.php', 'name' => get_lang('Administratio
$report = isset($_REQUEST['report']) ? $_REQUEST['report'] : '';
$sessionDuration = isset($_GET['session_duration']) ? (int) $_GET['session_duration'] : '';
$validated = false;
if (
in_array(
$report,
['recentlogins', 'tools', 'courses', 'coursebylanguage', 'users']
['recentlogins', 'tools', 'courses', 'coursebylanguage', 'users', 'users_active', 'session_by_date']
)
) {
$htmlHeadXtra[] = api_get_js('chartjs/Chart.min.js');
@ -65,7 +65,7 @@ if (
';
$htmlHeadXtra[] = Statistics::getJSChartTemplate($url, $reportType, $reportOptions);
break;
case 'coursebylanguage':
case 'coursebylanguage':
$url = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?a=courses_by_language';
$reportName = 'CountCourseByLanguage';
$reportType = 'pie';
@ -81,7 +81,7 @@ if (
';
$htmlHeadXtra[] = Statistics::getJSChartTemplate($url, $reportType, $reportOptions);
break;
case 'users':
case 'users':
$invisible = isset($_GET['count_invisible_courses']) ? intval($_GET['count_invisible_courses']) : null;
$urlBase = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?';
$url1 = $urlBase.'a=users&count_invisible='.$invisible;
@ -123,10 +123,197 @@ if (
'canvas3'
);
break;
case 'users_active':
$form = new FormValidator('users_active', 'get', api_get_self().'?report=users_active');
$form->addDateRangePicker(
'daterange',
get_lang('DateRange'),
true,
['format' => 'YYYY-MM-DD', 'timePicker' => 'false', 'validate_format' => 'Y-m-d']
);
$form->addHidden('report', 'users_active');
$form->addButtonFilter(get_lang('Search'));
$validated = $form->validate() || isset($_REQUEST['daterange']);
$urlBase = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?';
$dateStart = '';
$dateEnd = '';
if ($validated) {
$values = $_REQUEST;
$form->setDefaults(['daterange' => Security::remove_XSS($values['daterange'])]);
$dateStart = Security::remove_XSS($values['daterange_start']);
$dateEnd = Security::remove_XSS($values['daterange_end']);
}
$reportType = 'pie';
$reportOptions = '
legend: {
position: "left"
},
title: {
text: "%s",
display: true
},
cutoutPercentage: 25
';
$reportName1 = get_lang('ActiveUsers');
$reportName2 = get_lang('UserByStatus');
$reportName3 = get_lang('UserByLanguage');
$reportName4 = get_lang('UserByLanguageCible');
$reportName5 = get_lang('UserByCareer');
$reportName6 = get_lang('UserByContract');
$reportName7 = get_lang('UserByCertificate');
$url1 = $urlBase.'a=users_active&filter=active&date_start='.$dateStart.'&date_end='.$dateEnd;
$url2 = $urlBase.'a=users_active&filter=status&date_start='.$dateStart.'&date_end='.$dateEnd;
$url3 = $urlBase.'a=users_active&filter=language&date_start='.$dateStart.'&date_end='.$dateEnd;
$url4 = $urlBase.'a=users_active&filter=language_cible&date_start='.$dateStart.'&date_end='.$dateEnd;
$url5 = $urlBase.'a=users_active&filter=career&date_start='.$dateStart.'&date_end='.$dateEnd;
$url6 = $urlBase.'a=users_active&filter=contract&date_start='.$dateStart.'&date_end='.$dateEnd;
$url7 = $urlBase.'a=users_active&filter=certificate&date_start='.$dateStart.'&date_end='.$dateEnd;
$reportOptions1 = sprintf($reportOptions, $reportName1);
$reportOptions2 = sprintf($reportOptions, $reportName2);
$reportOptions3 = sprintf($reportOptions, $reportName3);
$reportOptions4 = sprintf($reportOptions, $reportName4);
$reportOptions5 = sprintf($reportOptions, $reportName5);
$reportOptions6 = sprintf($reportOptions, $reportName6);
$reportOptions7 = sprintf($reportOptions, $reportName7);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url1,
$reportType,
$reportOptions1,
'canvas1'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url2,
$reportType,
$reportOptions2,
'canvas2'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url3,
$reportType,
$reportOptions3,
'canvas3'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url4,
$reportType,
$reportOptions4,
'canvas4'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url5,
$reportType,
$reportOptions5,
'canvas5'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url6,
$reportType,
$reportOptions6,
'canvas6'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url7,
$reportType,
$reportOptions7,
'canvas7'
);
break;
case 'session_by_date':
$form = new FormValidator('session_by_date', 'get');
$form->addDateRangePicker(
'range',
get_lang('DateRange'),
true,
['format' => 'YYYY-MM-DD', 'timePicker' => 'false', 'validate_format' => 'Y-m-d']
);
$options = SessionManager::getStatusList();
$form->addSelect('status_id', get_lang('SessionStatus'), $options, ['placeholder' => get_lang('All')]);
$form->addHidden('report', 'session_by_date');
$form->addButtonSearch(get_lang('Search'));
$validated = $form->validate() || isset($_REQUEST['range']);
if ($validated) {
$values = $form->getSubmitValues();
$urlBase = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?';
$dateStart = null;
$dateEnd = null;
if (isset($values['range_start'])) {
$dateStart = Security::remove_XSS($values['range_start']);
}
if (isset($values['range_end'])) {
$dateEnd = Security::remove_XSS($values['range_end']);
}
if (isset($_REQUEST['range_start'])) {
$dateStart = Security::remove_XSS($_REQUEST['range_start']);
}
if (isset($_REQUEST['range_end'])) {
$dateEnd = Security::remove_XSS($_REQUEST['range_end']);
}
$statusId = (int) $_REQUEST['status_id'];
$conditions = "&date_start=$dateStart&date_end=$dateEnd&status=$statusId";
$url1 = $urlBase.'a=session_by_date&filter=category'.$conditions;
$url2 = $urlBase.'a=session_by_date&filter=language'.$conditions;
$url3 = $urlBase.'a=session_by_date&filter=status'.$conditions;
$reportName1 = get_lang('SessionsPerCategory');
$reportName2 = get_lang('SessionsPerLanguage');
$reportName3 = get_lang('SessionsPerStatus');
$reportType = 'pie';
$reportOptions = '
legend: {
position: "left"
},
title: {
text: "%s",
display: true
},
cutoutPercentage: 25
';
$reportOptions1 = sprintf($reportOptions, $reportName1);
$reportOptions2 = sprintf($reportOptions, $reportName2);
$reportOptions3 = sprintf($reportOptions, $reportName3);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url1,
$reportType,
$reportOptions1,
'canvas1'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url2,
$reportType,
$reportOptions2,
'canvas2'
);
$htmlHeadXtra[] = Statistics::getJSChartTemplate(
$url3,
$reportType,
$reportOptions3,
'canvas3'
);
}
break;
}
}
if ($report == 'user_session') {
if ($report === 'user_session') {
$htmlHeadXtra[] = api_get_jqgrid_js();
}
@ -135,62 +322,249 @@ if (isset($_GET['export'])) {
}
$tool_name = get_lang('Statistics');
Display::display_header($tool_name);
echo Display::page_header($tool_name);
$tools = [
get_lang('Courses') => [
'report=courses' => get_lang('CountCours'),
'report=tools' => get_lang('PlatformToolAccess'),
'report=courselastvisit' => get_lang('LastAccess'),
'report=coursebylanguage' => get_lang('CountCourseByLanguage'),
],
get_lang('Users') => [
'report=users' => get_lang('CountUsers'),
'report=recentlogins' => get_lang('Logins'),
'report=logins&amp;type=month' => get_lang('Logins').' ('.get_lang('PeriodMonth').')',
'report=logins&amp;type=day' => get_lang('Logins').' ('.get_lang('PeriodDay').')',
'report=logins&amp;type=hour' => get_lang('Logins').' ('.get_lang('PeriodHour').')',
'report=pictures' => get_lang('CountUsers').' ('.get_lang('UserPicture').')',
'report=logins_by_date' => get_lang('LoginsByDate'),
'report=no_login_users' => get_lang('StatsUsersDidNotLoginInLastPeriods'),
'report=zombies' => get_lang('Zombies'),
'report=users_active' => get_lang('UserStats'),
],
get_lang('System') => [
'report=activities' => get_lang('ImportantActivities'),
'report=user_session' => get_lang('PortalUserSessionStats'),
],
get_lang('Social') => [
'report=messagereceived' => get_lang('MessagesReceived'),
'report=messagesent' => get_lang('MessagesSent'),
'report=friends' => get_lang('CountFriends'),
],
get_lang('Session') => [
'report=session_by_date' => get_lang('SessionsByDate'),
//'report=session_by_week' => get_lang('SessionsByWeek'),
//'report=session_by_user' => get_lang('SessionsByUser'),
],
];
$strCourse = get_lang('Courses');
$strUsers = get_lang('Users');
$strSystem = get_lang('System');
$strSocial = get_lang('Social');
$strSession = get_lang('Session');
// courses ...
$tools[$strCourse]['report=courses'] = get_lang('Courses');
$tools[$strCourse]['report=tools'] = get_lang('Tools access');
$tools[$strCourse]['report=courselastvisit'] = get_lang('Latest access');
$tools[$strCourse]['report=coursebylanguage'] = get_lang('CourseseByLanguage');
// users ...
$tools[$strUsers]['report=users'] = get_lang('Number of users');
$tools[$strUsers]['report=recentlogins'] = get_lang('Logins');
$tools[$strUsers]['report=logins&amp;type=month'] = get_lang('Logins').' ('.get_lang('Month').')';
$tools[$strUsers]['report=logins&amp;type=day'] = get_lang('Logins').' ('.get_lang('Day').')';
$tools[$strUsers]['report=logins&amp;type=hour'] = get_lang('Logins').' ('.get_lang('Hour').')';
$tools[$strUsers]['report=pictures'] = get_lang('Number of users').' ('.get_lang('Picture').')';
$tools[$strUsers]['report=logins_by_date'] = get_lang('Logins by date');
$tools[$strUsers]['report=no_login_users'] = get_lang('Not logged in for some time');
$tools[$strUsers]['report=zombies'] = get_lang('Zombies');
// system ...
$tools[$strSystem]['report=activities'] = get_lang('Important activities');
if (api_is_global_platform_admin() && api_is_multiple_url_enabled()) {
$tools[$strSystem]['report=user_session'] = get_lang('Portal user session stats');
}
$course_categories = Statistics::getCourseCategories();
$content = '';
// social ...
$tools[$strSocial]['report=messagesent'] = get_lang('Number of messages sent');
$tools[$strSocial]['report=messagereceived'] = get_lang('Number of messages received');
$tools[$strSocial]['report=friends'] = get_lang('Contacts count');
switch ($report) {
case 'session_by_date':
if ($validated) {
$values = $form->getSubmitValues();
echo '<table><tr>';
foreach ($tools as $section => $items) {
echo '<td style="vertical-align:top;">';
echo '<h3>'.$section.'</h3>';
echo '<ul>';
foreach ($items as $key => $value) {
echo '<li><a href="index.php?'.$key.'">'.$value.'</a></li>';
}
echo '</ul>';
echo '</td>';
}
echo '</tr></table>';
/*$start = Security::remove_XSS($_REQUEST['range_start']);
$end = Security::remove_XSS($_REQUEST['range_end']);*/
//var_dump($dateStart);
$first = DateTime::createFromFormat('Y-m-d', $dateStart);
$second = DateTime::createFromFormat('Y-m-d', $dateEnd);
$numberOfWeeks = floor($first->diff($second)->days / 7);
$course_categories = Statistics::getCourseCategories();
//@todo: spaces between elements should be handled in the css, br should be removed if only there for presentation
echo '<br/><br/>';
$content .= '<div class="row">';
$content .= '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>';
switch ($report) {
$sessionStatusAllowed = api_get_configuration_value('allow_session_status');
if ($sessionStatusAllowed) {
$content .= '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>';
}
$content .= '</div>';
$statusCondition = '';
if (!empty($statusId)) {
$statusCondition .= " AND status = $statusId ";
}
$start = Database::escape_string($dateStart);
$end = Database::escape_string($dateEnd);
// User count
$table = Database::get_main_table(TABLE_MAIN_SESSION);
$sql = "SELECT * FROM $table
WHERE
(display_start_date BETWEEN '$start' AND '$end' OR
display_end_date BETWEEN '$start' AND '$end')
$statusCondition
";
$result = Database::query($sql);
$sessionCount = 0;
$numberUsers = 0;
$sessions = [];
while ($row = Database::fetch_array($result, 'ASSOC')) {
$sessions[] = $row;
$numberUsers += $row['nbr_users'];
$sessionCount++;
}
// Coach
$sql = "SELECT count(DISTINCT(id_coach)) count FROM $table
WHERE
(display_start_date BETWEEN '$start' AND '$end' OR
display_end_date BETWEEN '$start' AND '$end')
$statusCondition
";
$result = Database::query($sql);
$row = Database::fetch_array($result);
$uniqueCoaches = $row['count'];
// Categories
$sql = "SELECT count(id) count, session_category_id FROM $table
WHERE
(display_start_date BETWEEN '$start' AND '$end' OR
display_end_date BETWEEN '$start' AND '$end')
$statusCondition;
GROUP BY session_category_id
";
$result = Database::query($sql);
$sessionPerCategories = [];
while ($row = Database::fetch_array($result)) {
$sessionPerCategories[$row['session_category_id']] = $row['count'];
}
$sessionAverage = 0;
$averageUser = 0;
$averageCoach = 0;
if (!empty($numberOfWeeks)) {
$sessionAverage = api_number_format($sessionCount/$numberOfWeeks, 2);
}
if (!empty($numberUsers)) {
$averageUser = api_number_format($sessionCount/$numberUsers, 2);
}
if (!empty($uniqueCoaches)) {
$averageCoach = api_number_format($sessionCount/$uniqueCoaches, 2);
}
$table = new HTML_Table(['class' => 'table table-responsive']);
$row = 0;
$table->setCellContents($row, 0, get_lang('Weeks'));
$table->setCellContents($row, 1, $numberOfWeeks);
$row++;
$table->setCellContents($row, 0, get_lang('SessionCount'));
$table->setCellContents($row, 1, $sessionCount);
$row++;
$table->setCellContents($row, 0, get_lang('SessionsPerWeek'));
$table->setCellContents($row, 1, $sessionAverage);
$row++;
$table->setCellContents($row, 0, get_lang('AverageUserPerWeek'));
$table->setCellContents($row, 1, $averageUser);
$row++;
$table->setCellContents($row, 0, get_lang('AverageSessionPerGeneralCoach'));
$table->setCellContents($row, 1, $averageCoach);
$row++;
$content .= $table->toHtml();
$table = new HTML_Table(['class' => 'table table-responsive']);
$headers = [
get_lang('SessionCategory'),
get_lang('Count'),
];
$row = 0;
$column = 0;
foreach ($headers as $header) {
$table->setHeaderContents($row, $column, $header);
$column++;
}
$row++;
foreach ($sessionPerCategories as $categoryId => $count) {
$categoryData = SessionManager::get_session_category($categoryId);
$label = get_lang('NoCategory');
if ($categoryData) {
$label = $categoryData['name'];
}
$table->setCellContents($row, 0, $label);
$table->setCellContents($row, 1, $count);
$row++;
}
$content .= $table->toHtml();
$table = new HTML_Table(['class' => 'table table-responsive']);
$headers = [
get_lang('Name'),
get_lang('StartDate'),
get_lang('EndDate'),
get_lang('Language'),
];
if ($sessionStatusAllowed) {
$headers[] = get_lang('Status');
}
$row = 0;
$column = 0;
foreach ($headers as $header) {
$table->setHeaderContents($row, $column, $header);
$column++;
}
$row++;
foreach ($sessions as $session) {
$table->setCellContents($row, 0, $session['name']);
$table->setCellContents($row, 1, api_get_local_time($session['display_start_date']));
$table->setCellContents($row, 2, api_get_local_time($session['display_end_date']));
// Get first language.
$language = '';
$courses = SessionManager::getCoursesInSession($session['id']);
if (!empty($courses)) {
$courseId = $courses[0];
$courseInfo = api_get_course_info_by_id($courseId);
$language = $courseInfo['language'];
$language = str_replace('2', '', $language);
}
$table->setCellContents($row, 3, $language);
if ($sessionStatusAllowed) {
$table->setCellContents($row, 4, SessionManager::getStatusLabel($session['status']));
}
$row++;
}
$content .= $table->toHtml();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] === 'export') {
$data = $table->toArray();
Export::arrayToXls($data);
exit;
}
$link = '';
if ($validated) {
$url = api_get_self().'?report=session_by_date&action=export';
if (!empty($values)) {
foreach ($values as $index => $value) {
$url .= '&'.$index.'='.$value;
}
}
$link = Display::url(
Display::return_icon('excel.png').'&nbsp;'.get_lang('ExportAsXLS'),
$url,
['class' => 'btn btn-default']
);
}
$content = $form->returnForm().$link.$content;
break;
case 'user_session':
$form = new FormValidator('user_session', 'get');
$form->addDateRangePicker('range', get_lang('DateRange'), true);
@ -208,7 +582,7 @@ switch ($report) {
$start = $values['range_start'];
$end = $values['range_end'];
}
echo $form->returnForm();
$content .= $form->returnForm();
$url = api_get_path(WEB_AJAX_PATH).'statistics.ajax.php?a=get_user_session&start='.$start.'&end='.$end;
$columns = [
@ -250,11 +624,11 @@ switch ($report) {
$extraParams['autowidth'] = 'true'; //use the width of the parent
$extraParams['height'] = 'auto'; //use the width of the parent
$actionLinks = '';
?>
$content .= '
<script>
$(function() {
<?php
echo Display::grid_js(
'.Display::grid_js(
'user_session_grid',
$url,
$columns,
@ -263,8 +637,7 @@ switch ($report) {
[],
$actionLinks,
true
);
?>
).'
jQuery("#user_session_grid").jqGrid("navGrid","#user_session_grid_pager",{
view:false,
@ -282,42 +655,189 @@ switch ($report) {
}
});
});
</script>
<?php
echo Display::grid_html('user_session_grid');
</script>';
$content .= Display::grid_html('user_session_grid');
break;
case 'courses':
echo '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>';
$content .= '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>';
// total amount of courses
foreach ($course_categories as $code => $name) {
$courses[$name] = Statistics::countCourses($code);
}
// courses for each course category
Statistics::printStats(get_lang('Courses'), $courses);
$content .= Statistics::printStats(get_lang('CountCours'), $courses);
break;
case 'tools':
echo '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>';
Statistics::printToolStats();
$content .= '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>';
$content .= Statistics::printToolStats();
break;
case 'coursebylanguage':
echo '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>';
$content .= '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>';
$result = Statistics::printCourseByLanguageStats();
Statistics::printStats(get_lang('CourseseByLanguage'), $result, true);
$content .= Statistics::printStats(get_lang('CountCourseByLanguage'), $result, true);
break;
case 'courselastvisit':
Statistics::printCourseLastVisit();
$content .= Statistics::printCourseLastVisit();
break;
case 'users_active':
$content = '';
if ($validated) {
$startDate = $values['daterange_start'];
$endDate = $values['daterange_end'];
$content .= '<div class="row">';
$content .= '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>';
$content .= '</div>';
$content .= '<div class="row">';
$content .= '<div class="col-md-6"><canvas id="canvas4" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-6"><canvas id="canvas5" style="margin-bottom: 20px"></canvas></div>';
$content .= '</div>';
$content .= '<div class="row">';
$content .= '<div class="col-md-6"><canvas id="canvas6" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-6"><canvas id="canvas7" style="margin-bottom: 20px"></canvas></div>';
$content .= '</div>';
$conditions = [];
$extraConditions = '';
if (!empty($startDate) && !empty($endDate)) {
$extraConditions .= " AND registration_date BETWEEN '$startDate' AND '$endDate' ";
}
$totalCount = UserManager::getUserListExtraConditions(
$conditions,
[],
false,
false,
null,
$extraConditions,
true
);
$pagination = 10;
$table = new SortableTableFromArray(
[],
0,
$pagination,
'table_users_active',
null,
'table_users_active'
);
$table->actionButtons = ['export' => ['label' => get_lang('ExportAsXLS'), 'icon' => Display::return_icon('excel.png')]];
$first = ($table->page_nr - 1) * $pagination;
$limit = $table->page_nr * $pagination;
$data = [];
$headers = [
get_lang('FirstName'),
get_lang('LastName'),
get_lang('RegistrationDate'),
get_lang('UserNativeLanguage'),
get_lang('LangueCible'),
get_lang('ApprenticeshipContract'),
get_lang('UserResidenceCountry'),
get_lang('Career'),
get_lang('Status'),
get_lang('Active'),
get_lang('Certificate'),
get_lang('UserBirthday'),
];
if (isset($_REQUEST['action_table']) && $_REQUEST['action_table'] === 'export') {
$first = 0;
$limit = $totalCount;
$data[] = $headers;
}
$users = UserManager::getUserListExtraConditions(
$conditions,
[],
$first,
$limit,
null,
$extraConditions
);
$extraFieldValueUser = new ExtraFieldValue('user');
$statusList = api_get_status_langvars();
foreach ($users as $user) {
$userId = $user['user_id'];
$extraDataList = $extraFieldValueUser->getAllValuesByItem($userId);
$extraFields = [];
foreach ($extraDataList as $extraData) {
$extraFields[$extraData['variable']] = $extraData['value'];
}
$certificate = GradebookUtils::get_certificate_by_user_id(
0,
$userId
);
$language = isset($extraFields['langue_cible']) ? $extraFields['langue_cible'] : '';
$contract = isset($extraFields['termactivated']) ? $extraFields['termactivated'] : '';
$residence = isset($extraFields['terms_paysresidence']) ? $extraFields['terms_paysresidence'] : '';
$career = isset($extraFields['filiere_user']) ? $extraFields['filiere_user'] : '';
$birthDate = isset($extraFields['terms_datedenaissance']) ? $extraFields['terms_datedenaissance'] : '';
$item = [];
$item[] = $user['firstname'];
$item[] = $user['lastname'];
$item[] = api_get_local_time($user['registration_date']);
$item[] = $user['language'];
$item[] = $language;
$item[] = $contract ? get_lang('Yes') : get_lang('No');
$item[] = $residence;
$item[] = $career;
$item[] = $statusList[$user['status']];
$item[] = $user['active'] == 1 ? get_lang('Yes') : get_lang('No');
$item[] = $certificate ? get_lang('Yes') : get_lang('No');
$item[] = $birthDate;
$data[] = $item;
$row++;
}
if (isset($_REQUEST['action_table']) && $_REQUEST['action_table'] === 'export') {
Export::arrayToXls($data);
exit;
}
$table->total_number_of_items = $totalCount;
$table->table_data = $data;
unset($values['submit']);
$table->set_additional_parameters($values);
$row = 0;
$column = 0;
foreach ($headers as $header) {
$table->set_header($column, $header, false);
$column++;
}
$content .= $table->return_table();
}
$content = $form->returnForm().$content;
break;
case 'users':
echo '<div class="row">';
echo '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>';
echo '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>';
echo '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>';
echo '</div>';
$content .= '<div class="row">';
$content .= '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>';
$content .= '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>';
$content .= '</div>';
// total amount of users
$teachers = $students = [];
$countInvisible = isset($_GET['count_invisible_courses']) ? intval($_GET['count_invisible_courses']) : null;
Statistics::printStats(
$content .= Statistics::printStats(
get_lang('Number of users'),
[
get_lang('Trainers') => Statistics::countUsers(COURSEMANAGER, null, $countInvisible),
@ -330,56 +850,76 @@ switch ($report) {
$students[$name] = Statistics::countUsers(STUDENT, $code, $countInvisible);
}
// docents for each course category
Statistics::printStats(get_lang('Trainers'), $teachers);
$content .= Statistics::printStats(get_lang('Trainers'), $teachers);
// students for each course category
Statistics::printStats(get_lang('Learners'), $students);
$content .= Statistics::printStats(get_lang('Learners'), $students);
break;
case 'recentlogins':
echo '<h2>'.sprintf(get_lang('Last %s days'), '15').'</h2>';
$content .= '<h2>'.sprintf(get_lang('Last %s days'), '15').'</h2>';
$form = new FormValidator('session_time', 'get', api_get_self().'?report=recentlogins&session_duration='.$sessionDuration);
$sessionTimeList = ['', 5 => 5, 15 => 15, 30 => 30, 60 => 60];
$form->addSelect('session_duration', [get_lang('Session min duration'), get_lang('Minutes')], $sessionTimeList);
$form->addButtonSend(get_lang('Filter'));
$form->addHidden('report', 'recentlogins');
$form->display();
$content .= $form->returnForm();
echo '<canvas class="col-md-12" id="canvas" height="200px" style="margin-bottom: 20px"></canvas>';
Statistics::printRecentLoginStats(false, $sessionDuration);
Statistics::printRecentLoginStats(true, $sessionDuration);
$content .= '<canvas class="col-md-12" id="canvas" height="200px" style="margin-bottom: 20px"></canvas>';
$content .= Statistics::printRecentLoginStats(false, $sessionDuration);
$content .= Statistics::printRecentLoginStats(true, $sessionDuration);
break;
case 'logins':
Statistics::printLoginStats($_GET['type']);
$content .= Statistics::printLoginStats($_GET['type']);
break;
case 'pictures':
Statistics::printUserPicturesStats();
$content .= Statistics::printUserPicturesStats();
break;
case 'no_login_users':
Statistics::printUsersNotLoggedInStats();
$content .= Statistics::printUsersNotLoggedInStats();
break;
case 'zombies':
ZombieReport::create(['report' => 'zombies'])->display();
$content .= ZombieReport::create(['report' => 'zombies'])->display(true);
break;
case 'activities':
Statistics::printActivitiesStats();
$content .=Statistics::printActivitiesStats();
break;
case 'messagesent':
$messages_sent = Statistics::getMessages('sent');
Statistics::printStats(get_lang('Number of messages sent'), $messages_sent);
$content .= Statistics::printStats(get_lang('Number of messages sent'), $messages_sent);
break;
case 'messagereceived':
$messages_received = Statistics::getMessages('received');
Statistics::printStats(get_lang('Number of messages received'), $messages_received);
$content .= Statistics::printStats(get_lang('Number of messages received'), $messages_received);
break;
case 'friends':
// total amount of friends
$friends = Statistics::getFriends();
Statistics::printStats(get_lang('Contacts count'), $friends);
$content .= Statistics::printStats(get_lang('Contacts count'), $friends);
break;
case 'logins_by_date':
Statistics::printLoginsByDate();
$content .= Statistics::printLoginsByDate();
break;
}
Display::display_header($tool_name);
echo Display::page_header($tool_name);
echo '<table><tr>';
foreach ($tools as $section => $items) {
echo '<td style="vertical-align:top;">';
echo '<h3>'.$section.'</h3>';
echo '<ul>';
foreach ($items as $key => $value) {
echo '<li><a href="index.php?'.$key.'">'.$value.'</a></li>';
}
echo '</ul>';
echo '</td>';
}
echo '</tr></table>';
//@todo: spaces between elements should be handled in the css, br should be removed if only there for presentation
echo '<br/><br/>';
echo $content;
Display::display_footer();
if (isset($_GET['export'])) {

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
/**
@ -23,6 +24,8 @@ $action_todo = false;
// Access restrictions
api_protect_admin_script(true);
$allowCareers = api_get_configuration_value('allow_careers_in_global_announcements');
// Setting breadcrumbs.
$interbreadcrumb[] = [
"url" => 'index.php',
@ -48,14 +51,42 @@ if (!empty($action)) {
];
}
if ($action == 'edit') {
$interbreadcrumb[] = ["url" => '#', "name" => get_lang('Edit')];
$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Edit')];
}
} else {
$tool_name = get_lang('Portal news');
}
$url = api_get_path(WEB_AJAX_PATH).'career.ajax.php';
$htmlHeadXtra[] = '<script>
function showCareer() {
$("#promotion").show();
var url = "'.$url.'";
var id = $(\'#career_id\').val();
$.getJSON(
url, {
"career_id" : id,
"a" : "get_promotions"
}
)
.done(function(data) {
$("#promotion_id").empty();
$("#promotion_id").append(
$("<option>", {value: "0", text: "'.addslashes(get_lang('All')).'"})
);
$.each(data, function(index, value) {
$("#promotion_id").append(
$("<option>", {value: value.id, text: value.name})
);
});
$("#promotion_id").selectpicker("refresh");
});
}
</script>';
// Displaying the header.
Display :: display_header($tool_name);
Display::display_header($tool_name);
if ($action != 'add' && $action != 'edit') {
echo '<div class="actions">';
echo '<a href="?action=add">'.Display::return_icon('add.png', get_lang('Add an announcement'), [], 32).'</a>';
@ -79,6 +110,7 @@ switch ($action) {
if ($action == 'make_visible') {
$status = true;
}
SystemAnnouncementManager::set_visibility(
$_GET['id'],
$_GET['person'],
@ -126,6 +158,10 @@ switch ($action) {
$values[$key] = $data[$key];
}
}
if ($allowCareers) {
$values['career_id'] = $announcement->career_id;
$values['promotion_id'] = $announcement->promotion_id;
}
$values['lang'] = $announcement->lang;
$values['action'] = 'edit';
@ -144,7 +180,7 @@ if ($action_todo) {
$url = api_get_self().'?id='.intval($_GET['id']);
}
$form = new FormValidator('system_announcement', 'post', $url);
$form->addElement('header', '', $form_title);
$form->addHeader($form_title);
$form->addText('title', get_lang('Title'), true);
$extraOption = [];
@ -167,6 +203,45 @@ if ($action_todo) {
'Height' => '300',
]
);
$form->addDateRangePicker(
'range',
get_lang('StartTimeWindow'),
true,
['id' => 'range']
);
if ($allowCareers) {
$career = new Career();
$careerList = $career->get_all();
$list = array_column($careerList, 'name', 'id');
$form->addSelect(
'career_id',
get_lang('Career'),
$list,
['onchange' => 'javascript: showCareer();', 'placeholder' => get_lang('SelectAnOption'), 'id' => 'career_id']
);
$display = 'none;';
$options = [];
if (isset($values['promotion_id'])) {
$promotion = new Promotion();
$promotion = $promotion->get($values['promotion_id']);
if ($promotion) {
$options = [$promotion['id'] => $promotion['name']];
$display = 'block';
}
}
$form->addHtml('<div id="promotion" style="display:'.$display.';">');
$form->addSelect(
'promotion_id',
get_lang('Promotion'),
$options,
['id' => 'promotion_id']
);
$form->addHtml('</div>');
}
// Add Picture Announcements
try {

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\SequenceResource;
@ -8,8 +9,6 @@ use Chamilo\CoreBundle\Entity\SequenceResource;
* to the controllers depend on the current action.
*
* @author Christian Fasanando <christian1827@gmail.com> - Beeznest
*
* @package chamilo.auth
*/
// Delete the globals['_cid'], we don't need it here.
$cidReset = true; // Flag forcing the 'current course' reset
@ -49,6 +48,7 @@ $actions = [
'display_sessions',
'subscribe_to_session',
'search_tag',
'search_session_title',
'subscribe_course_validation',
'subscribe_course',
];
@ -281,4 +281,11 @@ switch ($action) {
$courseController->sessionsListByCoursesTag($limit);
break;
case 'search_session_title':
if (!$user_can_view_page) {
api_not_allowed(true);
}
$courseController->sessionsListByName($limit);
break;
}

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Framework\Container;
@ -7,8 +8,6 @@ use Chamilo\CoreBundle\Framework\Container;
* View (MVC patter) for courses categories.
*
* @author Christian Fasanando <christian1827@gmail.com> - Beeznest
*
* @package chamilo.auth
*/
if (isset($_REQUEST['action']) && Security::remove_XSS($_REQUEST['action']) !== 'subscribe') {
$stok = Security::get_token();
@ -22,8 +21,8 @@ $action = in_array($action, $actions) ? $action : 'display_courses';
$showCourses = CoursesAndSessionsCatalog::showCourses();
$showSessions = CoursesAndSessionsCatalog::showSessions();
$pageCurrent = isset($pageCurrent) ? $pageCurrent : isset($_GET['pageCurrent']) ? (int) $_GET['pageCurrent'] : 1;
$pageLength = isset($pageLength) ? $pageLength : isset($_GET['pageLength']) ? (int) $_GET['pageLength'] : CoursesAndSessionsCatalog::PAGE_LENGTH;
$pageCurrent = isset($_GET['pageCurrent']) ? (int) $_GET['pageCurrent'] : 1;
$pageLength = isset($_GET['pageLength']) ? (int) $_GET['pageLength'] : CoursesAndSessionsCatalog::PAGE_LENGTH;
$pageTotal = (int) ceil((int) $countCoursesInCategory / $pageLength);
$cataloguePagination = $pageTotal > 1 ? CourseCategory::getCatalogPagination($pageCurrent, $pageLength, $pageTotal) : '';
$searchTerm = isset($_REQUEST['search_term']) ? Security::remove_XSS($_REQUEST['search_term']) : '';
@ -46,12 +45,7 @@ $code = isset($code) ? $code : null;
url: $(this).attr('data-link'),
success: function(data) {
$("#rating_wrapper_"+id).html(data);
if (data == 'added') {
//$('#vote_label2_' + id).html("{'Saved'|get_lang}");
}
if (data == 'updated') {
//$('#vote_label2_' + id).html("{'Saved'|get_lang}");
}
}
});
});
@ -71,9 +65,10 @@ $code = isset($code) ? $code : null;
</script>
<?php
echo CoursesController::getTabList(1);
echo '<div class="row">
<div class="col-md-12">
<h2 class="title-courses">'.get_lang('Courses catalog').'</h2>
<div class="search-courses">
<div class="row">';
@ -117,19 +112,6 @@ if ($showCourses) {
echo '</div>';
}
if ($showSessions) {
$url = CourseCategory::getCourseCategoryUrl(1, $pageLength, null, 0, 'display_sessions');
echo '<div class="col-md-4">
<div class="return-catalog">
<a class="btn btn-default btn-lg btn-block"
href="'.$url.'">
<em class="fa fa-arrow-right"></em>'.get_lang('Session list').'
</a>
</div>
</div>
';
}
echo '</div></div></div></div>';
if ($showCourses && $action != 'display_sessions') {

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\SequenceResource;
@ -377,6 +378,7 @@ class CoursesController
);
$tpl = new Template();
$tpl->assign('actions', self::getTabList(2));
$tpl->assign('show_courses', CoursesAndSessionsCatalog::showCourses());
$tpl->assign('show_sessions', CoursesAndSessionsCatalog::showSessions());
$tpl->assign('show_tutor', api_get_setting('show_session_coach') === 'true');
@ -395,6 +397,72 @@ class CoursesController
$tpl->display_one_col_template();
}
/**
* Show the Session Catalogue with filtered session by course tags.
*
* @param array $limit Limit info
*/
public function sessionsListByName(array $limit)
{
$keyword = isset($_POST['keyword']) ? $_POST['keyword'] : null;
$hiddenLinks = isset($_GET['hidden_links']) ? (int) $_GET['hidden_links'] == 1 : false;
$courseUrl = CourseCategory::getCourseCategoryUrl(
1,
$limit['length'],
null,
0,
'subscribe'
);
$sessions = CoursesAndSessionsCatalog::getSessionsByName($keyword, $limit);
$sessionsBlocks = $this->getFormattedSessionsBlock($sessions);
$tpl = new Template();
$tpl->assign('actions', self::getTabList(2));
$tpl->assign('show_courses', CoursesAndSessionsCatalog::showCourses());
$tpl->assign('show_sessions', CoursesAndSessionsCatalog::showSessions());
$tpl->assign('show_tutor', api_get_setting('show_session_coach') === 'true' ? true : false);
$tpl->assign('course_url', $courseUrl);
$tpl->assign('already_subscribed_label', $this->getAlreadyRegisteredInSessionLabel());
$tpl->assign('hidden_links', $hiddenLinks);
$tpl->assign('search_token', Security::get_token());
$tpl->assign('keyword', Security::remove_XSS($keyword));
$tpl->assign('sessions', $sessionsBlocks);
$layout = $tpl->get_template('auth/session_catalog.html.twig');
$content = $tpl->fetch($layout);
$tpl->assign('content', $content);
$tpl->display_one_col_template();
}
/**
* @param int $active
*
* @return string
*/
public static function getTabList($active = 1)
{
$pageLength = isset($_GET['pageLength']) ? (int) $_GET['pageLength'] : CoursesAndSessionsCatalog::PAGE_LENGTH;
$url = CourseCategory::getCourseCategoryUrl(1, $pageLength, null, 0, 'display_sessions');
$headers = [];
if (CoursesAndSessionsCatalog::showCourses()) {
$headers[] = [
'url' => api_get_self(),
'content' => get_lang('CourseManagement'),
];
}
if (CoursesAndSessionsCatalog::showSessions()) {
$headers[] = [
'url' => $url,
'content' => get_lang('SessionList'),
];
}
return Display::tabsOnlyLink($headers, $active);
}
/**
* Show the Session Catalogue with filtered session by course tags.
*
@ -404,7 +472,7 @@ class CoursesController
{
$searchTag = isset($_POST['search_tag']) ? $_POST['search_tag'] : null;
$searchDate = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d');
$hiddenLinks = isset($_GET['hidden_links']) ? intval($_GET['hidden_links']) == 1 : false;
$hiddenLinks = isset($_GET['hidden_links']) ? (int) $_GET['hidden_links'] == 1 : false;
$courseUrl = CourseCategory::getCourseCategoryUrl(
1,
$limit['length'],

@ -698,6 +698,23 @@ if ($actions) {
SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'messages');
$allowJustification = api_get_plugin_setting('justification', 'tool_enable') === 'true';
$justification = '';
if ($allowJustification) {
$plugin = Justification::create();
$headers = [
[
'url' => api_get_self(),
'content' => get_lang('Profile'),
],
[
'url' => api_get_path(WEB_CODE_PATH).'auth/justification.php',
'content' => $plugin->get_lang('Justification'),
],
];
$justification = Display::tabsOnlyLink($headers, 1);
}
if ($allowSocialTool) {
SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'home');
$menu = SocialManager::show_social_menu(

@ -17,6 +17,17 @@ $operation = isset($_REQUEST['oper']) ? $_REQUEST['oper'] : false;
$order = isset($_REQUEST['sord']) && in_array($_REQUEST['sord'], ['asc', 'desc']) ? $_REQUEST['sord'] : 'asc';
switch ($action) {
case 'add_student_to_boss':
$studentId = isset($_GET['student_id']) ? (int) $_GET['student_id'] : 0;
$bossId = isset($_GET['boss_id']) ? (int) $_GET['boss_id'] : 0;
if ($studentId && $bossId) {
UserManager::subscribeBossToUsers($bossId, [$studentId], false);
}
echo Statistics::getBossTable($bossId);
exit;
break;
case 'get_user_session':
$list = [];
@ -148,7 +159,6 @@ switch ($action) {
case 'users_students':
// Give a JSON array to the stats page main/admin/statistics/index.php
// for global tools usage (number of clicks)
header('Content-type: application/json');
$list = [];
$palette = ChamiloApi::getColorPalette(true, true);
if ($action == 'tools_usage') {
@ -221,6 +231,367 @@ switch ($action) {
$i++;
}
header('Content-type: application/json');
echo json_encode($list);
break;
case 'users_active':
$list = [];
$palette = ChamiloApi::getColorPalette(true, true);
$statsName = 'NumberOfUsers';
$filter = $_REQUEST['filter'];
$startDate = $_REQUEST['date_start'];
$endDate = $_REQUEST['date_end'];
$extraConditions = '';
if (!empty($startDate) && !empty($endDate)) {
$extraConditions .= " AND registration_date BETWEEN '$startDate' AND '$endDate' ";
}
switch ($filter) {
case 'active':
$conditions = ['active' => 1];
$active = UserManager::getUserListExtraConditions(
$conditions,
[],
false,
false,
null,
$extraConditions,
true
);
$conditions = ['active' => 0];
$noActive = UserManager::getUserListExtraConditions(
$conditions,
[],
false,
false,
null,
$extraConditions,
true
);
$all = [
get_lang('Active') => $active,
get_lang('Inactive') => $noActive,
];
break;
case 'status':
$statusList = api_get_status_langvars();
unset($statusList[ANONYMOUS]);
foreach ($statusList as $status => $name) {
$conditions = ['status' => $status];
$count = UserManager::getUserListExtraConditions(
$conditions,
[],
false,
false,
null,
$extraConditions,
true
);
$all[$name] = $count;
}
break;
case 'language':
$languages = api_get_languages();
$all = [];
foreach ($languages['folder'] as $language) {
$conditions = ['language' => $language];
$key = $language;
if (substr($language, -1) === '2') {
$key = str_replace(2, '', $language);
}
if (!isset($all[$key])) {
$all[$key] = 0;
}
$all[$key] += UserManager::getUserListExtraConditions(
$conditions,
[],
false,
false,
null,
$extraConditions,
true
);
}
break;
case 'language_cible':
$extraFieldValueUser = new ExtraField('user');
$extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('langue_cible');
$users = UserManager::getUserListExtraConditions(
[],
[],
false,
false,
null,
$extraConditions,
false
);
$userIdList = array_column($users, 'user_id');
$userIdListToString = implode("', '", $userIdList);
$all = [];
$total = count($users);
$usersFound = 0;
foreach ($extraField['options'] as $item) {
$value = Database::escape_string($item['option_value']);
$count = 0;
$sql = "SELECT count(id) count
FROM $extraFieldValueUser->table_field_values
WHERE
value = '$value' AND
item_id IN ('$userIdListToString') AND
field_id = ".$extraField['id'];
$query = Database::query($sql);
$result = Database::fetch_array($query);
$count = $result['count'];
//$item['display_text'] = str_replace('2', '', $item['display_text']);
$usersFound += $count;
$all[$item['display_text']] = $count;
}
$all[get_lang('N/A')] = $total - $usersFound;
break;
case 'career':
$extraFieldValueUser = new ExtraField('user');
$extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('filiere_user');
$all = [];
$users = UserManager::getUserListExtraConditions(
[],
[],
false,
false,
null,
$extraConditions,
false
);
$userIdList = array_column($users, 'user_id');
$userIdListToString = implode("', '", $userIdList);
$usersFound = 0;
$total = count($users);
foreach ($extraField['options'] as $item) {
$value = Database::escape_string($item['option_value']);
$count = 0;
$sql = "SELECT count(id) count
FROM $extraFieldValueUser->table_field_values
WHERE
value = '$value' AND
item_id IN ('$userIdListToString') AND
field_id = ".$extraField['id'];
$query = Database::query($sql);
$result = Database::fetch_array($query);
$count = $result['count'];
$all[$item['display_text']] = $count;
$usersFound += $count;
}
$all[get_lang('N/A')] = $total - $usersFound;
break;
case 'contract':
$extraFieldValueUser = new ExtraField('user');
$extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('termactivated');
$users = UserManager::getUserListExtraConditions(
[],
[],
false,
false,
null,
$extraConditions,
false
);
$userIdList = array_column($users, 'user_id');
$userIdListToString = implode("', '", $userIdList);
$all = [];
$total = count($users);
$sql = "SELECT count(id) count
FROM $extraFieldValueUser->table_field_values
WHERE
value = 1 AND
item_id IN ('$userIdListToString') AND
field_id = ".$extraField['id'];
$query = Database::query($sql);
$result = Database::fetch_array($query);
$count = $result['count'];
$all[get_lang('Yes')] = $count;
$all[get_lang('No')] = $total - $count;
break;
case 'certificate':
$extraFieldValueUser = new ExtraField('user');
$extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('langue_cible');
$users = UserManager::getUserListExtraConditions(
[],
[],
false,
false,
null,
$extraConditions,
false
);
$total = count($users);
$userIdList = array_column($users, 'user_id');
$certificateCount = 0;
foreach ($userIdList as $userId) {
$certificate = GradebookUtils::get_certificate_by_user_id(
0,
$userId
);
if (!empty($certificate)) {
$certificateCount++;
}
}
$all[get_lang('Yes')] = $certificateCount;
$all[get_lang('No')] = $total - $certificateCount;
break;
}
foreach ($all as $tick => $tock) {
$list['labels'][] = $tick;
}
$list['datasets'][0]['label'] = get_lang($statsName);
$list['datasets'][0]['borderColor'] = 'rgba(255,255,255,1)';
$i = 0;
foreach ($all as $tick => $tock) {
$j = $i % count($palette);
$list['datasets'][0]['data'][] = $tock;
$list['datasets'][0]['backgroundColor'][] = $palette[$j];
$i++;
}
header('Content-type: application/json');
echo json_encode($list);
break;
case 'session_by_date':
$list = [];
$palette = ChamiloApi::getColorPalette(true, true);
$statsName = 'NumberOfUsers';
$filter = $_REQUEST['filter'];
$startDate = Database::escape_string($_REQUEST['date_start']);
$endDate = Database::escape_string($_REQUEST['date_end']);
$statusId = (int) $_REQUEST['status'];
/*$extraConditions = '';
if (!empty($startDate) && !empty($endDate)) {
$extraConditions .= " AND registration_date BETWEEN '$startDate' AND '$endDate' ";
}*/
$table = Database::get_main_table(TABLE_MAIN_SESSION);
$statusCondition = '';
if (!empty($statusId)) {
$statusCondition .= " AND status = $statusId ";
}
switch ($filter) {
case 'category':
$sql = "SELECT count(id) count, session_category_id FROM $table
WHERE
(display_start_date BETWEEN '$startDate' AND '$endDate' OR
display_end_date BETWEEN '$startDate' AND '$endDate')
$statusCondition
GROUP BY session_category_id
";
$result = Database::query($sql);
$all = [];
while ($row = Database::fetch_array($result)) {
$categoryData = SessionManager::get_session_category($row['session_category_id']);
$label = get_lang('NoCategory');
if ($categoryData) {
$label = $categoryData['name'];
}
$all[$label] = $row['count'];
}
break;
case 'status':
$sessionStatusAllowed = api_get_configuration_value('allow_session_status');
if (!$sessionStatusAllowed) {
exit;
}
$sql = "SELECT count(id) count, status FROM $table
WHERE
(
display_start_date BETWEEN '$startDate' AND '$endDate' OR
display_end_date BETWEEN '$startDate' AND '$endDate'
)
$statusCondition
GROUP BY status
";
$result = Database::query($sql);
$all = [];
while ($row = Database::fetch_array($result)) {
$row['status'] = SessionManager::getStatusLabel($row['status']);
$all[$row['status']] = $row['count'];
}
break;
case 'language':
$sql = "SELECT id FROM $table
WHERE
(display_start_date BETWEEN '$startDate' AND '$endDate' OR
display_end_date BETWEEN '$startDate' AND '$endDate')
$statusCondition
";
$result = Database::query($sql);
$all = [];
while ($row = Database::fetch_array($result)) {
$courses = SessionManager::getCoursesInSession($row['id']);
$language = get_lang('Nothing');
if (!empty($courses)) {
$courseId = $courses[0];
$courseInfo = api_get_course_info_by_id($courseId);
$language = $courseInfo['language'];
$language = str_replace('2', '', $language);
}
if (!isset($all[$language])) {
$all[$language] = 0;
}
$all[$language] += 1;
}
break;
}
foreach ($all as $tick => $tock) {
$list['labels'][] = $tick;
}
$list['datasets'][0]['label'] = get_lang($statsName);
$list['datasets'][0]['borderColor'] = 'rgba(255,255,255,1)';
$i = 0;
foreach ($all as $tick => $tock) {
$j = $i % count($palette);
$list['datasets'][0]['data'][] = $tock;
$list['datasets'][0]['backgroundColor'][] = $palette[$j];
$i++;
}
header('Content-type: application/json');
echo json_encode($list);
break;
}

@ -252,6 +252,8 @@ switch ($action) {
case 'user_by_role':
api_block_anonymous_users(false);
$status = isset($_REQUEST['status']) ? (int) $_REQUEST['status'] : DRH;
$criteria = new Criteria();
$criteria
->where(
@ -262,7 +264,7 @@ switch ($action) {
)
)
->andWhere(
Criteria::expr()->eq('status', DRH)
Criteria::expr()->eq('status', $status)
);
$users = UserManager::getRepository()->matching($criteria);

@ -293,7 +293,6 @@ class CoursesAndSessionsCatalog
public static function getCoursesInCategory($category_code, $random_value = null, $limit = [])
{
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tblCourseCategory = Database::get_main_table(TABLE_MAIN_CATEGORY);
$avoidCoursesCondition = self::getAvoidCourseCondition();
$visibilityCondition = CourseManager::getCourseVisibilitySQLCondition('course', true);
@ -604,12 +603,12 @@ class CoursesAndSessionsCatalog
(
s.accessStartDate IS NOT NULL AND
s.accessEndDate IS NOT NULL AND
s.accessStartDate >= '$date' AND s.accessEndDate <= '$date')
s.accessStartDate <= '$date' AND s.accessEndDate >= '$date')
OR
(
s.accessStartDate IS NULL AND
s.accessEndDate IS NOT NULL AND
s.accessStartDate >= '$date'
s.accessEndDate >= '$date'
)
)
";
@ -690,10 +689,66 @@ class CoursesAndSessionsCatalog
$qb->expr()->eq('f.extraFieldType', ExtraField::COURSE_FIELD_TYPE)
)->andWhere(
$qb->expr()->eq('url.accessUrlId', $urlId)
/*)->andWhere(
's.name LIKE :name'
)*/
)
->setFirstResult($limit['start'])
->setMaxResults($limit['length'])
->setParameter('tag', "$termTag%")
//->setParameter('name', "%$termTag%")
->getQuery()
->getResult();
$sessionsToBrowse = [];
foreach ($sessions as $session) {
if ($session->getNbrCourses() === 0) {
continue;
}
$sessionsToBrowse[] = $session;
}
return $sessionsToBrowse;
}
/**
* Search sessions by the title
*
* @param string $keyword
* @param array $limit Limit info
*
* @return array The sessions
*/
public static function getSessionsByName($keyword, array $limit)
{
$em = Database::getManager();
$qb = $em->createQueryBuilder();
$urlId = api_get_current_access_url_id();
$sessions = $qb->select('s')
->distinct()
->from('ChamiloCoreBundle:Session', 's')
->innerJoin(
'ChamiloCoreBundle:SessionRelCourse',
'src',
Join::WITH,
's.id = src.session'
)
->innerJoin(
'ChamiloCoreBundle:AccessUrlRelSession',
'url',
Join::WITH,
'url.sessionId = s.id'
)
->andWhere(
$qb->expr()->eq('url.accessUrlId', $urlId)
)->andWhere(
's.name LIKE :keyword'
)
->setFirstResult($limit['start'])
->setMaxResults($limit['length'])
->setParameter('keyword', "%$keyword%")
->getQuery()
->getResult();

@ -720,6 +720,8 @@ class Certificate extends Model
$totalTimeInLearningPaths = 0;
$sessionsApproved = [];
$coursesApproved = [];
$courseList = [];
if ($sessions) {
foreach ($sessions as $session) {
$allCoursesApproved = [];
@ -744,19 +746,29 @@ class Certificate extends Model
true
);
// Find time spent in LP
$timeSpent = Tracking::get_time_spent_in_lp(
$this->user_id,
$courseCode,
[],
$session['session_id']
);
if (!isset($courseList[$course['real_id']])) {
$courseList[$course['real_id']]['approved'] = false;
$courseList[$course['real_id']]['time_spent'] = 0;
}
if ($result) {
$courseList[$course['real_id']]['approved'] = true;
$coursesApproved[$course['real_id']] = $courseInfo['title'];
// Find time spent in LP
$totalTimeInLearningPaths += Tracking::get_time_spent_in_lp(
$this->user_id,
$courseCode,
[],
$session['session_id']
);
//$totalTimeInLearningPaths += $timeSpent;
$allCoursesApproved[] = true;
}
$courseList[$course['real_id']]['time_spent'] += $timeSpent;
}
}
@ -766,6 +778,13 @@ class Certificate extends Model
}
}
$totalTimeInLearningPaths = 0;
foreach ($courseList as $courseId => $courseData) {
if ($courseData['approved'] === true) {
$totalTimeInLearningPaths += $courseData['time_spent'];
}
}
$skill = new Skill();
// Ofaj
$skills = $skill->getStudentSkills($this->user_id, 2);
@ -795,7 +814,9 @@ class Certificate extends Model
null,
null,
false,
false
false,
false,
'd-m-Y'
)
);
$tplContent->assign(
@ -805,7 +826,9 @@ class Certificate extends Model
null,
null,
false,
false
false,
false,
'd-m-Y'
)
);
$tplContent->assign('skills', $skills);
@ -813,6 +836,7 @@ class Certificate extends Model
$tplContent->assign('courses', $coursesApproved);
$tplContent->assign('time_spent_in_lps', api_time_to_hms($totalTimeInLearningPaths));
$tplContent->assign('time_spent_in_lps_in_hours', round($totalTimeInLearningPaths / 3600, 1));
$layoutContent = $tplContent->get_template('gradebook/custom_certificate.tpl');
$content = $tplContent->fetch($layoutContent);

@ -377,6 +377,8 @@ class SystemAnnouncementManager
* @param int $send_mail Whether to send an e-mail to all users (1) or not (0)
* @param bool $add_to_calendar
* @param bool $sendEmailTest
* @param int $careerId
* @param int $promotionId
*
* @return mixed insert_id on success, false on failure
*/
@ -389,7 +391,9 @@ class SystemAnnouncementManager
$lang = '',
$send_mail = 0,
$add_to_calendar = false,
$sendEmailTest = false
$sendEmailTest = false,
$careerId = 0,
$promotionId = 0
) {
$original_content = $content;
$a_dateS = explode(' ', $date_start);
@ -464,6 +468,11 @@ class SystemAnnouncementManager
'access_url_id' => $current_access_url_id,
];
if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) {
$params['career_id'] = (int) $careerId;
$params['promotion_id'] = (int) $promotionId;
}
foreach ($visibility as $key => $value) {
$params[$key] = $value;
}
@ -473,19 +482,15 @@ class SystemAnnouncementManager
if ($resultId) {
if ($sendEmailTest) {
self::send_system_announcement_by_email(
$title,
$content,
$resultId,
$visibility,
$lang,
true
);
} else {
if ($send_mail == 1) {
self::send_system_announcement_by_email(
$title,
$content,
$visibility,
$lang
$resultId,
$visibility
);
}
}
@ -582,6 +587,8 @@ class SystemAnnouncementManager
* @param array $lang
* @param int $send_mail
* @param bool $sendEmailTest
* @param int $careerId
* @param int $promotionId
*
* @return bool True on success, false on failure
*/
@ -594,7 +601,9 @@ class SystemAnnouncementManager
$visibility,
$lang = null,
$send_mail = 0,
$sendEmailTest = false
$sendEmailTest = false,
$careerId = 0,
$promotionId = 0
) {
$em = Database::getManager();
$announcement = $em->find('ChamiloCoreBundle:SysAnnouncement', $id);
@ -653,26 +662,6 @@ class SystemAnnouncementManager
$content
);
if ($sendEmailTest) {
self::send_system_announcement_by_email(
$title,
$content,
null,
null,
$lang,
$sendEmailTest
);
} else {
if ($send_mail == 1) {
self::send_system_announcement_by_email(
$title,
$content,
$visibility,
$lang
);
}
}
$dateStart = new DateTime($start, new DateTimeZone('UTC'));
$dateEnd = new DateTime($end, new DateTimeZone('UTC'));
@ -690,12 +679,40 @@ class SystemAnnouncementManager
// Update visibility
$list = self::getVisibilityList();
$table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
if (api_get_configuration_value('allow_careers_in_global_announcements') && !empty($careerId)) {
$params = [];
$params['career_id'] = (int) $careerId;
$params['promotion_id'] = (int) $promotionId;
Database::update(
$table,
$params,
['id = ? ' => $id]
);
}
foreach ($list as $key => $title) {
$value = isset($visibility[$key]) && $visibility[$key] ? 1 : 0;
$sql = "UPDATE $table SET $key = '$value' WHERE id = $id";
Database::query($sql);
}
if ($sendEmailTest) {
self::send_system_announcement_by_email(
$id,
$visibility,
true
);
} else {
if ($send_mail == 1) {
self::send_system_announcement_by_email(
$id,
$visibility
);
}
}
return true;
}
@ -709,7 +726,7 @@ class SystemAnnouncementManager
public static function delete_announcement($id)
{
$table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
$id = intval($id);
$id = (int) $id;
$sql = "DELETE FROM $table WHERE id =".$id;
$res = Database::query($sql);
if ($res === false) {
@ -730,7 +747,7 @@ class SystemAnnouncementManager
public static function get_announcement($id)
{
$table = Database::get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
$id = intval($id);
$id = (int) $id;
$sql = "SELECT * FROM ".$table." WHERE id = ".$id;
$announcement = Database::fetch_object(Database::query($sql));
@ -772,22 +789,28 @@ class SystemAnnouncementManager
/**
* Send a system announcement by e-mail to all teachers/students depending on parameters.
*
* @param string $title
* @param string $content
* @param array $visibility
* @param string $language Language (optional, considered for all languages if left empty)
* @param bool $sendEmailTest
* @param int $id
* @param array $visibility
* @param bool $sendEmailTest
*
* @return bool True if the message was sent or there was no destination matching.
* False on database or e-mail sending error.
*/
public static function send_system_announcement_by_email(
$title,
$content,
$id,
$visibility,
$language = null,
$sendEmailTest = false
) {
$announcement = self::get_announcement($id);
if (empty($announcement)) {
return false;
}
$title = $announcement->title;
$content = $announcement->content;
$language = $announcement->lang;
$content = str_replace(['\r\n', '\n', '\r'], '', $content);
$now = api_get_utc_datetime();
$teacher = $visibility['visible_teacher'];
@ -838,6 +861,29 @@ class SystemAnnouncementManager
// Expiration date
$sql .= " AND (expiration_date = '' OR expiration_date IS NULL OR expiration_date > '$now') ";
// @todo check if other filters will apply for the career/promotion option.
if (isset($announcement->career_id) && !empty($announcement->career_id)) {
$promotion = new Promotion();
$promotionList = $promotion->get_all_promotions_by_career_id($announcement->career_id);
if (isset($announcement->promotion_id) && !empty($announcement->promotion_id)) {
$promotionList = [];
$promotionList[] = $promotion->get($announcement->promotion_id);
}
if (!empty($promotionList)) {
foreach ($promotionList as $promotion) {
$sessionList = SessionManager::get_all_sessions_by_promotion($promotion['id']);
foreach ($sessionList as $session) {
$users = SessionManager::get_users_by_session($session['id'], 0);
foreach ($users as $user) {
MessageManager::send_message_simple($user['user_id'], $title, $content);
}
}
}
}
return true;
}
if ((empty($teacher) || $teacher == '0') && (empty($student) || $student == '0')) {
return true;
}
@ -869,6 +915,8 @@ class SystemAnnouncementManager
*
* @param string $visible see self::VISIBLE_* constants
* @param int $id The identifier of the announcement to display
*
* @return string
*/
public static function getAnnouncements($visible, $id = null): array
{

@ -186,6 +186,7 @@ class Tracking
// Extend all button
$output = '';
$extra = '<script>
$(function() {
$( "#dialog:ui-dialog" ).dialog( "destroy" );
@ -503,8 +504,8 @@ class Tracking
$extend_attempt_link .= '&nbsp;'.
Display::url(
Display::return_icon('pdf.png', get_lang('Export to PDF')),
api_get_self(
).'?action=export_stats&extend_id='.$my_item_id.'&extend_attempt_id='.$row['iv_id'].$url_suffix
api_get_self().'?action=export_stats&extend_id='.$my_item_id.'&extend_attempt_id='.$row['iv_id'].$url_suffix,
['class' => 'export']
);
}
} else { // Same case if fold_attempt_id is set, so not implemented explicitly.
@ -517,8 +518,8 @@ class Tracking
$extend_attempt_link .= '&nbsp;'.
Display::url(
Display::return_icon('pdf.png', get_lang('Export to PDF')),
api_get_self(
).'?action=export_stats&extend_id='.$my_item_id.'&extend_attempt_id='.$row['iv_id'].$url_suffix
api_get_self().'?action=export_stats&extend_id='.$my_item_id.'&extend_attempt_id='.$row['iv_id'].$url_suffix,
['class' => 'export']
);
}
}
@ -2781,11 +2782,11 @@ class Tracking
if ($get_only_latest_attempt_results || $getOnlyBestAttempt) {
// Getting lp_items done by the user
$sql = "SELECT DISTINCT lp_item_id
FROM $lp_item_view_table
WHERE
c_id = $course_id AND
lp_view_id = $lp_view_id
ORDER BY lp_item_id";
FROM $lp_item_view_table
WHERE
c_id = $course_id AND
lp_view_id = $lp_view_id
ORDER BY lp_item_id";
$res_lp_item = Database::query($sql);
while ($row_lp_item = Database::fetch_array($res_lp_item, 'ASSOC')) {
@ -2999,11 +3000,11 @@ class Tracking
foreach ($lp_list as $lp_id) {
// Check if LP have a score we assume that all SCO have an score
$sql = "SELECT count(id) as count
FROM $lp_item_table
WHERE
c_id = $course_id AND
(item_type = 'quiz' OR item_type = 'sco') AND
lp_id = ".$lp_id;
FROM $lp_item_table
WHERE
c_id = $course_id AND
(item_type = 'quiz' OR item_type = 'sco') AND
lp_id = ".$lp_id;
$result_have_quiz = Database::query($sql);
if (Database::num_rows($result_have_quiz) > 0) {
$row = Database::fetch_array($result_have_quiz, 'ASSOC');

@ -247,6 +247,9 @@ function generateLPFinalItemTemplateBadgeLinks($userId, $courseId, $sessionId =
if ($userSkills) {
foreach ($userSkills as $userSkill) {
$skill = $em->find('ChamiloCoreBundle:Skill', $userSkill['skill_id']);
if (!$skill) {
continue;
}
$skillList .= "
<div class='row'>
<div class='col-md-2 col-xs-4'>
@ -270,14 +273,17 @@ function generateLPFinalItemTemplateBadgeLinks($userId, $courseId, $sessionId =
</div>
";
}
$badgeLink .= "
<div class='panel panel-default'>
<div class='panel-body'>
<h3 class='text-center'>".get_lang('Additionally, you have achieved the following skills')."</h3>
$skillList
</div>
</div>
";
if (!empty($skillList)) {
$badgeLink .= "
<div class='panel panel-default'>
<div class='panel-body'>
<h3 class='text-center'>".get_lang('Additionally, you have achieved the following skills')."</h3>
$skillList
</div>
</div>
";
}
}
return $badgeLink;

@ -549,13 +549,15 @@ if ($survey_data['form_fields'] != '' &&
$form->setDefaults($user_data);
}
$htmlHeadXtra[] = '<script>'.api_get_language_translate_html().'</script>';
Display::display_header(get_lang('Surveys'));
// Displaying the survey title and subtitle (appears on every page)
echo '<div class="survey-block">';
echo '<div class="page-header">';
echo '<h2>';
echo strip_tags($survey_data['survey_title']).'</h2></div>';
echo strip_tags($survey_data['survey_title'], '<span>').'</h2></div>';
if (!empty($survey_data['survey_subtitle'])) {
echo '<div class="survey_subtitle"><p>'.strip_tags($survey_data['survey_subtitle']).'</p></div>';
}

@ -44,9 +44,11 @@ $interbreadcrumb[] = [
];
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'survey/survey.php?survey_id='.$surveyId.'&'.api_get_cidreq(),
'name' => strip_tags($survey_data['title']),
'name' => strip_tags($survey_data['title'], '<span>'),
];
$htmlHeadXtra[] = '<script>'.api_get_language_translate_html().'</script>';
$show = 0;
Display::display_header(get_lang('Survey preview'));

@ -17,6 +17,8 @@ $(function() {
});
} ); </script>';
$htmlHeadXtra[] = '<script>'.api_get_language_translate_html().'</script>';
/** @todo this has to be moved to a more appropriate place (after the display_header of the code)*/
if (!api_is_allowed_to_edit(false, true)) {
api_not_allowed(true);

@ -63,7 +63,7 @@ if (!empty($_GET['survey_id'])) {
api_not_allowed(true);
}
$tool_name = strip_tags($survey_data['title']);
$tool_name = strip_tags($survey_data['title'], '<span>');
$is_survey_type_1 = $survey_data['survey_type'] == 1;
if (api_strlen(strip_tags($survey_data['title'])) > 40) {
@ -95,6 +95,8 @@ if ($is_survey_type_1 && ($action == 'addgroup' || $action == 'deletegroup')) {
exit;
}
$htmlHeadXtra[] = '<script>'.api_get_language_translate_html().'</script>';
// Displaying the header
Display::display_header($tool_name, 'Survey');
@ -313,6 +315,7 @@ while ($row = Database::fetch_array($result, 'ASSOC')) {
}
echo '</tr>';
}
echo '</table>';
if ($is_survey_type_1) {

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CourseBundle\Entity\CSurvey;

@ -44,6 +44,8 @@ $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
$courseInfo
);
$htmlHeadXtra[] = '<script>'.api_get_language_translate_html().'</script>';
if ($isDrhOfCourse) {
Display::display_header(get_lang('Survey list'));
// Tool introduction

@ -56,8 +56,20 @@ class Survey extends Basic
['Table', '-', 'CreateDiv'],
['BulletedList', 'NumberedList', 'HorizontalRule', '-', 'Outdent', 'Indent', 'Blockquote'],
['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript', '-', 'TextColor', 'BGColor'],
['true' == api_get_setting('allow_spellcheck') ? 'Scayt' : ''],
[
'Bold',
'Italic',
'Underline',
'Strike',
'-',
'Subscript',
'Superscript',
'-',
'TextColor',
'BGColor',
api_get_configuration_value('translate_html') ? 'Language' : '',
],
[api_get_setting('allow_spellcheck') == 'true' ? 'Scayt' : ''],
['Styles', 'Format', 'Font', 'FontSize'],
['PageBreak', 'ShowBlocks', 'Source'],
['Toolbarswitch'],
@ -96,7 +108,17 @@ class Survey extends Basic
['Link', 'Image', 'Video', 'Flash', 'Audio', 'Table', 'Asciimath', 'Asciisvg'],
['BulletedList', 'NumberedList', 'HorizontalRule'],
['JustifyLeft', 'JustifyCenter', 'JustifyRight'],
['Format', 'FontSize', 'Bold', 'Italic', 'Underline', 'TextColor', 'BGColor', 'Source'],
[
'Format',
'FontSize',
'Bold',
'Italic',
'Underline',
'TextColor',
'BGColor',
api_get_configuration_value('translate_html') ? 'Language' : '',
'Source'
],
['Toolbarswitch'],
];
}

@ -9,4 +9,102 @@ namespace Chamilo\CoreBundle\Component\Editor\CkEditor\Toolbar;
*/
class SurveyQuestion extends Basic
{
/**
* Get the toolbar config.
*
* @return array
*/
public function getConfig()
{
if (api_get_setting('more_buttons_maximized_mode') != 'true') {
$config['toolbar'] = $this->getNormalToolbar();
} else {
$config['toolbar_minToolbar'] = $this->getMinimizedToolbar();
$config['toolbar_maxToolbar'] = $this->getMaximizedToolbar();
}
return $config;
}
/**
* Get the toolbar configuration when CKEditor is maximized.
*
* @return array
*/
protected function getMaximizedToolbar()
{
return [
$this->getNewPageBlock(),
['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', 'inserthtml'],
['Undo', 'Redo', '-', 'SelectAll', 'Find', '-', 'RemoveFormat'],
['Link', 'Unlink', 'Anchor', 'Glossary'],
[
'Image',
'Mapping',
'Video',
'Oembed',
'Flash',
'Youtube',
'Audio',
'leaflet',
'Smiley',
'SpecialChar',
'Asciimath',
'Asciisvg',
],
'/',
['Table', '-', 'CreateDiv'],
['BulletedList', 'NumberedList', 'HorizontalRule', '-', 'Outdent', 'Indent', 'Blockquote'],
['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
[
'Bold',
'Italic',
'Underline',
'Strike',
'-',
'Subscript',
'Superscript',
'-',
'TextColor',
'BGColor',
api_get_configuration_value('translate_html') ? 'Language' : '',
],
[api_get_setting('allow_spellcheck') == 'true' ? 'Scayt' : ''],
['Styles', 'Format', 'Font', 'FontSize'],
['PageBreak', 'ShowBlocks'],
api_get_setting('enabled_wiris') == 'true' ? ['ckeditor_wiris_formulaEditor', 'ckeditor_wiris_CAS'] : [''],
['Toolbarswitch', 'Source'],
];
}
/**
* Get the toolbar configuration when CKEditor is minimized.
*
* @return array
*/
protected function getMinimizedToolbar()
{
return [
$this->getNewPageBlock(),
['Undo', 'Redo'],
['Link', 'Image', 'Video', 'Oembed', 'Flash', 'Youtube', 'Audio', 'Table', 'Asciimath', 'Asciisvg'],
['BulletedList', 'NumberedList', 'HorizontalRule'],
['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
[
'Styles',
'Format',
'Font',
'FontSize',
'Bold',
'Italic',
'Underline',
'TextColor',
'BGColor',
api_get_configuration_value('translate_html') ? 'Language' : '',
],
api_get_setting('enabled_wiris') == 'true' ? ['ckeditor_wiris_formulaEditor', 'ckeditor_wiris_CAS'] : [''],
['Toolbarswitch', 'Source'],
];
}
}

Loading…
Cancel
Save