From adbe2bbbf0097cbdf6ca3a498eae0244e82ddbb8 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 10:42:36 +0200 Subject: [PATCH 01/12] Fix exercise question UI BT#17381 --- ...MultipleAnswerTrueFalseDegreeCertainty.php | 37 +++++++++---------- .../exercise/global_multiple_answer.class.php | 29 +++++---------- .../multiple_answer_true_false.class.php | 10 ++--- 3 files changed, 33 insertions(+), 43 deletions(-) diff --git a/main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php b/main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php index fdb97575e1..8bfac2c249 100644 --- a/main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php +++ b/main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php @@ -65,22 +65,21 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question $renderer = &$form->defaultRenderer(); $defaults = []; - $html = ''; + $form->addHeader(get_lang('Answers')); + $html = '
' - .get_lang('Number') - .'' - .get_lang('True') - .'' - .get_lang('False') - .'' - .get_lang('Answer') - .'
+ + + + + '; // show column comment when feedback is enable if ($objEx->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) { - $html .= ''; + $html .= ''; } $html .= ''; - $form->addElement('label', get_lang('Answers').'
', $html); + + $form->addHtml($html); $correct = 0; $answer = null; @@ -831,17 +830,17 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question $colWidth = $widthTable / 5; $html .= ' - - - @@ -1147,8 +1146,8 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question $tblAnswerOption = Database::get_course_table(TABLE_QUIZ_QUESTION_OPTION); $courseId = api_get_course_int_id(); $optionId = (int) $optionId; - $sql = "SELECT position - FROM $tblAnswerOption + $sql = "SELECT position + FROM $tblAnswerOption WHERE c_id = $courseId AND id = $optionId"; $res = Database::query($sql); @@ -1232,7 +1231,7 @@ class MultipleAnswerTrueFalseDegreeCertainty extends Question $tableTrackEExercise = Database::get_main_table(TABLE_STATISTIC_TRACK_E_EXERCISES); $exeId = (int) $exeId; - $sql = "SELECT exe_exo_id + $sql = "SELECT exe_exo_id FROM $tableTrackEExercise WHERE exe_id=".$exeId; $res = Database::query($sql); diff --git a/main/exercise/global_multiple_answer.class.php b/main/exercise/global_multiple_answer.class.php index 32ec89422b..aa3191cd8e 100755 --- a/main/exercise/global_multiple_answer.class.php +++ b/main/exercise/global_multiple_answer.class.php @@ -32,27 +32,18 @@ class GlobalMultipleAnswer extends Question $obj_ex = Session::read('objExercise'); + $form->addHeader(get_lang('Answers')); /* Mise en variable de Affichage "Reponses" et son icone, "N�", "Vrai", "Reponse" */ - $html = '
'.get_lang('Number').''.get_lang('True').''.get_lang('False').''.get_lang('Answer').''.get_lang('Comment').''.get_lang('Comment').'
'. sprintf(get_lang('IncorrectAnswersX'), $nbResponsesInc).' '. sprintf(get_lang('IgnoranceAnswersX'), $nbResponsesIng).' '. sprintf(get_lang('CorrectAnswersX'), $nbResponsesCor).'
+ $html = '
- - - '; - - $html .= ''; - $html .= ''; - $form->addElement( - 'label', - get_lang('Answers'). - '
'.Display::return_icon('fill_field.png'), - $html - ); + + + + + + '; + $form->addHtml($html); + $defaults = []; $correct = 0; $answer = false; diff --git a/main/exercise/multiple_answer_true_false.class.php b/main/exercise/multiple_answer_true_false.class.php index a807a5a932..72ed7d1533 100755 --- a/main/exercise/multiple_answer_true_false.class.php +++ b/main/exercise/multiple_answer_true_false.class.php @@ -45,14 +45,14 @@ class MultipleAnswerTrueFalse extends Question $html = '
- '.get_lang('Number').' - - '.get_lang('True').' - - '.get_lang('Answer').' - '.get_lang('Comment').'
'.get_lang('Number').''.get_lang('True').''.get_lang('Answer').''.get_lang('Comment').'
'; $html .= ''; $html .= ''; - $html .= ''; - $html .= ''; - $html .= ''; - $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; // show column comment when feedback is enable if ($obj_ex->getFeedbackType() != EXERCISE_FEEDBACK_TYPE_EXAM) { - $html .= ''; + $html .= ''; } $html .= ''; From 6551899c33acf253825d44d6d5272007df5cf9ff Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 10:47:31 +0200 Subject: [PATCH 02/12] Add Oembed button BT#17381 --- .../Component/Editor/CkEditor/Toolbar/Documents.php | 4 ++-- .../Editor/CkEditor/Toolbar/TestQuestionDescription.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/Documents.php b/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/Documents.php index ca83011fd2..80e1cccd01 100644 --- a/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/Documents.php +++ b/src/Chamilo/CoreBundle/Component/Editor/CkEditor/Toolbar/Documents.php @@ -1,12 +1,11 @@ getPluginsToString(); - if (api_get_setting('more_buttons_maximized_mode') != 'true') { + if (api_get_setting('more_buttons_maximized_mode') !== 'true') { $config['toolbar'] = $this->getNormalToolbar(); } else { $config['toolbar_minToolbar'] = $this->getMinimizedToolbar(); From e10aa9728395c4b19e4f2772dceac17536bbee42 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 11:22:20 +0200 Subject: [PATCH 03/12] Add url in work notification BT#17375 --- main/work/work.lib.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/main/work/work.lib.php b/main/work/work.lib.php index e9d79267d9..3778ca239e 100755 --- a/main/work/work.lib.php +++ b/main/work/work.lib.php @@ -3821,6 +3821,9 @@ function sendAlertToUsers($workInfo, $workId, $courseInfo, $sessionId = 0) } if ($send) { + $folderUrl = api_get_path(WEB_CODE_PATH)."work/work_list_all.php?cidReq=".$courseInfo['code']."&id_session=".$sessionId."&id=".$workInfo['id']; + $fileUrl = api_get_path(WEB_CODE_PATH)."work/view.php?cidReq=".$courseInfo['code']."&id_session=".$sessionId."&id=".$workData['id']; + foreach ($userList as $userData) { $userId = $userData['user_id']; $userInfo = api_get_user_info($userId); @@ -3837,10 +3840,9 @@ function sendAlertToUsers($workInfo, $workId, $courseInfo, $sessionId = 0) $subject = "[".api_get_setting('siteName')."] ".$userPostedADocument; $message = $userPostedADocument."
"; $message .= get_lang('DateSent')." : ".api_format_date(api_get_local_time())."
"; - $message .= get_lang('AssignmentName')." : ".$workInfo['title']."
"; + $message .= get_lang('AssignmentName')." : ".Display::url($workInfo['title'], $folderUrl)."
"; $message .= get_lang('Filename')." : ".$workData['title']."
"; - $url = api_get_path(WEB_CODE_PATH)."work/view.php?cidReq=".$courseInfo['code']."&id_session=".$sessionId."&id=".$workData['id']; - $message .= ''.get_lang('DownloadLink')."
"; + $message .= ''.get_lang('DownloadLink')."
"; MessageManager::send_message_simple( $userId, From 6aa638620079febf5e4f9b2540916abf40a66c5b Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 11:52:42 +0200 Subject: [PATCH 04/12] WIP: Add $.when(saveAjax).done in SCORM + remove unused code --- main/lp/scorm_api.php | 125 ++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 72 deletions(-) diff --git a/main/lp/scorm_api.php b/main/lp/scorm_api.php index e3e1042639..8c5385e2b6 100755 --- a/main/lp/scorm_api.php +++ b/main/lp/scorm_api.php @@ -893,10 +893,6 @@ function savedata(item_id) { item_to_save = old_item_id; } - // Original behaviour - // xajax_save_item_scorm(olms.lms_lp_id, olms.lms_user_id, olms.lms_view_id, old_item_id); - - // Modified version xajax_save_item_scorm( olms.lms_lp_id, olms.lms_user_id, @@ -1555,7 +1551,8 @@ function switch_item(current_item, next_item) } else { logit_lms('Case 2 - current != sco but next == sco'); } - xajax_save_item( + + var saveAjax = xajax_save_item( olms.lms_lp_id, olms.lms_user_id, olms.lms_view_id, @@ -1576,21 +1573,27 @@ function switch_item(current_item, next_item) 1, olms.statusSignalReceived ); - xajax_switch_item_details( - olms.lms_lp_id, - olms.lms_user_id, - olms.lms_view_id, - olms.lms_item_id, - next_item - ); + + if (saveAjax) { + $.when(saveAjax).done(function(results) { + xajax_switch_item_details( + olms.lms_lp_id, + olms.lms_user_id, + olms.lms_view_id, + olms.lms_item_id, + next_item + ); + }); + } } else { if (next_item_type != 'sco') { logit_lms('Case 3 - current == sco but next != sco'); } else { logit_lms('Case 4 - current == sco and next == sco'); } + // Setting userNavigatesAway = 1 - xajax_save_item_scorm( + var saveAjax = xajax_save_item_scorm( olms.lms_lp_id, olms.lms_user_id, olms.lms_view_id, @@ -1602,24 +1605,27 @@ function switch_item(current_item, next_item) olms.statusSignalReceived ); - reinit_updatable_vars_list(); - - xajax_switch_item_toc( - olms.lms_lp_id, - olms.lms_user_id, - olms.lms_view_id, - olms.lms_item_id, - next_item - ); - - if (olms.item_objectives.length>0) { - xajax_save_objectives( - olms.lms_lp_id, - olms.lms_user_id, - olms.lms_view_id, - olms.lms_item_id, - olms.item_objectives - ); + if (saveAjax) { + $.when(saveAjax).done(function(result) { + reinit_updatable_vars_list(); + xajax_switch_item_toc( + olms.lms_lp_id, + olms.lms_user_id, + olms.lms_view_id, + olms.lms_item_id, + next_item + ); + + if (olms.item_objectives.length>0) { + xajax_save_objectives( + olms.lms_lp_id, + olms.lms_user_id, + olms.lms_view_id, + olms.lms_item_id, + olms.item_objectives + ); + } + }); } } @@ -1641,42 +1647,6 @@ function switch_item(current_item, next_item) * anymore) */ - /* - if (olms.lms_item_type == 'sco' && - olms.lesson_status != 'completed' && - olms.lesson_status != 'passed' && - olms.lesson_status != 'browsed' && - olms.lesson_status != 'incomplete' && - olms.lesson_status != 'failed' - ) { - // savedata() with olms.finishSignalReceived == 1 treats the special - // condition and saves the new status to the database, so - // switch_item_details() enjoys the new status - savedata(olms.lms_item_id); - } - xajax_save_item( - olms.lms_lp_id, - olms.lms_user_id, - olms.lms_view_id, - olms.lms_item_id, - olms.score, - olms.max, - olms.min, - olms.lesson_status, - olms.session_time, - olms.suspend_data, - olms.lesson_location, - olms.interactions, - olms.lms_item_core_exit, - orig_item_type, - olms.session_id, - olms.course_id, - olms.finishSignalReceived, - 1, - olms.statusSignalReceived - ); - */ - olms.execute_stats = false; // Considering info_lms_item[0] is initially the oldest and info_lms_item[1] @@ -1926,7 +1896,7 @@ function xajax_save_item( if (olms.lms_lp_type == 1 || item_type == 'document' || item_type == 'asset') { logit_lms('xajax_save_item with params:' + params, 3); - $.ajax({ + return $.ajax({ type:"POST", data: params, url: "lp_ajax_save_item.php" + courseUrl, @@ -1934,6 +1904,8 @@ function xajax_save_item( async: false }); } + + return false; } /** @@ -2054,17 +2026,26 @@ function xajax_save_item_scorm( result = navigator.sendBeacon(saveUrl, formData); console.log(result); + + params = ''; + my_scorm_values = null; + + return false; } else { - $.ajax({ + logit_lms('Ajax call'); + var ajax = $.ajax({ type:"POST", data: params, url: saveUrl, dataType: "script", async: false }); + + params = ''; + my_scorm_values = null; + + return ajax; } - params = ''; - my_scorm_values = null; } /** @@ -2147,7 +2128,7 @@ function xajax_switch_item_details(lms_lp_id,lms_user_id,lms_view_id,lms_item_id logit_lms('xajax_switch_item_details with params:' + params, 3); - $.ajax({ + return $.ajax({ type: "POST", data: params, url: "lp_ajax_switch_item.php" + courseUrl, From 3e8b1fcbf23914110bbf0327f707f6fff4bab05f Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 12:25:36 +0200 Subject: [PATCH 05/12] WIP: async: false in SCORM BT#17387 --- main/lp/scorm_api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/lp/scorm_api.php b/main/lp/scorm_api.php index 8c5385e2b6..d7bf2d0696 100755 --- a/main/lp/scorm_api.php +++ b/main/lp/scorm_api.php @@ -2038,7 +2038,7 @@ function xajax_save_item_scorm( data: params, url: saveUrl, dataType: "script", - async: false + async: true }); params = ''; @@ -2133,7 +2133,7 @@ function xajax_switch_item_details(lms_lp_id,lms_user_id,lms_view_id,lms_item_id data: params, url: "lp_ajax_switch_item.php" + courseUrl, dataType: "script", - async: false + async: true }); } From 3ad68a7005a563fc4df6e95229b51b8112712b5b Mon Sep 17 00:00:00 2001 From: Nosolored Date: Fri, 12 Jun 2020 12:33:21 +0200 Subject: [PATCH 06/12] Use GradebookUtils::get_list_users_certificates function to get users list --- plugin/customcertificate/src/print_certificate.php | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/plugin/customcertificate/src/print_certificate.php b/plugin/customcertificate/src/print_certificate.php index 42d1288f28..e391128ee4 100644 --- a/plugin/customcertificate/src/print_certificate.php +++ b/plugin/customcertificate/src/print_certificate.php @@ -16,6 +16,7 @@ api_block_anonymous_users(); $plugin = CustomCertificatePlugin::create(); $enable = $plugin->get('enable_plugin_customcertificate') == 'true'; $tblProperty = Database::get_course_table(TABLE_ITEM_PROPERTY); +$categoryId = isset($_GET['cat_id']) ? (int) $_GET['cat_id'] : 0; if (!$enable) { api_not_allowed(true, $plugin->get_lang('ToolDisabled')); @@ -60,16 +61,9 @@ if (empty($_GET['export_all'])) { } $userList[] = api_get_user_info($studentId); } else { - $certificateTable = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE); - $categoryTable = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY); - $sql = "SELECT cer.user_id AS user_id - FROM $certificateTable cer - INNER JOIN $categoryTable cat - ON (cer.cat_id = cat.id) - WHERE cat.course_code = '$courseCode' AND cat.session_id = $sessionId"; - $rs = Database::query($sql); - while ($row = Database::fetch_assoc($rs)) { - $userList[] = api_get_user_info($row['user_id']); + $certificate_list = GradebookUtils::get_list_users_certificates($categoryId); + foreach ($certificate_list as $index => $value) { + $userList[] = api_get_user_info($value['user_id']); } } From b2ebce671047c92f1271946da07b44ff9dccb6d9 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 13:39:32 +0200 Subject: [PATCH 07/12] Add indexes --- documentation/optimization.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/documentation/optimization.html b/documentation/optimization.html index 85afdad0c6..696a44d694 100755 --- a/documentation/optimization.html +++ b/documentation/optimization.html @@ -247,6 +247,11 @@ ALTER TABLE c_lp_item_view ADD INDEX idx_clpiv_c_i_v (c_id, id, view_count); ALTER TABLE c_item_property ADD INDEX idx_item_property_visibility (visibility); ALTER TABLE c_dropbox_person ADD INDEX idx_file(file_id); + ALTER TABLE c_chat_connected ADD INDEX idx_user_course_session(user_id, c_id, session_id); + ALTER TABLE c_chat_connected ADD INDEX idx_user_course_group(user_id, c_id, to_group_id); + + ALTER TABLE c_chat_connected ADD INDEX idx_course_session(c_id, session_id); + ALTER TABLE c_chat_connected ADD INDEX idx_course_group(c_id, to_group_id);

