Update from 1.11.x

pull/3544/head
Julio Montoya 5 years ago
parent 46ed10dbd3
commit 28b5fd3f43
  1. 52
      public/main/lp/learnpath.class.php
  2. 5
      public/main/lp/learnpathItem.class.php
  3. 3
      public/main/lp/lp_add_audio.php
  4. 9
      public/main/lp/lp_ajax_save_item.php
  5. 13
      public/main/lp/lp_controller.php
  6. 1
      public/main/lp/lp_list.php
  7. 16
      public/main/lp/lp_move_item.php
  8. 367
      public/main/lp/lp_report.php
  9. 151
      public/main/lp/lp_subscribe_users.php
  10. 141
      public/main/lp/lp_subscribe_users_to_category.php
  11. 10
      public/main/lp/lp_view.php
  12. 6
      public/main/lp/scorm_api.php

@ -1033,6 +1033,15 @@ class learnpath
}
}
if (api_get_configuration_value('allow_lp_subscription_to_usergroups')) {
$table = Database::get_course_table(TABLE_LP_REL_USERGROUP);
$sql = "DELETE FROM $table
WHERE
lp_id = {$this->lp_id} AND
c_id = $course_id ";
Database::query($sql);
}
/*$tbl_tool = Database::get_course_table(TABLE_TOOL_LIST);
$link = 'lp/lp_controller.php?action=view&lp_id='.$this->lp_id;
// Delete tools
@ -1450,8 +1459,8 @@ class learnpath
$maxScore = 100;
}
$minScore = floatval($minScore);
$maxScore = floatval($maxScore);
$minScore = (float) $minScore;
$maxScore = (float) $maxScore;
if (empty($prerequisite_id)) {
$prerequisite_id = 'NULL';
@ -1733,6 +1742,23 @@ class learnpath
}
}
/**
* Get the learning path name by id.
*
* @param int $lpId
*
* @return mixed
*/
public static function getLpNameById($lpId)
{
$em = Database::getManager();
return $em->createQuery('SELECT clp.name FROM ChamiloCourseBundle:CLp clp
WHERE clp.iid = :iid')
->setParameter('iid', $lpId)
->getSingleScalarResult();
}
/**
* Gets the navigation bar for the learnpath display screen.
*
@ -6527,6 +6553,7 @@ class learnpath
* @param bool $isConfigPage Optional. If is the config page, show the edit button
* @param bool $allowExpand Optional. Allow show the expand/contract button
* @param string $action
* @param array $extraField
*
* @return string
*/
@ -6535,10 +6562,12 @@ class learnpath
$showRequirementButtons = true,
$isConfigPage = false,
$allowExpand = true,
$action = ''
$action = '',
$extraField = []
) {
$actionsRight = '';
$lpId = $this->lp_id;
if (!isset($extraField['backTo']) && empty($extraField['backTo'])) {
$back = Display::url(
Display::return_icon(
'back.png',
@ -6548,6 +6577,17 @@ class learnpath
),
'lp_controller.php?'.api_get_cidreq()
);
} else {
$back = Display::url(
Display::return_icon(
'back.png',
get_lang('Back'),
'',
ICON_SIZE_MEDIUM
),
$extraField['backTo']
);
}
/*if ($backToBuild) {
$back = Display::url(
@ -6868,6 +6908,10 @@ class learnpath
$filename = $title;
$content = !empty($content) ? $content : $_POST['content_lp'];
$tmp_filename = $filename;
$i = 0;
while (file_exists($filepath.$tmp_filename.'.'.$extension)) {
$tmp_filename = $filename.'_'.++$i;
}
$filename = $tmp_filename.'.'.$extension;
if ('html' === $extension) {
@ -10181,7 +10225,7 @@ EOD;
/**
* @param int $courseId
*
* @return mixed
* @return CLpCategory[]
*/
public static function getCategories($courseId)
{

@ -1554,6 +1554,11 @@ class learnpathItem
) {
$time = null;
$courseId = $this->courseId;
if (empty($courseId)) {
$courseId = api_get_course_int_id();
}
$courseId = (int) $courseId;
if (!isset($given_time)) {
if (self::DEBUG > 2) {
error_log(

@ -196,7 +196,8 @@ $documentTree = DocumentManager::get_document_preview(
$page .= $recordVoiceForm;
$page .= '<br>';
$page .= $form->returnForm();
$page .= '<h3 class="page-header"><small>'.get_lang('Or').'</small> '.get_lang('SelectAnAudioFileFromDocuments').'</h3>';
$page .= '<h3 class="page-header">
<small>'.get_lang('Or').'</small> '.get_lang('SelectAnAudioFileFromDocuments').'</h3>';
$folders = DocumentManager::get_all_document_folders(
$courseInfo,

@ -65,11 +65,10 @@ function save_item(
if ($debug > 0) {
error_log('--------------------------------------');
error_log('lp_ajax_save_item.php : save_item() params: ');
error_log("item_id: $item_id");
error_log("lp_id: $lp_id - user_id: - $user_id - view_id: $view_id - item_id: $item_id");
error_log("score: $score - max:$max - min: $min - status:$status");
error_log("time:$time - suspend: $suspend - location: $location - core_exit: $core_exit");
error_log('SAVE ITEM - lp_ajax_save_item.php : save_item() params: ');
error_log("item_id: $item_id - lp_id: $lp_id - user_id: - $user_id - view_id: $view_id - item_id: $item_id");
error_log("SCORE: $score - max:$max - min: $min - status:$status");
error_log("TIME: $time - suspend: $suspend - location: $location - core_exit: $core_exit");
error_log("finish: $lmsFinish - navigatesAway: $userNavigatesAway");
}

@ -21,6 +21,7 @@ require_once __DIR__.'/../inc/global.inc.php';
api_protect_course_script(true);
$current_course_tool = TOOL_LEARNPATH;
$_course = api_get_course_info();
$glossaryExtraTools = api_get_setting('show_glossary_in_extra_tools');
@ -226,14 +227,11 @@ $htmlHeadXtra[] = '
);
},
receive: function(event, ui) {
/*var id = $(ui.item).attr("data_id");
var id = $(ui.item).attr("data_id");
var type = $(ui.item).attr("data_type");
var title = $(ui.item).attr("title");*/
var id = $(ui.item).find(".link_with_id").attr("data_id");
var type = $(ui.item).find(".link_with_id").attr("data_type");
var title = $(ui.item).find(".link_with_id").html();
var title = $(ui.item).attr("title");
processReceive = true;
if (ui.item.parent()[0]) {
var parent_id = $(ui.item.parent()[0]).attr("id");
var previous_id = $(ui.item.prev()).attr("id");
@ -1404,6 +1402,9 @@ switch ($action) {
case 'my_courses':
$url = api_get_path(WEB_PATH).'user_portal.php';
break;
case 'portal_home':
$url = api_get_path(WEB_PATH);
break;
}
header('location: '.$url);
exit;

@ -13,6 +13,7 @@ use ChamiloSession as Session;
*
* @author Yannick Warnier <ywarnier@beeznest.org>
*/
$this_section = SECTION_COURSES;
//@todo who turns on $lp_controller_touched?
if (empty($lp_controller_touched) || 1 != $lp_controller_touched) {
header('Location: lp_controller.php?action=list&'.api_get_cidreq());

@ -20,13 +20,15 @@ $learnPath = Session::read('oLP');
/* Header and action code */
$htmlHeadXtra[] = '<script>'.
$learnPath->get_js_dropdown_array().
'$().ready(function() {'."\n".
'if ($(\'#previous\')) {'."\n".
'if(\'parent is\'+$(\'#idParent\').val()) {'.
'load_cbo($(\'#idParent\').val());'."\n".
'}}'."\n".
'});</script>';
$learnPath->get_js_dropdown_array().'
$(function() {
if ($(\'#previous\')) {
if(\'parent is\'+$(\'#idParent\').val()) {
load_cbo($(\'#idParent\').val());
}
}
});
</script>';
/* Constants and variables */
$is_allowed_to_edit = api_is_allowed_to_edit(null, true);

@ -2,81 +2,139 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Repository\ItemPropertyRepository;
use Chamilo\CourseBundle\Entity\CLpCategory;
/**
* Report from students for learning path.
*/
require_once __DIR__.'/../inc/global.inc.php';
api_protect_course_script(true);
$isAllowedToEdit = api_is_allowed_to_edit(null, true);
if (!$isAllowedToEdit) {
api_not_allowed(true);
}
$lpTable = Database::get_course_table(TABLE_LP_MAIN);
$courseInfo = api_get_course_info();
$sessionId = api_get_session_id();
$courseId = api_get_course_int_id();
$courseCode = api_get_course_id();
$lpId = isset($_REQUEST['lp_id']) ? (int) $_REQUEST['lp_id'] : 0;
$studentId = isset($_REQUEST['student_id']) ? (int) $_REQUEST['student_id'] : 0;
$groupFilter = isset($_REQUEST['group_filter']) ? Security::remove_XSS($_REQUEST['group_filter']) : '';
$deleteExercisesAttempts = isset($_REQUEST['delete_exercise_attempts']) && 1 === (int) $_REQUEST['delete_exercise_attempts'] ? true : false;
$groupFilterType = '';
$groupFilterId = 0;
$groupFilterParts = explode(':', $groupFilter);
if (!empty($groupFilterParts) && isset($groupFilterParts[1])) {
$groupFilterType = $groupFilterParts[0];
$groupFilterId = (int) $groupFilterParts[1];
}
$export = isset($_REQUEST['export']);
$reset = isset($_REQUEST['reset']) ? $_REQUEST['reset'] : '';
$lp = new learnpath(api_get_course_id(), $lpId, api_get_user_id());
$lp = new learnpath($courseCode, $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;
$urlBase = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=report&lp_id='.$lpId;
$url = $urlBase.'&group_filter='.$groupFilter;
$allowUserGroups = api_get_configuration_value('allow_lp_subscription_to_usergroups');
$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()) {
$course = api_get_course_entity($courseId);
$session = api_get_session_entity($sessionId);
/** @var ItemPropertyRepository $itemRepo */
$itemRepo = $em->getRepository('ChamiloCourseBundle:CItemProperty');
$subscribedUsersInLp = $itemRepo->getUsersSubscribedToItem(
'learnpath',
$lpId,
api_get_course_entity($courseId),
api_get_session_entity($sessionId)
$course,
$session
);
// Subscribed groups to a LP
$subscribedGroupsInLp = $itemRepo->getGroupsSubscribedToItem(
'learnpath',
$lpId,
$course,
$session
);
$groups = [];
/** @var CItemProperty $itemProperty */
if (!empty($subscribedGroupsInLp)) {
foreach ($subscribedGroupsInLp as $itemProperty) {
if (!empty($itemProperty)) {
$getGroup = $itemProperty->getGroup();
if (!empty($getGroup)) {
$groups[] = $itemProperty->getGroup()->getId();
}
}
}
}
$users = [];
if (!empty($groups)) {
foreach ($groups as $groupId) {
$students = GroupManager::getStudents($groupId);
if (!empty($students)) {
foreach ($students as $studentInfo) {
$users[]['user_id'] = $studentInfo['user_id'];
}
}
}
}
if (!empty($subscribedUsersInLp)) {
foreach ($subscribedUsersInLp as $itemProperty) {
$users[]['user_id'] = $itemProperty->getToUser()->getId();
$user = $itemProperty->getToUser();
if ($user) {
$users[]['user_id'] = $itemProperty->getToUser()->getId();
}
}
}
} else {
$categoryId = $lp->getCategoryId();
$users = [];
if (!empty($categoryId)) {
/** @var CLpCategory $category */
$category = $em->getRepository('ChamiloCourseBundle:CLpCategory')->find($categoryId);
$subscribedUsersInCategory = $category->getUsers();
$users = [];
if (!empty($subscribedUsersInCategory)) {
foreach ($subscribedUsersInCategory as $item) {
$users[]['user_id'] = $item->getUser()->getId();
$user = $item->getUser();
if ($user) {
$users[]['user_id'] = $item->getUser()->getId();
}
}
}
} else {
}
if (empty($categoryId) || empty($users)) {
if (empty($sessionId)) {
$users = CourseManager::get_user_list_from_course_code(
$courseCode,
0,
null,
null,
$courseCode,
0,
null,
null,
STUDENT
);
);
} else {
$users = CourseManager::get_user_list_from_course_code(
$courseCode,
$sessionId,
null,
null,
$courseCode,
$sessionId,
null,
null,
0
);
);
}
}
}
@ -93,33 +151,137 @@ $lpInfo = Database::select(
'first'
);
$groups = GroupManager::get_group_list(null, api_get_course_info(), null, api_get_session_id());
$groupFilter = '';
$groups = GroupManager::get_group_list(null, $courseInfo, null, $sessionId);
$label = get_lang('Groups');
$classes = [];
if ($allowUserGroups) {
$label = get_lang('Groups').' / '.get_lang('Classes');
$userGroup = new UserGroup();
$conditions = [];
$conditions['where'] = [' usergroup.course_id = ? ' => $courseId];
$classes = $userGroup->getUserGroupInCourse($conditions);
}
$groupFilterForm = '';
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 = new FormValidator('group', 'GET', $url);
$form->addHidden('action', 'report');
$form->addHidden('lp_id', $lpId);
$form->addCourseHiddenParams();
$courseGroups = [];
foreach ($groups as $group) {
$option = [
'text' => $group['name'],
'value' => "group:".$group['iid'],
];
$courseGroups[] = $option;
}
$select = $form->addSelect(
'group_filter',
$label,
[],
[
'id' => 'group_filter',
'placeholder' => get_lang('All'),
]
);
$form->addButtonSearch(get_lang('Search'));
$select->addOptGroup($courseGroups, get_lang('Groups'));
if ($allowUserGroups) {
$options = [];
foreach ($classes as $group) {
$option = [
'text' => $group['name'],
'value' => "class:".$group['id'],
];
$options[] = $option;
}
$select->addOptGroup($options, get_lang('Classes'));
}
if ($form->validate()) {
$groupId = $form->getSubmitValue('group_id');
if (!empty($groupId)) {
$users = GroupManager::getStudents($groupId, true);
if (!empty($groupFilter)) {
switch ($groupFilterType) {
case 'group':
$users = GroupManager::getStudents($groupFilterId, true);
break;
case 'class':
if ($allowUserGroups) {
$users = $userGroup->getUserListByUserGroup($groupFilterId);
}
break;
}
$form->setDefaults(['group_filter' => $groupFilter]);
}
$groupFilter = $form->returnForm();
$groupFilterForm = $form->returnForm();
}
if ($reset) {
switch ($reset) {
case 'student':
if ($studentId) {
$studentInfo = api_get_user_info($studentId);
if ($studentInfo) {
Event::delete_student_lp_events(
$studentId,
$lpId,
$courseInfo,
$sessionId,
false === $deleteExercisesAttempts
);
Display::addFlash(
Display::return_message(
get_lang('LPWasReset').': '.$studentInfo['complete_name_with_username'],
'success'
)
);
}
}
break;
case 'all':
$result = [];
foreach ($users as $user) {
$userId = $user['user_id'];
$studentInfo = api_get_user_info($userId);
if ($studentInfo) {
Event::delete_student_lp_events(
$userId,
$lpId,
$courseInfo,
$sessionId,
false === $deleteExercisesAttempts
);
$result[] = $studentInfo['complete_name_with_username'];
}
}
if (!empty($result)) {
Display::addFlash(
Display::return_message(
get_lang('LPWasReset').': '.implode(', ', $result),
'success'
)
);
}
break;
}
api_location($url);
}
$userList = [];
$showEmail = api_get_setting('show_email_addresses');
if (!empty($users)) {
$added = [];
foreach ($users as $user) {
$userId = $user['user_id'];
if (in_array($userId, $added)) {
continue;
}
$userInfo = api_get_user_info($userId);
$lpTime = Tracking::get_time_spent_in_lp(
$userId,
@ -157,31 +319,93 @@ if (!empty($users)) {
$userGroupList = '';
if (!empty($groups)) {
$groupsByUser = GroupManager::getAllGroupPerUserSubscription($userId, $courseId, $sessionId);
$icon = Display::return_icon('group.png', get_lang('Group'));
if (!empty($groupsByUser)) {
$userGroupList = implode(', ', array_column($groupsByUser, 'name'));
$groupUrl = api_get_path(WEB_CODE_PATH).'group/group_space.php?'.api_get_cidreq(true, false);
foreach ($groupsByUser as $group) {
$userGroupList .= Display::url($icon.$group['name'], $groupUrl.'&gidReq='.$group['iid']).'&nbsp;';
}
}
}
$userList[] = [
'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%",
'lp_last_connection' => $lpLastConnection,
];
$classesToString = '';
if ($allowUserGroups) {
$classes = $userGroup->getUserGroupListByUser($userId, UserGroup::NORMAL_CLASS);
$icon = Display::return_icon('class.png', get_lang('Class'));
if (!empty($classes)) {
$classUrl = api_get_path(WEB_CODE_PATH).'user/class.php?'.api_get_cidreq(true, false);
foreach ($classes as $class) {
$classesToString .= Display::url(
$icon.$class['name'],
$classUrl.'&class_id='.$class['id']
).'&nbsp;';
}
}
}
$trackingUrl = api_get_path(WEB_CODE_PATH).'mySpace/myStudents.php?details=true'.
api_get_cidreq().'&course='.$courseCode.'&origin=tracking_course&student='.$userId;
$row = [];
$row[] = Display::url($userInfo['firstname'], $trackingUrl);
$row[] = Display::url($userInfo['lastname'], $trackingUrl);
if ('true' === $showEmail) {
$row[] = $userInfo['email'];
}
$row[] = $userGroupList.$classesToString;
$row[] = api_time_to_hms($lpTime);
$row[] = "$lpProgress %";
$row[] = is_numeric($lpScore) ? "$lpScore%" : $lpScore;
$row[] = $lpLastConnection;
$actions = Display::url(Display::return_icon('statistics.png', get_lang('Reporting')), $trackingUrl).'&nbsp;';
$actions .= Display::url(
Display::return_icon('2rightarrow.png', get_lang('Details')),
'javascript:void(0);',
['data-id' => $userId, 'class' => 'details']
).'&nbsp;';
$actions .= Display::url(
Display::return_icon('clean.png', get_lang('Reset')),
'javascript:void(0);',
['data-id' => $userId, 'data-username' => $userInfo['username'], 'class' => 'delete_attempt']
);
$row[] = $actions;
$row['username'] = $userInfo['username'];
$userList[] = $row;
$added[] = $userId;
}
} else {
Display::addFlash(Display::return_message(get_lang('No user added'), 'warning'));
Display::addFlash(Display::return_message(get_lang('NoUserAdded'), 'warning'));
}
$parameters = [
'action' => 'report',
'group_filter' => $groupFilter,
'cidReq' => $courseCode,
'id_session' => $sessionId,
'lp_id' => $lpId,
];
$table = new SortableTableFromArrayConfig($userList, 1, 20, 'lp');
$table->set_additional_parameters($parameters);
$column = 0;
$table->set_header($column++, get_lang('FirstName'));
$table->set_header($column++, get_lang('LastName'));
if ('true' === $showEmail) {
$table->set_header($column++, get_lang('Email'));
}
$table->set_header($column++, $label, false);
$table->set_header($column++, get_lang('ScormTime'));
$table->set_header($column++, get_lang('Progress'));
$table->set_header($column++, get_lang('ScormScore'));
$table->set_header($column++, get_lang('LastConnection'), false);
if (false === $export) {
$table->set_header($column++, get_lang('Actions'), false);
}
// View
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq(),
'name' => get_lang('Learning paths'),
'name' => get_lang('LearningPaths'),
];
$actions = Display::url(
@ -198,39 +422,48 @@ if (!empty($users)) {
$actions .= Display::url(
Display::return_icon(
'pdf.png',
get_lang('Export to PDF'),
get_lang('ExportToPdf'),
[],
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'
);
$userListToString = array_column($userList, 'username');
$userListToString = implode(', ', $userListToString);
$actions .= Display::url(
Display::return_icon(
'clean.png',
get_lang('Clean'),
[],
ICON_SIZE_MEDIUM
),
'javascript:void(0);',
['data-users' => $userListToString, 'class' => 'delete_all']
);
}
$template = new Template(get_lang('Learner score'));
$template = new Template(get_lang('StudentScore'));
$template->assign('group_class_label', $label);
$template->assign('user_list', $userList);
$template->assign('session_id', api_get_session_id());
$template->assign('course_code', api_get_course_id());
$template->assign('lp_id', $lpId);
$template->assign('show_email', 'true' === $showEmail);
$template->assign('table', $table->return_table());
$template->assign('export', (int) $export);
$template->assign('groups', $groupFilter);
$template->assign('group_form', $groupFilterForm);
$template->assign('url', $url);
$template->assign('url_base', $urlBase);
$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('@ChamiloCore/LearnPath/report.html.twig');
$template->assign('content', $result);
if ($export) {
$pdfParams = [
'filename' => get_lang('Learner score').'_'.api_get_local_time(),
//'pdf_title' => $title,
//'course_code' => $course_code
'filename' => get_lang('StudentScore').'_'.api_get_local_time(),
];
$pdf = new PDF('A4', 'P', $pdfParams);
$pdf->html_to_pdf_with_template(

@ -11,6 +11,10 @@ require_once __DIR__.'/../inc/global.inc.php';
api_protect_course_script();
$subscriptionSettings = learnpath::getSubscriptionSettings();
if ($subscriptionSettings['allow_add_users_to_lp'] == false) {
api_not_allowed(true);
}
$is_allowed_to_edit = api_is_allowed_to_edit(false, true, false, false);
if (!$is_allowed_to_edit) {
@ -23,10 +27,8 @@ if (empty($lpId)) {
api_not_allowed(true);
}
$subscriptionSettings = learnpath::getSubscriptionSettings();
if (false == $subscriptionSettings['allow_add_users_to_lp']) {
api_not_allowed(true);
}
$allowUserGroups = api_get_configuration_value('allow_lp_subscription_to_usergroups');
$currentUser = api_get_user_entity(api_get_user_id());
$oLP = new learnpath(api_get_course_id(), $lpId, api_get_user_id());
@ -149,14 +151,143 @@ $groupMultiSelect = $form->addElement(
$form->addButtonSave(get_lang('Save'));
if ($allowUserGroups) {
$formUserGroup = new FormValidator('usergroup_form', 'post', $url);
$formUserGroup->addHidden('usergroup_form', 1);
$userGroup = new UserGroup();
$conditions = [];
$conditions['where'] = [' usergroup.course_id = ? ' => $courseId];
$groups = $userGroup->getUserGroupInCourse($conditions);
$allOptions = array_column($groups, 'name', 'id');
$items = $userGroup->getGroupsByLp($lpId, $courseId, $sessionId);
$selectedUserGroupChoices = [];
if (!empty($items)) {
foreach ($items as $data) {
if (isset($allOptions[$data['usergroup_id']])) {
$selectedUserGroupChoices[] = $data['usergroup_id'];
}
}
}
$userGroupMultiSelect = $formUserGroup->addElement(
'advmultiselect',
'usergroups',
get_lang('Classes'),
$allOptions
);
$formUserGroup->setDefaults(['usergroups' => $selectedUserGroupChoices]);
$formUserGroup->addButtonSave(get_lang('Save'));
$sessionCondition = api_get_session_condition($sessionId, true);
if ($formUserGroup->validate()) {
$values = $formUserGroup->getSubmitValues();
$table = Database::get_course_table(TABLE_LP_REL_USERGROUP);
if (isset($values['usergroups'])) {
$userGroups = $values['usergroups'];
foreach ($selectedUserGroupChoices as $userGroupId) {
$userGroupId = (int) $userGroupId;
if (!in_array($userGroupId, $userGroups)) {
$sql = "DELETE FROM $table
WHERE
c_id = $courseId AND
lp_id = $lpId AND
usergroup_id = $userGroupId
$sessionCondition
";
Database::query($sql);
$userList = $userGroup->get_users_by_usergroup($userGroupId);
$itemRepo->unsubcribeUsersToItem(
'learnpath',
$course,
$session,
$lpId,
$userList
);
}
}
foreach ($userGroups as $userGroupId) {
$userGroupId = (int) $userGroupId;
$sql = "SELECT id FROM $table
WHERE
c_id = $courseId AND
lp_id = $lpId AND
usergroup_id = $userGroupId
$sessionCondition
";
$result = Database::query($sql);
if (0 == Database::num_rows($result)) {
$params = [
'lp_id' => $lpId,
'c_id' => $courseId,
'usergroup_id' => $userGroupId,
'created_at' => api_get_utc_datetime(),
];
if (!empty($sessionId)) {
$params['session_id'] = $sessionId;
}
Database::insert($table, $params);
}
}
$groups = $userGroup->getGroupsByLp($lpId, $courseId, $sessionId);
$userList = [];
foreach ($groups as $groupId) {
$userList = $userGroup->get_users_by_usergroup($groupId);
$itemRepo->subscribeUsersToItem(
$currentUser,
'learnpath',
$course,
$session,
$lpId,
$userList,
false
);
}
Display::addFlash(Display::return_message(get_lang('Updated')));
} else {
foreach ($groups as $group) {
$userList = $userGroup->get_users_by_usergroup($group['id']);
$itemRepo->unsubcribeUsersToItem(
'learnpath',
$course,
$session,
$lpId,
$userList
);
}
// Clean all
$sql = "DELETE FROM $table
WHERE
c_id = $courseId AND
lp_id = $lpId
$sessionCondition
";
Database::query($sql);
}
header("Location: $url");
exit;
}
}
$defaults = [];
if (!empty($selectedChoices)) {
$defaults['users'] = $selectedChoices;
}
$formUsers->setDefaults($defaults);
$defaults = [];
if (!empty($selectedGroupChoices)) {
$defaults['groups'] = $selectedGroupChoices;
}
$form->setDefaults($defaults);
$currentUser = api_get_user_entity(api_get_user_id());
if ($form->validate()) {
$values = $form->getSubmitValues();
@ -202,9 +333,15 @@ $headers = [
get_lang('Subscribe groups to learning path'),
];
$items = [$formUsers->toHtml(), $form->toHtml()];
if ($allowUserGroups) {
$headers[] = get_lang('SubscribeUserGroupsToLp');
$items[] = $formUserGroup->toHtml();
}
$menu = $oLP->build_action_menu(true, false, true, false);
$tpl = new Template();
$tabs = Display::tabs($headers, [$formUsers->toHtml(), $form->toHtml()]);
$tabs = Display::tabs($headers, $items);
$tpl->assign('content', $menu.$message.$tabs);
$tpl->display_one_col_template();

@ -5,6 +5,8 @@ use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CLpCategory;
use Chamilo\CourseBundle\Entity\CLpCategoryUser;
use Chamilo\UserBundle\Entity\User;
use Doctrine\Common\Collections\Criteria;
require_once __DIR__.'/../inc/global.inc.php';
@ -27,9 +29,11 @@ if (false == $subscriptionSettings['allow_add_users_to_lp_category']) {
api_not_allowed(true);
}
$allowUserGroups = api_get_configuration_value('allow_lp_subscription_to_usergroups');
$courseId = api_get_course_int_id();
$courseCode = api_get_course_id();
$sessionId = api_get_session_id();
$currentUser = api_get_user_entity(api_get_user_id());
$em = Database::getManager();
@ -88,6 +92,128 @@ $groupMultiSelect = $form->addElement(
// submit button
$form->addButtonSave(get_lang('Save'));
if ($allowUserGroups) {
$formUserGroup = new FormValidator('lp_edit', 'post', $url);
$formUserGroup->addHidden('usergroup_form', 1);
$userGroup = new UserGroup();
$conditions = [];
$conditions['where'] = [' usergroup.course_id = ? ' => $courseId];
$groups = $userGroup->getUserGroupInCourse($conditions);
$allOptions = array_column($groups, 'name', 'id');
$items = $userGroup->getGroupsByLpCategory($categoryId, $courseId, $sessionId);
$selectedUserGroupChoices = [];
if (!empty($items)) {
foreach ($items as $data) {
if (isset($allOptions[$data['usergroup_id']])) {
$selectedUserGroupChoices[] = $data['usergroup_id'];
}
}
}
$userGroupMultiSelect = $formUserGroup->addElement(
'advmultiselect',
'usergroups',
get_lang('Classes'),
$allOptions
);
$formUserGroup->setDefaults(['usergroups' => $selectedUserGroupChoices]);
$formUserGroup->addButtonSave(get_lang('Save'));
$sessionCondition = api_get_session_condition($sessionId, true);
if ($formUserGroup->validate()) {
$values = $formUserGroup->getSubmitValues();
$table = Database::get_course_table(TABLE_LP_CATEGORY_REL_USERGROUP);
if (isset($values['usergroups'])) {
$userGroups = $values['usergroups'];
foreach ($selectedUserGroupChoices as $userGroupId) {
$userGroupId = (int) $userGroupId;
if (!in_array($userGroupId, $userGroups)) {
$sql = "DELETE FROM $table
WHERE
c_id = $courseId AND
lp_category_id = $categoryId AND
usergroup_id = $userGroupId
$sessionCondition
";
Database::query($sql);
$userList = $userGroup->get_users_by_usergroup($userGroupId);
foreach ($userList as $userId) {
$user = api_get_user_entity($userId);
$criteria = Criteria::create()->where(
Criteria::expr()->eq('user', $user)
);
$userCategory = $category->getUsers()->matching($criteria)->first();
if ($userCategory) {
$category->removeUsers($userCategory);
}
}
}
}
foreach ($userGroups as $userGroupId) {
$userGroupId = (int) $userGroupId;
$sql = "SELECT id FROM $table
WHERE
c_id = $courseId AND
lp_category_id = $categoryId AND
usergroup_id = $userGroupId
$sessionCondition
";
$result = Database::query($sql);
if (0 == Database::num_rows($result)) {
$params = [
'lp_category_id' => $categoryId,
'c_id' => $courseId,
'usergroup_id' => $userGroupId,
'created_at' => api_get_utc_datetime(),
];
if (!empty($sessionId)) {
$params['session_id'] = $sessionId;
}
Database::insert($table, $params);
}
}
$groups = $userGroup->getGroupsByLpCategory($categoryId, $courseId, $sessionId);
$userList = [];
foreach ($groups as $groupId) {
$userList = $userGroup->get_users_by_usergroup($groupId);
foreach ($userList as $userId) {
$user = api_get_user_entity($userId);
if ($user) {
$categoryUser = new CLpCategoryUser();
$categoryUser->setUser($user);
$category->addUser($categoryUser);
}
}
}
$em->merge($category);
$em->flush();
Display::addFlash(Display::return_message(get_lang('Updated')));
} else {
foreach ($category->getUsers() as $userCategory) {
$category->removeUsers($userCategory);
}
// Clean all
$sql = "DELETE FROM $table
WHERE
c_id = $courseId AND
lp_category_id = $categoryId
$sessionCondition
";
Database::query($sql);
$em->merge($category);
$em->flush();
}
header("Location: $url");
exit;
}
}
$defaults = [];
if (!empty($selectedGroupChoices)) {
$defaults['groups'] = $selectedGroupChoices;
@ -144,7 +270,6 @@ $formUsers->setDefaults($defaults);
// Building the form for Groups
$tpl = new Template();
$currentUser = api_get_user_entity(api_get_user_id());
if ($formUsers->validate()) {
$values = $formUsers->getSubmitValues();
@ -169,8 +294,10 @@ if ($formUsers->validate()) {
foreach ($users as $userId) {
$categoryUser = new CLpCategoryUser();
$user = UserManager::getRepository()->find($userId);
$categoryUser->setUser($user);
$category->addUser($categoryUser);
if ($user) {
$categoryUser->setUser($user);
$category->addUser($categoryUser);
}
}
$em->persist($category);
@ -215,7 +342,13 @@ if ($formUsers->validate()) {
get_lang('Subscribe users to category'),
get_lang('Subscribe groups to category'),
];
$tabs = Display::tabs($headers, [$formUsers->toHtml(), $form->toHtml()]);
$items = [$formUsers->toHtml(), $form->toHtml()];
if ($allowUserGroups) {
$headers[] = get_lang('SubscribeClassesToLpCategory');
$items[] = $formUserGroup->toHtml();
}
$tabs = Display::tabs($headers, $items);
$tpl->assign('content', $tabs);
$tpl->display_one_col_template();
}

@ -123,7 +123,7 @@ if (isset($zoomOptions['options']) && !in_array($origin, ['embeddable', 'noheade
$options = $zoomOptions['options'];
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_JS_PATH).'jquery.elevatezoom.js"></script>';
$htmlHeadXtra[] = '<script>
$(document).ready(function() {
$(function() {
$("img").each(function() {
var attr = $(this).attr("data-zoom-image");
// For some browsers, `attr` is undefined; for others,
@ -295,12 +295,12 @@ if (!isset($src)) {
$autostart = 'true';
// Update status, total_time from lp_item_view table when you finish the exercises in learning path.
/*if ($debug) {
if ($debug) {
error_log('$type_quiz: '.$type_quiz);
error_log('$_REQUEST[exeId]: '.intval($_REQUEST['exeId']));
error_log('$lp_id: '.$lp_id);
error_log('$_REQUEST[lp_item_id]: '.intval($_REQUEST['lp_item_id']));
}*/
}
if (!empty($_REQUEST['exeId']) &&
isset($lp_id) &&
@ -423,6 +423,10 @@ switch ($returnLink) {
$buttonHomeUrl .= '&redirectTo=my_courses';
$buttonHomeText = get_lang('My courses');
break;
case 3: // Portal home
$buttonHomeUrl .= '&redirectTo=portal_home';
$buttonHomeText = get_lang('Home');
break;
}
$lpPreviewImagePath = Display::returnIconPath('unknown.png', ICON_SIZE_BIG);

@ -34,6 +34,10 @@ $oLP = UnserializeApi::unserialize(
'lp',
Session::read('lpobject')
);
if (!is_object($oLP)) {
error_log('New LP - scorm_api - Could not load oLP object', 0);
exit;
}
/** @var learnpathItem $oItem */
$oItem = isset($oLP->items[$oLP->current]) ? $oLP->items[$oLP->current] : null;
@ -471,7 +475,7 @@ function LMSGetValue(param) {
}
} else if(param == 'cmi.core.student_id'){
// ---- cmi.core.student_id
result='<?php echo $userId; ?>';
result='<?php echo learnpath::getUserIdentifierForExternalServices(); ?>';
} else if(param == 'cmi.core.student_name'){
// ---- cmi.core.student_name
<?php

Loading…
Cancel
Save