3. Indexes caching

From 2c91cc3896c1f03980e50011c9d369699fd4c3cb Mon Sep 17 00:00:00 2001 From: juan-cortizas-ponte Date: Fri, 12 Jun 2020 14:17:18 +0200 Subject: [PATCH 08/12] added try/catch on chat ajax request done callback --- main/template/default/chat/chat.tpl | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/main/template/default/chat/chat.tpl b/main/template/default/chat/chat.tpl index d17f1eedc0..f923687dc4 100644 --- a/main/template/default/chat/chat.tpl +++ b/main/template/default/chat/chat.tpl @@ -81,14 +81,18 @@ $(function () { friend: ChChat.currentFriend }) .done(function (response) { - if (response.data.history) { - ChChat._historySize = response.data.oldFileSize; - ChChat.setHistory(response.data.history); - } - - if (response.data.userList) { - ChChat.usersOnline = response.data.usersOnline; - ChChat.setConnectedUsers(response.data.userList); + try { + if (response.data.history) { + ChChat._historySize = response.data.oldFileSize; + ChChat.setHistory(response.data.history); + } + + if (response.data.userList) { + ChChat.usersOnline = response.data.usersOnline; + ChChat.setConnectedUsers(response.data.userList); + } + } catch (error) { + console.error(error); } }); }, From 72e73c0e8f455d1809a612e6dec2d61e7141cbc1 Mon Sep 17 00:00:00 2001 From: Nosolored Date: Fri, 12 Jun 2020 14:26:29 +0200 Subject: [PATCH 09/12] Export all certificates to pdf using customcertificate plugin BT#17382 --- .../gradebook_display_certificate.php | 27 +++-- .../src/print_certificate.php | 112 +++++++++++++----- 2 files changed, 96 insertions(+), 43 deletions(-) diff --git a/main/gradebook/gradebook_display_certificate.php b/main/gradebook/gradebook_display_certificate.php index d7db64a674..ea7180d14a 100755 --- a/main/gradebook/gradebook_display_certificate.php +++ b/main/gradebook/gradebook_display_certificate.php @@ -74,7 +74,7 @@ if ($filter === 'true') { $content = ''; $courseCode = api_get_course_id(); -$allowExportToZip = api_get_plugin_setting('customcertificate', 'enable_plugin_customcertificate') === 'true' && +$allowCustomCertificate = api_get_plugin_setting('customcertificate', 'enable_plugin_customcertificate') === 'true' && api_get_course_setting('customcertificate_course_enable', $courseInfo) == 1; $tags = Certificate::notificationTags(); @@ -126,23 +126,28 @@ switch ($action) { $content = $form->returnForm(); break; case 'export_all_certificates': - if (api_is_student_boss()) { - $userGroup = new UserGroup(); - $userList = $userGroup->getGroupUsersByUser(api_get_user_id()); + if ($allowCustomCertificate) { + $params = 'course_code='.api_get_course_id().'&session_id='.api_get_session_id().'&'.api_get_cidreq(); + $url = api_get_path(WEB_PLUGIN_PATH).'customcertificate/src/print_certificate.php?export_all_in_one=1&'.$params; } else { - $userList = []; - if (!empty($filterOfficialCodeGet)) { - $userList = UserManager::getUsersByOfficialCode($filterOfficialCodeGet); + if (api_is_student_boss()) { + $userGroup = new UserGroup(); + $userList = $userGroup->getGroupUsersByUser(api_get_user_id()); + } else { + $userList = []; + if (!empty($filterOfficialCodeGet)) { + $userList = UserManager::getUsersByOfficialCode($filterOfficialCodeGet); + } } - } - Category::exportAllCertificates($categoryId, $userList); + Category::exportAllCertificates($categoryId, $userList); + } header('Location: '.$url); exit; break; case 'export_all_certificates_zip': - if ($allowExportToZip) { + if ($allowCustomCertificate) { $params = 'course_code='.api_get_course_id().'&session_id='.api_get_session_id().'&'.api_get_cidreq(); $url = api_get_path(WEB_PLUGIN_PATH).'customcertificate/src/print_certificate.php?export_all=1&'.$params; @@ -273,7 +278,7 @@ if (count($certificate_list) > 0 && $hideCertificateExport !== 'true') { $url.'&action=export_all_certificates' ); - if ($allowExportToZip) { + if ($allowCustomCertificate) { $actions .= Display::url( Display::return_icon('file_zip.png', get_lang('ExportAllCertificatesToZIP'), [], ICON_SIZE_MEDIUM), $url.'&action=export_all_certificates_zip' diff --git a/plugin/customcertificate/src/print_certificate.php b/plugin/customcertificate/src/print_certificate.php index e391128ee4..3eee8b33ad 100644 --- a/plugin/customcertificate/src/print_certificate.php +++ b/plugin/customcertificate/src/print_certificate.php @@ -53,7 +53,9 @@ if (empty($sessionId)) { $accessUrlId = api_get_current_access_url_id(); $userList = []; -if (empty($_GET['export_all'])) { +$exportZip = false; +$exportAllInOne = false; +if (empty($_GET['export_all']) && empty($_GET['export_all_in_one'])) { if (!isset($_GET['student_id'])) { $studentId = api_get_user_id(); } else { @@ -61,6 +63,12 @@ if (empty($_GET['export_all'])) { } $userList[] = api_get_user_info($studentId); } else { + if (!empty($_GET['export_all'])) { + $exportZip = true; + } + if (!empty($_GET['export_all_in_one'])) { + $exportAllInOne = true; + } $certificate_list = GradebookUtils::get_list_users_certificates($categoryId); foreach ($certificate_list as $index => $value) { $userList[] = api_get_user_info($value['user_id']); @@ -74,7 +82,7 @@ if ($sessionId > 0) { $table = Database::get_main_table(CustomCertificatePlugin::TABLE_CUSTOMCERTIFICATE); $useDefault = false; -$path = api_get_path(SYS_UPLOAD_PATH).'certificates/'; +$path = api_get_path(WEB_UPLOAD_PATH).'certificates/'; // Get info certificate $infoCertificate = CustomCertificatePlugin::getInfoCertificate($courseId, $sessionId, $accessUrlId); @@ -103,16 +111,19 @@ $htmlList = []; $currentLocalTime = api_get_local_time(); foreach ($userList as $userInfo) { - $htmlText = ''; - $htmlText .= ' - '; - $htmlText .= ' - '; - $htmlText .= ''; + $htmlText = ''; + if (!$exportAllInOne) { + $htmlText = ''; + $htmlText .= ' + '; + $htmlText .= ' + '; + $htmlText .= ''; + } $studentId = $userInfo['user_id']; if (empty($infoCertificate['background'])) { @@ -455,7 +466,10 @@ foreach ($userList as $userInfo) { } $htmlText .= ''; } - $htmlText .= ''; + + if (!$exportAllInOne) { + $htmlText .= ''; + } $fileName = 'certificate_'.$courseInfo['code'].'_'.$userInfo['complete_name'].'_'.$currentLocalTime; $htmlList[$fileName] = $htmlText; } @@ -466,10 +480,8 @@ if (!is_dir($archivePath)) { mkdir($archivePath, api_get_permissions_for_new_directories()); } -foreach ($htmlList as $fileName => $content) { - $fileName = api_replace_dangerous_char($fileName); +if ($exportAllInOne) { $params = [ - 'filename' => $fileName, 'pdf_title' => 'Certificate', 'pdf_description' => '', 'format' => 'A4-L', @@ -479,25 +491,61 @@ foreach ($htmlList as $fileName => $content) { 'bottom' => 0, ]; $pdf = new PDF($params['format'], $params['orientation'], $params); - if (count($htmlList) == 1) { - $pdf->content_to_pdf($content, '', $fileName, null, 'D', false, null, false, false, false); - exit; - } else { - $filePath = $archivePath.$fileName.'.pdf'; - $pdf->content_to_pdf($content, '', $fileName, null, 'F', true, $filePath, false, false, false); - $fileList[] = $filePath; + + $contentAllCertificate = ''; + foreach ($htmlList as $fileName => $content) { + $contentAllCertificate .= $content; } -} -if (!empty($fileList)) { - $zipFile = $archivePath.'certificates_'.api_get_unique_id().'.zip'; - $zipFolder = new PclZip($zipFile); - foreach ($fileList as $file) { - $zipFolder->add($file, PCLZIP_OPT_REMOVE_ALL_PATH); + if (!empty($contentAllCertificate)) { + $certificateContent = ''; + $certificateContent .= ' + '; + $certificateContent .= ' + '; + $certificateContent .= ''; + $certificateContent .= $contentAllCertificate; + $certificateContent .= ''; + + $pdf->content_to_pdf($certificateContent, '', 'certificate'.date("Y_m_d_His"), null, 'D', false, null, false, false, false); + } +} else { + foreach ($htmlList as $fileName => $content) { + $fileName = api_replace_dangerous_char($fileName); + $params = [ + 'filename' => $fileName, + 'pdf_title' => 'Certificate', + 'pdf_description' => '', + 'format' => 'A4-L', + 'orientation' => 'L', + 'left' => 15, + 'top' => 15, + 'bottom' => 0, + ]; + $pdf = new PDF($params['format'], $params['orientation'], $params); + if ($exportZip) { + $filePath = $archivePath.$fileName.'.pdf'; + $pdf->content_to_pdf($content, '', $fileName, null, 'F', true, $filePath, false, false, false); + $fileList[] = $filePath; + } else { + $pdf->content_to_pdf($content, '', $fileName, null, 'D', false, null, false, false, false); + } + } + + if (!empty($fileList)) { + $zipFile = $archivePath.'certificates_'.api_get_unique_id().'.zip'; + $zipFolder = new PclZip($zipFile); + foreach ($fileList as $file) { + $zipFolder->add($file, PCLZIP_OPT_REMOVE_ALL_PATH); + } + $name = 'certificates_'.$courseInfo['code'].'_'.$currentLocalTime.'.zip'; + DocumentManager::file_send_for_download($zipFile, true, $name); + exit; } - $name = 'certificates_'.$courseInfo['code'].'_'.$currentLocalTime.'.zip'; - DocumentManager::file_send_for_download($zipFile, true, $name); - exit; } function getIndexFiltered($index) From e73f046eb96392d69bc3def65b0ed35483a4b9cb Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 14:32:09 +0200 Subject: [PATCH 10/12] Add group filter in LP report see BT#17370 --- main/lp/lp_report.php | 37 ++++++++++++++++++---- main/template/default/learnpath/report.tpl | 1 + 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/main/lp/lp_report.php b/main/lp/lp_report.php index 970b2f3eba..bb01a8c2f5 100644 --- a/main/lp/lp_report.php +++ b/main/lp/lp_report.php @@ -20,14 +20,16 @@ if (!$isAllowedToEdit) { $lpTable = Database::get_course_table(TABLE_LP_MAIN); -$lpId = isset($_GET['lp_id']) ? (int) $_GET['lp_id'] : 0; -$export = isset($_GET['export']); +$lpId = isset($_REQUEST['lp_id']) ? (int) $_REQUEST['lp_id'] : 0; +$export = isset($_REQUEST['export']); $lp = new learnpath(api_get_course_id(), $lpId, api_get_user_id()); if (empty($lp)) { api_not_allowed(true); } +$url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=report&lp_id='.$lpId; + $em = Database::getManager(); $sessionId = api_get_session_id(); $courseId = api_get_course_int_id(); @@ -93,6 +95,28 @@ $lpInfo = Database::select( 'first' ); +$groups = GroupManager::get_groups(); + +$groupFilter = ''; +if (!empty($groups)) { + $form = new FormValidator('group', 'post', $url); + $form->addSelect( + 'group_id', + get_lang('Groups'), + array_column($groups, 'name', 'iid'), + ['placeholder' => get_lang('SelectAnOption')] + ); + $form->addButtonSearch(get_lang('Search')); + + if ($form->validate()) { + $groupId = $form->getSubmitValue('group_id'); + if (!empty($groupId)) { + $users = GroupManager::getStudents($groupId, true); + } + } + $groupFilter = $form->returnForm(); +} + $userList = []; $showEmail = api_get_setting('show_email_addresses'); @@ -171,7 +195,7 @@ if (!empty($users)) { [], ICON_SIZE_MEDIUM ), - api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=report&export=pdf&lp_id='.$lpId + $url.'&export=pdf' ); } @@ -182,13 +206,12 @@ $template->assign('course_code', api_get_course_id()); $template->assign('lp_id', $lpId); $template->assign('show_email', 'true' === $showEmail); $template->assign('export', (int) $export); +$template->assign('groups', $groupFilter); + $layout = $template->get_template('learnpath/report.tpl'); $template->assign('header', $lpInfo['name']); -$template->assign( - 'actions', - Display::toolbarAction('lp_actions', [$actions]) -); +$template->assign('actions', Display::toolbarAction('lp_actions', [$actions])); $result = $template->fetch($layout); $template->assign('content', $result); diff --git a/main/template/default/learnpath/report.tpl b/main/template/default/learnpath/report.tpl index 5b7a08e7a4..7eb75f8952 100644 --- a/main/template/default/learnpath/report.tpl +++ b/main/template/default/learnpath/report.tpl @@ -1,3 +1,4 @@ +{{ groups }}
'.get_lang('Number').''.get_lang('True').''.get_lang('False').''.get_lang('Answer').''.get_lang('Number').''.get_lang('True').''.get_lang('False').''.get_lang('Answer').''.get_lang('Comment').''.get_lang('Comment').'
From e1c465c6e5be0ea9b30a16bda5991e15d416c41a Mon Sep 17 00:00:00 2001 From: Nosolored Date: Fri, 12 Jun 2020 14:39:46 +0200 Subject: [PATCH 11/12] Fix Line exceeds maximum limit of 120 characters --- .../gradebook_display_certificate.php | 3 ++- .../src/print_certificate.php | 22 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/main/gradebook/gradebook_display_certificate.php b/main/gradebook/gradebook_display_certificate.php index ea7180d14a..ffd4d57cf1 100755 --- a/main/gradebook/gradebook_display_certificate.php +++ b/main/gradebook/gradebook_display_certificate.php @@ -128,7 +128,8 @@ switch ($action) { case 'export_all_certificates': if ($allowCustomCertificate) { $params = 'course_code='.api_get_course_id().'&session_id='.api_get_session_id().'&'.api_get_cidreq(); - $url = api_get_path(WEB_PLUGIN_PATH).'customcertificate/src/print_certificate.php?export_all_in_one=1&'.$params; + $url = api_get_path(WEB_PLUGIN_PATH). + 'customcertificate/src/print_certificate.php?export_all_in_one=1&'.$params; } else { if (api_is_student_boss()) { $userGroup = new UserGroup(); diff --git a/plugin/customcertificate/src/print_certificate.php b/plugin/customcertificate/src/print_certificate.php index 3eee8b33ad..9cd08c9372 100644 --- a/plugin/customcertificate/src/print_certificate.php +++ b/plugin/customcertificate/src/print_certificate.php @@ -131,8 +131,9 @@ foreach ($userList as $userInfo) { } else { $urlBackground = $path.$infoCertificate['background']; $htmlText .= '
'; + class="caraA" + style="background-image:url('.$urlBackground.') no-repeat; + background-image-resize:6; margin:0px; padding:0px;">'; } if (!empty($infoCertificate['logo_left'])) { @@ -169,7 +170,9 @@ foreach ($userList as $userInfo) { border="0">'; $htmlText .= '
'; $htmlText .= ''; - $htmlText .= ''; + $htmlText .= ''; $htmlText .= ''; $htmlText .= ''; $htmlText .= '
'; @@ -511,7 +514,18 @@ if ($exportAllInOne) { $certificateContent .= $contentAllCertificate; $certificateContent .= ''; - $pdf->content_to_pdf($certificateContent, '', 'certificate'.date("Y_m_d_His"), null, 'D', false, null, false, false, false); + $pdf->content_to_pdf( + $certificateContent, + '', + 'certificate'.date("Y_m_d_His"), + null, + 'D', + false, + null, + false, + false, + false + ); } } else { foreach ($htmlList as $fileName => $content) { From 9e75d04b7606b97358c8654e786adc4a24d8616d Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Fri, 12 Jun 2020 15:06:48 +0200 Subject: [PATCH 12/12] Add group column BT#17370 --- main/lp/lp_report.php | 26 +++++++++++++++------- main/lp/lp_view.php | 1 + main/template/default/learnpath/report.tpl | 2 ++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/main/lp/lp_report.php b/main/lp/lp_report.php index bb01a8c2f5..da33950c52 100644 --- a/main/lp/lp_report.php +++ b/main/lp/lp_report.php @@ -34,6 +34,7 @@ $em = Database::getManager(); $sessionId = api_get_session_id(); $courseId = api_get_course_int_id(); $courseCode = api_get_course_id(); + // Check LP subscribers if ('1' === $lp->getSubscribeUsers()) { /** @var ItemPropertyRepository $itemRepo */ @@ -95,8 +96,7 @@ $lpInfo = Database::select( 'first' ); -$groups = GroupManager::get_groups(); - +$groups = GroupManager::get_group_list(null, api_get_course_info(), null, api_get_session_id()); $groupFilter = ''; if (!empty($groups)) { $form = new FormValidator('group', 'post', $url); @@ -122,30 +122,31 @@ $showEmail = api_get_setting('show_email_addresses'); if (!empty($users)) { foreach ($users as $user) { - $userInfo = api_get_user_info($user['user_id']); + $userId = $user['user_id']; + $userInfo = api_get_user_info($userId); $lpTime = Tracking::get_time_spent_in_lp( - $user['user_id'], + $userId, $courseCode, [$lpId], $sessionId ); $lpScore = Tracking::get_avg_student_score( - $user['user_id'], + $userId, $courseCode, [$lpId], $sessionId ); $lpProgress = Tracking::get_avg_student_progress( - $user['user_id'], + $userId, $courseCode, [$lpId], $sessionId ); $lpLastConnection = Tracking::get_last_connection_time_in_lp( - $user['user_id'], + $userId, $courseCode, $lpId, $sessionId @@ -156,11 +157,20 @@ if (!empty($users)) { DATE_TIME_FORMAT_LONG ); + $userGroupList = ''; + if (!empty($groups)) { + $groupsByUser = GroupManager::getAllGroupPerUserSubscription($userId, $courseId, $sessionId); + if (!empty($groupsByUser)) { + $userGroupList = implode(', ', array_column($groupsByUser, 'name')); + } + } + $userList[] = [ - 'id' => $user['user_id'], + 'id' => $userId, 'first_name' => $userInfo['firstname'], 'last_name' => $userInfo['lastname'], 'email' => 'true' === $showEmail ? $userInfo['email'] : '', + 'groups' => $userGroupList, 'lp_time' => api_time_to_hms($lpTime), 'lp_score' => is_numeric($lpScore) ? "$lpScore%" : $lpScore, 'lp_progress' => "$lpProgress%", diff --git a/main/lp/lp_view.php b/main/lp/lp_view.php index 08fbdc1958..0f394615cd 100755 --- a/main/lp/lp_view.php +++ b/main/lp/lp_view.php @@ -576,6 +576,7 @@ $template->assign( ); $frameReady = Display::getFrameReadyBlock('#content_id, #content_id_blank'); + $template->assign('frame_ready', $frameReady); $view = $template->get_template('learnpath/view.tpl'); $content = $template->fetch($view); diff --git a/main/template/default/learnpath/report.tpl b/main/template/default/learnpath/report.tpl index 7eb75f8952..b84778faac 100644 --- a/main/template/default/learnpath/report.tpl +++ b/main/template/default/learnpath/report.tpl @@ -8,6 +8,7 @@ {% if show_email %} {{ 'Email'|get_lang }} {% endif %} + {{ 'Group'|get_lang }} {{ 'ScormTime'|get_lang }} {{ 'Progress'|get_lang }} {{ 'ScormScore'|get_lang }} @@ -25,6 +26,7 @@ {% if show_email %} {{ user.email }} {% endif %} + {{ user.groups }} {{ user.lp_time }} {{ user.lp_progress }} {{ user.lp_score }}