Merge remote-tracking branch 'webservicesSeb/17507-create_event_webservices' into 1.11.x

webservicelpcreate
admin beeznest 6 years ago
commit 6274224358
  1. 2
      main/admin/course_edit.php
  2. 5
      main/auth/profile.php
  3. 4
      main/course_home/course_home.php
  4. 2
      main/cron/import_csv.php
  5. 3
      main/cron/user_import/resend_email_with_new_password.php
  6. 4
      main/inc/ajax/skill.ajax.php
  7. 723
      main/inc/lib/add_course.lib.inc.php
  8. 387
      main/inc/lib/api.lib.php
  9. 61
      main/inc/lib/course.lib.php
  10. 9
      main/inc/lib/usermanager.lib.php
  11. 366
      main/inc/lib/webservices/Rest.php
  12. 442
      main/lp/learnpath.class.php
  13. 6
      main/lp/lp_subscribe_users.php
  14. 2
      main/lp/lp_subscribe_users_to_category.php
  15. 2
      main/lp/lp_view.php
  16. 2
      main/mySpace/lp_tracking.php
  17. 7
      main/session/resume_session.php
  18. 116
      main/webservices/api/tests/CreateCourseEventTest.php
  19. 42
      main/webservices/api/tests/CreateGlobalEventTest.php
  20. 347
      main/webservices/api/tests/CreateLearningPathTest.php
  21. 3
      main/webservices/api/tests/CreateSessionFromModelTest.php
  22. 65
      main/webservices/api/tests/CreateUserEventTest.php
  23. 30
      main/webservices/api/v2.php
  24. 28
      main/webservices/registration.soap.php
  25. 9
      plugin/buycourses/src/service_process.php
  26. 5
      plugin/oauth2/src/OAuth2.php
  27. 37
      src/Chamilo/CoreBundle/Entity/AccessUrl.php
  28. 19
      src/Chamilo/CoreBundle/Entity/AccessUrlRelCourse.php
  29. 671
      src/Chamilo/CoreBundle/Entity/Course.php
  30. 20
      src/Chamilo/CoreBundle/Entity/CourseRelUser.php
  31. 40
      src/Chamilo/CoreBundle/Entity/Listener/CourseListener.php
  32. 3
      src/Chamilo/CoreBundle/Entity/Repository/ItemPropertyRepository.php
  33. 10
      src/Chamilo/CoreBundle/Entity/Repository/SequenceRepository.php
  34. 12
      src/Chamilo/CoreBundle/Entity/Repository/SequenceResourceRepository.php
  35. 209
      src/Chamilo/CoreBundle/Entity/Session.php
  36. 2
      src/Chamilo/CoreBundle/Entity/SessionCategory.php
  37. 13
      src/Chamilo/CoreBundle/Entity/SysCalendar.php
  38. 10
      src/Chamilo/CoreBundle/Entity/UserCourseCategory.php
  39. 18
      src/Chamilo/CourseBundle/Entity/CCalendarEvent.php
  40. 38
      src/Chamilo/CourseBundle/Entity/CCourseSetting.php
  41. 184
      src/Chamilo/CourseBundle/Entity/CDocument.php
  42. 81
      src/Chamilo/CourseBundle/Entity/CForumForum.php
  43. 10
      src/Chamilo/CourseBundle/Entity/CGroupInfo.php
  44. 120
      src/Chamilo/CourseBundle/Entity/CItemProperty.php
  45. 68
      src/Chamilo/CourseBundle/Entity/CLink.php
  46. 325
      src/Chamilo/CourseBundle/Entity/CLp.php
  47. 79
      src/Chamilo/CourseBundle/Entity/CLpCategory.php
  48. 274
      src/Chamilo/CourseBundle/Entity/CLpItem.php
  49. 116
      src/Chamilo/CourseBundle/Entity/CQuiz.php
  50. 26
      src/Chamilo/CourseBundle/Entity/CQuizRelQuestion.php
  51. 61
      src/Chamilo/CourseBundle/Entity/CTool.php
  52. 77
      src/Chamilo/UserBundle/Entity/User.php

@ -187,7 +187,7 @@ if ($countCategories >= 100) {
$courseTeacherNames = [];
foreach ($course_teachers as $courseTeacherId) {
/** @var User $courseTeacher */
$courseTeacher = UserManager::getRepository()->find($courseTeacherId);
$courseTeacher = api_get_user_entity($courseTeacherId);
$courseTeacherNames[$courseTeacher->getId()] = UserManager::formatUserFullName($courseTeacher, true);
}

@ -410,8 +410,7 @@ if ($form->validate()) {
$wrong_current_password = false;
$user_data = $form->getSubmitValues(1);
/** @var User $user */
$user = UserManager::getRepository()->find(api_get_user_id());
$user = api_get_user_entity();
// set password if a new one was provided
$validPassword = false;
@ -674,7 +673,7 @@ if ($form->validate()) {
if ($hook) {
Database::getManager()->clear(User::class); // Avoid cache issue (user entity is used before)
$user = api_get_user_entity(api_get_user_id()); // Get updated user info for hook event
$user = api_get_user_entity(); // Get updated user info for hook event
$hook->setEventData(['user' => $user]);
$hook->notifyUpdateUser(HOOK_EVENT_TYPE_POST);
}

@ -241,7 +241,7 @@ if ($action === 'subscribe') {
/**
* @var Chamilo\UserBundle\Entity\User
*/
$user = UserManager::getRepository()->find(api_get_user_id());
$user = api_get_user_entity();
if ($user) {
foreach ($user->getCurrentlyAccessibleSessions() as $session) {
$redirectionTarget = api_get_self().'?id_session='.$session->getId();
@ -253,7 +253,7 @@ if ($action === 'subscribe') {
/**
* @var Chamilo\UserBundle\Entity\User
*/
$user = UserManager::getRepository()->find(api_get_user_id());
$user = api_get_user_entity();
if ($user && !$user->getCurrentlyAccessibleSessions()) {
// subscription was probably refused because user session expired, go back to page "about"
$redirectionTarget = api_get_path(WEB_PATH).'course/'.$courseId.'/about';

@ -1286,7 +1286,7 @@ class ImportCsv
];
/** @var CItemProperty $itemProperty */
$itemProperty = $em->getRepository('ChamiloCourseBundle:CItemProperty')->findOneBy($criteria);
$courseEntity = $em->getRepository('ChamiloCoreBundle:Course')->find($courseInfo['real_id']);
$courseEntity = api_get_course_entity($courseInfo['real_id']);
if ($itemProperty && $courseEntity) {
$itemProperty->setCourse($courseEntity);
$em->persist($itemProperty);

@ -44,8 +44,7 @@ foreach ($list as $mail) {
$pass = api_substr($row['username'], 0, 4).rand(0, 9).rand(0, 9);
if ($user) {
/** @var User $user */
$user = $repository->find($row['user_id']);
$user = api_get_user_entity($row['user_id']);
$user->setPlainPassword($pass);
$userManager->updateUser($user, true);
} else {

@ -420,7 +420,7 @@ switch ($action) {
exit;
}
$session = $em->getRepository('ChamiloCoreBundle:Session')->find($sessionId);
$session = api_get_session_entity($sessionId);
/** @var \Chamilo\SkillBundle\Entity\SkillRelItem $skillRelItem */
$skillRelItem = $em->getRepository('ChamiloSkillBundle:SkillRelItem')->findOneBy(
['itemId' => $itemId, 'itemType' => $typeId, 'skill' => $skillId]
@ -498,7 +498,7 @@ switch ($action) {
$course = api_get_course_entity($courseId);
$skillUser->setCourse($course);
if (!empty($sessionId)) {
$session = $em->getRepository('ChamiloCoreBundle:Session')->find($sessionId);
$session = api_get_session_entity($sessionId);
$skillUser->setSession($session);
}

@ -1,7 +1,10 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\AccessUrlRelCourse;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CourseBundle\Entity\CToolIntro;
use Doctrine\ORM\OptimisticLockException;
/**
* Class AddCourse.
@ -84,122 +87,6 @@ class AddCourse
return $keys;
}
/**
* Initializes a file repository for a newly created course.
*
* @param string Course repository
* @param string Course code
*
* @return int
* @assert (null,null) === false
*/
public static function prepare_course_repository($course_repository)
{
$perm = api_get_permissions_for_new_directories();
$perm_file = api_get_permissions_for_new_files();
$htmlpage = "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <title>Not authorized</title>\n </head>\n <body>\n </body>\n</html>";
$cp = api_get_path(SYS_COURSE_PATH).$course_repository;
//Creating document folder
mkdir($cp, $perm);
mkdir($cp.'/document', $perm);
$cpt = $cp.'/document/index.html';
$fd = fopen($cpt, 'w');
fwrite($fd, $htmlpage);
fclose($fd);
/*
@chmod($cpt, $perm_file);
@copy($cpt, $cp . '/document/index.html');
mkdir($cp . '/document/images', $perm);
@copy($cpt, $cp . '/document/images/index.html');
mkdir($cp . '/document/images/gallery/', $perm);
@copy($cpt, $cp . '/document/images/gallery/index.html');
mkdir($cp . '/document/shared_folder/', $perm);
@copy($cpt, $cp . '/document/shared_folder/index.html');
mkdir($cp . '/document/audio', $perm);
@copy($cpt, $cp . '/document/audio/index.html');
mkdir($cp . '/document/flash', $perm);
@copy($cpt, $cp . '/document/flash/index.html');
mkdir($cp . '/document/video', $perm);
@copy($cpt, $cp . '/document/video/index.html'); */
//Creatind dropbox folder
mkdir($cp.'/dropbox', $perm);
$cpt = $cp.'/dropbox/index.html';
$fd = fopen($cpt, 'w');
fwrite($fd, $htmlpage);
fclose($fd);
@chmod($cpt, $perm_file);
mkdir($cp.'/group', $perm);
@copy($cpt, $cp.'/group/index.html');
mkdir($cp.'/page', $perm);
@copy($cpt, $cp.'/page/index.html');
mkdir($cp.'/scorm', $perm);
@copy($cpt, $cp.'/scorm/index.html');
mkdir($cp.'/upload', $perm);
@copy($cpt, $cp.'/upload/index.html');
mkdir($cp.'/upload/forum', $perm);
@copy($cpt, $cp.'/upload/forum/index.html');
mkdir($cp.'/upload/forum/images', $perm);
@copy($cpt, $cp.'/upload/forum/images/index.html');
mkdir($cp.'/upload/test', $perm);
@copy($cpt, $cp.'/upload/test/index.html');
mkdir($cp.'/upload/blog', $perm);
@copy($cpt, $cp.'/upload/blog/index.html');
mkdir($cp.'/upload/learning_path', $perm);
@copy($cpt, $cp.'/upload/learning_path/index.html');
mkdir($cp.'/upload/learning_path/images', $perm);
@copy($cpt, $cp.'/upload/learning_path/images/index.html');
mkdir($cp.'/upload/calendar', $perm);
@copy($cpt, $cp.'/upload/calendar/index.html');
mkdir($cp.'/upload/calendar/images', $perm);
@copy($cpt, $cp.'/upload/calendar/images/index.html');
mkdir($cp.'/work', $perm);
@copy($cpt, $cp.'/work/index.html');
mkdir($cp.'/upload/announcements', $perm);
@copy($cpt, $cp.'/upload/announcements/index.html');
mkdir($cp.'/upload/announcements/images', $perm);
@copy($cpt, $cp.'/upload/announcements/images/index.html');
//Oral expression question type
mkdir($cp.'/exercises', $perm);
@copy($cpt, $cp.'/exercises/index.html');
// Create .htaccess in the dropbox directory.
$fp = fopen($cp.'/dropbox/.htaccess', 'w');
fwrite(
$fp,
"AuthName AllowLocalAccess
AuthType Basic
order deny,allow
deny from all
php_flag zlib.output_compression off"
);
fclose($fp);
// Build index.php of the course.
/*$fd = fopen($cp . '/index.php', 'w');
// str_replace() removes \r that cause squares to appear at the end of each line
//@todo fix the harcoded include
$string = str_replace(
"\r",
"",
"<?" . "php
\$cidReq = \"$course_code\";
\$dbname = \"$course_code\";
include(\"" . api_get_path(SYS_CODE_PATH) . "course_home/course_home.php\");
?>"
);
fwrite($fd, $string);
@chmod($cp . '/index.php', $perm_file);*/
return 0;
}
/**
* Gets an array with all the course tables (deprecated?).
*
@ -430,204 +317,11 @@ class AddCourse
$courseInfo = api_get_course_info_by_id($course_id);
$authorId = empty($authorId) ? api_get_user_id() : (int) $authorId;
$tbl_course_homepage = Database::get_course_table(TABLE_TOOL_LIST);
$TABLEGROUPCATEGORIES = Database::get_course_table(TABLE_GROUP_CATEGORY);
$TABLEITEMPROPERTY = Database::get_course_table(TABLE_ITEM_PROPERTY);
$TABLETOOLDOCUMENT = Database::get_course_table(TABLE_DOCUMENT);
$TABLESETTING = Database::get_course_table(TABLE_COURSE_SETTING);
$TABLEGRADEBOOK = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY);
$TABLEGRADEBOOKLINK = Database::get_main_table(TABLE_MAIN_GRADEBOOK_LINK);
$visible_for_course_admin = 0;
/* Course tools */
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 1, '".TOOL_COURSE_DESCRIPTION."','course_description/index.php','info.gif','".self::string2binary(
api_get_setting(
'course_create_active_tools',
'course_description'
)
)."','0','squaregrey.gif', 0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 2, '".TOOL_CALENDAR_EVENT."','calendar/agenda.php','agenda.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'agenda')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 3, '".TOOL_DOCUMENT."','document/document.php','folder_document.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'documents')
)."','0','squaregrey.gif',0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 4, '".TOOL_LEARNPATH."','lp/lp_controller.php','scorms.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'learning_path')
)."','0','squaregrey.gif',0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 5, '".TOOL_LINK."','link/link.php','links.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'links')
)."','0','squaregrey.gif',0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 6, '".TOOL_QUIZ."','exercise/exercise.php','quiz.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'quiz')
)."','0','squaregrey.gif',0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 7, '".TOOL_ANNOUNCEMENT."','announcements/announcements.php','valves.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'announcements')
)."','0','squaregrey.gif', 0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 8, '".TOOL_FORUM."','forum/index.php','forum.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'forums')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 9, '".TOOL_DROPBOX."','dropbox/index.php','dropbox.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'dropbox')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 10, '".TOOL_USER."','user/user.php','members.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'users')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 11, '".TOOL_GROUP."','group/group.php','group.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'groups')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 12, '".TOOL_CHAT."','chat/chat.php','chat.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'chat')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 13, '".TOOL_STUDENTPUBLICATION."','work/work.php','works.gif','".self::string2binary(
api_get_setting(
'course_create_active_tools',
'student_publications'
)
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 14, '".TOOL_SURVEY."','survey/survey_list.php','survey.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'survey')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 15, '".TOOL_WIKI."','wiki/index.php','wiki.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'wiki')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 16, '".TOOL_GRADEBOOK."','gradebook/index.php','gradebook.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'gradebook')
)."','0','squaregrey.gif',0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 17, '".TOOL_GLOSSARY."','glossary/index.php','glossary.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'glossary')
)."','0','squaregrey.gif',0,'_self','authoring','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 18, '".TOOL_NOTEBOOK."','notebook/index.php','notebook.gif','".self::string2binary(
api_get_setting('course_create_active_tools', 'notebook')
)."','0','squaregrey.gif',0,'_self','interaction','0')"
);
if (api_get_configuration_value('allow_portfolio_tool')) {
$tId = Database::insert(
$tbl_course_homepage,
[
'c_id' => $course_id,
'name' => 'portfolio',
'link' => 'portfolio/index.php',
'image' => 'wiki_task.png',
'visibility' => api_get_setting('course_create_active_tools', 'portfolio') == 'true' ? 1 : 0,
'admin' => 0,
'address' => 'squaregrey.gif',
'added_tool' => 0,
'target' => '_self',
'category' => 'interaction',
'session_id' => 0,
]
);
Database::update(
$tbl_course_homepage,
['id' => $tId],
['iid = ?' => $tId]
);
}
$setting = intval(self::string2binary(
api_get_setting('course_create_active_tools', 'attendances')
));
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 19, '".TOOL_ATTENDANCE."','attendance/index.php','attendance.gif','".$setting."','0','squaregrey.gif',0,'_self','authoring','0')"
);
$setting = intval(self::string2binary(
api_get_setting('course_create_active_tools', 'course_progress')
));
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 20, '".TOOL_COURSE_PROGRESS."','course_progress/index.php','course_progress.gif','".$setting."','0','squaregrey.gif',0,'_self','authoring','0')"
);
if (api_get_setting('search_enabled') === 'true') {
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 23, '".TOOL_SEARCH."','search/','info.gif','".self::string2binary(
api_get_setting(
'course_create_active_tools',
'enable_search'
)
)."','0','search.gif',0,'_self','authoring','0')"
);
}
$sql = "INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 24,'".TOOL_BLOGS."','blog/blog_admin.php','blog_admin.gif','".intval(
self::string2binary(
api_get_setting('course_create_active_tools', 'blogs')
)
)."','1','squaregrey.gif',0,'_self','admin','0')";
Database::query($sql);
/* Course homepage tools for course admin only */
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 25, '".TOOL_TRACKING."','tracking/courseLog.php','statistics.gif','$visible_for_course_admin','1','', 0,'_self','admin','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 26, '".TOOL_COURSE_SETTING."','course_info/infocours.php','reference.gif','$visible_for_course_admin','1','', 0,'_self','admin','0')"
);
Database::query(
"INSERT INTO $tbl_course_homepage (c_id, id, name, link, image, visibility, admin, address, added_tool, target, category, session_id)
VALUES ($course_id, 27, '".TOOL_COURSE_MAINTENANCE."','course_info/maintenance.php','backup.gif','$visible_for_course_admin','1','',0,'_self', 'admin','0')"
);
$alert = api_get_setting('email_alert_manager_on_new_quiz');
if ($alert === 'true') {
@ -636,46 +330,6 @@ class AddCourse
$defaultEmailExerciseAlert = 0;
}
/* course_setting table (courseinfo tool) */
$settings = [
'email_alert_manager_on_new_doc' => ['title' => '', 'default' => 0, 'category' => 'work'],
'email_alert_on_new_doc_dropbox' => ['default' => 0, 'category' => 'dropbox'],
'allow_user_edit_agenda' => ['default' => 0, 'category' => 'agenda'],
'allow_user_edit_announcement' => ['default' => 0, 'category' => 'announcement'],
'email_alert_manager_on_new_quiz' => ['default' => $defaultEmailExerciseAlert, 'category' => 'quiz'],
'allow_user_image_forum' => ['default' => 1, 'category' => 'forum'],
'course_theme' => ['default' => '', 'category' => 'theme'],
'allow_learning_path_theme' => ['default' => 1, 'category' => 'theme'],
'allow_open_chat_window' => ['default' => 1, 'category' => 'chat'],
'email_alert_to_teacher_on_new_user_in_course' => ['default' => 0, 'category' => 'registration'],
'allow_user_view_user_list' => ['default' => 1, 'category' => 'user'],
'display_info_advance_inside_homecourse' => ['default' => 1, 'category' => 'thematic_advance'],
'email_alert_students_on_new_homework' => ['default' => 0, 'category' => 'work'],
'enable_lp_auto_launch' => ['default' => 0, 'category' => 'learning_path'],
'enable_exercise_auto_launch' => ['default' => 0, 'category' => 'exercise'],
'enable_document_auto_launch' => ['default' => 0, 'category' => 'document'],
'pdf_export_watermark_text' => ['default' => '', 'category' => 'learning_path'],
'allow_public_certificates' => [
'default' => api_get_setting('allow_public_certificates') === 'true' ? 1 : '',
'category' => 'certificates',
],
'documents_default_visibility' => ['default' => 'visible', 'category' => 'document'],
'show_course_in_user_language' => ['default' => 2, 'category' => null],
'email_to_teachers_on_new_work_feedback' => ['default' => 1, 'category' => null],
];
$counter = 1;
foreach ($settings as $variable => $setting) {
$title = isset($setting['title']) ? $setting['title'] : '';
Database::query(
"INSERT INTO $TABLESETTING (id, c_id, title, variable, value, category)
VALUES ($counter, $course_id, '".$title."', '".$variable."', '".$setting['default']."', '".$setting['category']."')"
);
$counter++;
}
/* Course homepage tools for platform admin only */
/* Group tool */
Database::insert(
$TABLEGROUPCATEGORIES,
@ -1200,240 +854,183 @@ class AddCourse
*/
public static function register_course($params, $accessUrlId = 1)
{
global $error_msg, $firstExpirationDelay;
$title = $params['title'];
// Fix amp
$title = str_replace('&amp;', '&', $title);
$code = $params['code'];
$visual_code = $params['visual_code'];
$directory = $params['directory'];
$tutor_name = isset($params['tutor_name']) ? $params['tutor_name'] : null;
$category_code = isset($params['course_category']) ? $params['course_category'] : '';
$course_language = isset($params['course_language']) && !empty($params['course_language']) ? $params['course_language'] : api_get_setting(
'platformLanguage'
);
$user_id = empty($params['user_id']) ? api_get_user_id() : (int) $params['user_id'];
$department_name = isset($params['department_name']) ? $params['department_name'] : null;
$department_url = isset($params['department_url']) ? $params['department_url'] : null;
$disk_quota = isset($params['disk_quota']) ? $params['disk_quota'] : null;
if (!isset($params['visibility'])) {
$default_course_visibility = api_get_setting(
'courses_default_creation_visibility'
);
if (isset($default_course_visibility)) {
$visibility = $default_course_visibility;
} else {
$visibility = COURSE_VISIBILITY_OPEN_PLATFORM;
$title = str_replace('&amp;', '&', $params['title']);
$code = array_key_exists('code', $params) ? $params['code'] : null;
$visualCode = array_key_exists('visual_code', $params) ? $params['visual_code'] : null;
$directory = array_key_exists('directory', $params) ? $params['directory'] : null;
$tutorName = array_key_exists('tutor_name', $params) ? $params['tutor_name'] : null;
$categoryCode = array_key_exists('course_category', $params) ? $params['course_category'] : '';
$courseLanguage = array_key_exists('course_language', $params) && !empty($params['course_language'])
? $params['course_language']
: api_get_setting('platformLanguage');
$userId = empty($params['user_id']) ? api_get_user_id() : (int) $params['user_id'];
$departmentName = array_key_exists('department_name', $params) ? $params['department_name'] : null;
$departmentUrl = array_key_exists('department_url', $params) ? $params['department_url'] : null;
$diskQuota = array_key_exists('disk_quota', $params) ? $params['disk_quota'] : null;
$visibility = array_key_exists('visibility', $params) ? $params['visibility'] : null;
$subscribe = array_key_exists('subscribe', $params) ? $params['subscribe'] : null;
$unsubscribe = array_key_exists('unsubscribe', $params) ? $params['unsubscribe'] : null;
$teachers = array_key_exists('teachers', $params) ? $params['teachers'] : null;
$expirationDate = null;
if (array_key_exists('expiration_date', $params)) {
$date = $params['expiration_date'];
try {
$expirationDate = new DateTime(api_get_utc_datetime($date), new DateTimeZone('utc'));
} catch (Exception $exception) {
error_log(sprintf('expiration_date "%s" is invalid', $date));
return 0;
}
} else {
$visibility = $params['visibility'];
}
if (isset($params['subscribe'])) {
$subscribe = (int) $params['subscribe'];
} else {
$subscribe = $visibility == COURSE_VISIBILITY_OPEN_PLATFORM ? 1 : 0;
}
$unsubscribe = isset($params['unsubscribe']) ? (int) $params['unsubscribe'] : 0;
$expiration_date = isset($params['expiration_date']) ? $params['expiration_date'] : null;
$teachers = isset($params['teachers']) ? $params['teachers'] : null;
$status = isset($params['status']) ? $params['status'] : null;
$user = api_get_user_entity($userId);
if (is_null($user)) {
error_log(sprintf('user_id "%s" is invalid', $userId));
$TABLECOURSE = Database::get_main_table(TABLE_MAIN_COURSE);
$TABLECOURSUSER = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$ok_to_register_course = true;
// Check whether all the needed parameters are present.
if (empty($code)) {
$error_msg[] = 'courseSysCode is missing';
$ok_to_register_course = false;
}
if (empty($visual_code)) {
$error_msg[] = 'courseScreenCode is missing';
$ok_to_register_course = false;
}
if (empty($directory)) {
$error_msg[] = 'courseRepository is missing';
$ok_to_register_course = false;
return 0;
}
if (empty($title)) {
$error_msg[] = 'title is missing';
$ok_to_register_course = false;
$course = (new \Chamilo\CoreBundle\Entity\Course())
->setCode($code)
->setDirectory($directory)
->setCourseLanguage($courseLanguage)
->setTitle($title)
->setCategoryCode($categoryCode)
->setVisibility($visibility)
->setDiskQuota($diskQuota)
->setExpirationDate($expirationDate)
->setTutorName($tutorName)
->setDepartmentName($departmentName)
->setDepartmentUrl($departmentUrl)
->setSubscribe($subscribe)
->setUnsubscribe($unsubscribe)
->setVisualCode($visualCode)
;
Database::getManager()->persist($course);
$addTeacher = isset($params['add_user_as_teacher']) ? $params['add_user_as_teacher'] : true;
if ($addTeacher) {
$iCourseSort = CourseManager::userCourseSort($userId, $code);
$courseRelTutor = (new CourseRelUser())
->setCourse($course)
->setUser($user)
->setStatus(true)
->setTutor(true)
->setSort($iCourseSort)
->setRelationType(0)
->setUserCourseCat(0)
;
Database::getManager()->persist($courseRelTutor);
}
if (empty($expiration_date)) {
$expiration_date = api_get_utc_datetime(
time() + $firstExpirationDelay
);
} else {
$expiration_date = api_get_utc_datetime($expiration_date);
}
if ($visibility < 0 || $visibility > 4) {
$error_msg[] = 'visibility is invalid';
$ok_to_register_course = false;
if (!empty($teachers)) {
$sort = $user->getMaxSortValue();
if (!is_array($teachers)) {
$teachers = [$teachers];
}
foreach ($teachers as $key) {
// Just in case.
if ($key == $userId) {
continue;
}
if (empty($key)) {
continue;
}
$teacher = api_get_user_entity($key);
if (is_null($teacher)) {
continue;
}
$courseRelTeacher = (new CourseRelUser())
->setCourse($course)
->setUser($teacher)
->setStatus(true)
->setTutor(false)
->setSort($sort + 1)
->setRelationType(0)
->setUserCourseCat(0)
;
Database::getManager()->persist($courseRelTeacher);
}
}
if (empty($disk_quota)) {
$disk_quota = api_get_setting('default_document_quotum');
// Adding the course to an URL.
$url = api_get_access_url_entity($accessUrlId);
if (!is_null($url)) {
$urlRelCourse = (new AccessUrlRelCourse())
->setCourse($course)
->setUrl($url);
Database::getManager()->persist($urlRelCourse);
}
$time = api_get_utc_datetime();
try {
Database::getManager()->flush();
} catch (OptimisticLockException $exception) {
error_log($exception);
if (stripos($department_url, 'http://') === false && stripos(
$department_url,
'https://'
) === false
) {
$department_url = 'http://'.$department_url;
return 0;
}
// Just in case
if ($department_url === 'http://') {
$department_url = '';
}
$course_id = 0;
if ($ok_to_register_course) {
// Here we must add 2 fields.
$course_id = Database::insert(
$TABLECOURSE,
[
'code' => $code,
'directory' => $directory,
'course_language' => $course_language,
'title' => $title,
'description' => get_lang('CourseDescription'),
'category_code' => $category_code,
'visibility' => $visibility,
'show_score' => 1,
'disk_quota' => (int) $disk_quota,
'creation_date' => $time,
'expiration_date' => $expiration_date,
'last_edit' => $time,
'last_visit' => null,
'tutor_name' => $tutor_name,
'department_name' => $department_name,
'department_url' => $department_url,
'subscribe' => $subscribe,
'unsubscribe' => $unsubscribe,
'visual_code' => $visual_code,
]
);
if ($course_id) {
$sort = api_max_sort_value('0', api_get_user_id());
// Default true
$addTeacher = isset($params['add_user_as_teacher']) ? $params['add_user_as_teacher'] : true;
if ($addTeacher) {
$i_course_sort = CourseManager:: userCourseSort(
$user_id,
$code
);
if (!empty($user_id)) {
$sql = "INSERT INTO $TABLECOURSUSER SET
c_id = $course_id,
user_id = '".intval($user_id)."',
status = '1',
is_tutor = '0',
sort = '".($i_course_sort)."',
relation_type = 0,
user_course_cat = '0'";
Database::query($sql);
}
}
if (!empty($teachers)) {
if (!is_array($teachers)) {
$teachers = [$teachers];
}
foreach ($teachers as $key) {
// Just in case.
if ($key == $user_id) {
continue;
}
if (empty($key)) {
continue;
}
$sql = "INSERT INTO ".$TABLECOURSUSER." SET
c_id = '".Database::escape_string($course_id)."',
user_id = '".Database::escape_string($key)."',
status = '1',
is_tutor = '0',
sort = '".($sort + 1)."',
relation_type = 0,
user_course_cat = '0'";
Database::query($sql);
}
}
$courseId = $course->getId();
// Add event to the system log.
$userId = api_get_user_id();
Event::addEvent(
LOG_COURSE_CREATE,
LOG_COURSE_CODE,
$code,
api_get_utc_datetime(),
$userId,
$courseId
);
// Adding the course to an URL.
UrlManager::add_course_to_url($course_id, $accessUrlId);
// Add event to the system log.
$user_id = api_get_user_id();
Event::addEvent(
LOG_COURSE_CREATE,
LOG_COURSE_CODE,
$code,
api_get_utc_datetime(),
$user_id,
$course_id
);
$send_mail_to_admin = api_get_setting('send_email_to_admin_when_create_course');
$send_mail_to_admin = api_get_setting('send_email_to_admin_when_create_course');
// @todo Improve code to send to all current portal administrators.
if ($send_mail_to_admin === 'true') {
$siteName = api_get_setting('siteName');
$recipient_email = api_get_setting('emailAdministrator');
$recipient_name = api_get_person_name(
api_get_setting('administratorName'),
api_get_setting('administratorSurname')
);
$iname = api_get_setting('Institution');
$subject = get_lang('NewCourseCreatedIn').' '.$siteName.' - '.$iname;
$message = get_lang(
'Dear'
).' '.$recipient_name.",\n\n".get_lang(
'MessageOfNewCourseToAdmin'
).' '.$siteName.' - '.$iname."\n";
$message .= get_lang('CourseName').' '.$title."\n";
$message .= get_lang(
'Category'
).' '.$categoryCode."\n";
$message .= get_lang('Tutor').' '.$tutorName."\n";
$message .= get_lang('Language').' '.$courseLanguage;
$userInfo = api_get_user_info($userId);
$additionalParameters = [
'smsType' => SmsPlugin::NEW_COURSE_BEEN_CREATED,
'userId' => $userId,
'courseName' => $title,
'creatorUsername' => $userInfo['username'],
];
// @todo Improve code to send to all current portal administrators.
if ($send_mail_to_admin === 'true') {
$siteName = api_get_setting('siteName');
$recipient_email = api_get_setting('emailAdministrator');
$recipient_name = api_get_person_name(
api_get_setting('administratorName'),
api_get_setting('administratorSurname')
);
$iname = api_get_setting('Institution');
$subject = get_lang(
'NewCourseCreatedIn'
).' '.$siteName.' - '.$iname;
$message = get_lang(
'Dear'
).' '.$recipient_name.",\n\n".get_lang(
'MessageOfNewCourseToAdmin'
).' '.$siteName.' - '.$iname."\n";
$message .= get_lang('CourseName').' '.$title."\n";
$message .= get_lang(
'Category'
).' '.$category_code."\n";
$message .= get_lang('Tutor').' '.$tutor_name."\n";
$message .= get_lang('Language').' '.$course_language;
$userInfo = api_get_user_info($user_id);
$additionalParameters = [
'smsType' => SmsPlugin::NEW_COURSE_BEEN_CREATED,
'userId' => $user_id,
'courseName' => $title,
'creatorUsername' => $userInfo['username'],
];
api_mail_html(
$recipient_name,
$recipient_email,
$subject,
$message,
$siteName,
$recipient_email,
null,
null,
null,
$additionalParameters
);
}
}
api_mail_html(
$recipient_name,
$recipient_email,
$subject,
$message,
$siteName,
$recipient_email,
null,
null,
null,
$additionalParameters
);
}
return $course_id;
return $courseId;
}
/**

@ -1,10 +1,15 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\SettingsCurrent;
use Chamilo\CoreBundle\Entity\UserCourseCategory;
use Chamilo\CourseBundle\Entity\CGroupInfo;
use Chamilo\CourseBundle\Entity\CItemProperty;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\UserBundle\Entity\User;
use ChamiloSession as Session;
use Doctrine\Common\Collections\Criteria;
use PHPMailer\PHPMailer\PHPMailer as PHPMailer;
use Symfony\Component\Finder\Finder;
@ -1795,9 +1800,9 @@ function api_get_user_info(
*
* @return User
*/
function api_get_user_entity($userId)
function api_get_user_entity($userId = 0)
{
$userId = (int) $userId;
$userId = (int) $userId ?: api_get_user_id();
$repo = UserManager::getRepository();
/** @var User $user */
@ -2214,6 +2219,16 @@ function api_get_session_entity($id = 0)
return Database::getManager()->getRepository('ChamiloCoreBundle:Session')->find($id);
}
/**
* @param int $id the learning path identifier
*
* @return CLp|null
*/
function api_get_lp_entity($id)
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CLp')->find($id);
}
/**
* Returns the current course info array.
@ -2614,6 +2629,16 @@ function api_get_group_id()
return Session::read('_gid', 0);
}
/**
* @param int $id the group identifier
*
* @return CGroupInfo|object|null
*/
function api_get_group_entity($id = 0)
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CGroupInfo')->find($id ?: api_get_group_id());
}
/**
* Gets the current or given session name.
*
@ -4196,289 +4221,66 @@ function api_item_property_update(
$end_visible = '',
$session_id = 0
) {
if (empty($_course)) {
if (!array_key_exists('real_id', $_course)) {
return false;
}
$course_id = $_course['real_id'];
if (empty($course_id)) {
$course = api_get_course_entity($_course['real_id']);
if (is_null($course)) {
return false;
}
$to_group_id = 0;
if (!empty($groupInfo) && isset($groupInfo['iid'])) {
$to_group_id = (int) $groupInfo['iid'];
}
$em = Database::getManager();
// Definition of variables.
$tool = Database::escape_string($tool);
$item_id = (int) $item_id;
$lastEditTypeNoFilter = $last_edit_type;
$last_edit_type = Database::escape_string($last_edit_type);
$user_id = (int) $user_id;
$startVisible = "NULL";
if (!empty($start_visible)) {
$start_visible = Database::escape_string($start_visible);
$startVisible = "'$start_visible'";
}
$endVisible = "NULL";
if (!empty($end_visible)) {
$end_visible = Database::escape_string($end_visible);
$endVisible = "'$end_visible'";
}
$to_filter = '';
$time = api_get_utc_datetime();
if (!empty($session_id)) {
$session_id = (int) $session_id;
} else {
$session_id = api_get_session_id();
}
// Definition of tables.
$tableItemProperty = Database::get_course_table(TABLE_ITEM_PROPERTY);
if ($to_user_id <= 0) {
$to_user_id = null; // No to_user_id set
}
if (!is_null($to_user_id)) {
// $to_user_id has more priority than $to_group_id
$to_user_id = (int) $to_user_id;
$to_field = 'to_user_id';
$to_value = $to_user_id;
} else {
// $to_user_id is not set.
$to_field = 'to_group_id';
$to_value = $to_group_id;
}
$toValueCondition = empty($to_value) ? 'NULL' : "'$to_value'";
// Set filters for $to_user_id and $to_group_id, with priority for $to_user_id
$condition_session = " AND session_id = $session_id ";
if (empty($session_id)) {
$condition_session = ' AND (session_id = 0 OR session_id IS NULL) ';
}
$filter = " c_id = $course_id AND tool = '$tool' AND ref = $item_id $condition_session ";
// Check whether $to_user_id and $to_group_id are passed in the function call.
// If both are not passed (both are null) then it is a message for everybody and $to_group_id should be 0 !
if (is_null($to_user_id) && is_null($to_group_id)) {
$to_group_id = 0;
}
if (!is_null($to_user_id)) {
// Set filter to intended user.
$to_filter = " AND to_user_id = $to_user_id $condition_session";
} else {
// Set filter to intended group.
if (($to_group_id != 0) && $to_group_id == strval(intval($to_group_id))) {
$to_filter = " AND to_group_id = $to_group_id $condition_session";
}
}
// Adding filter if set.
$filter .= $to_filter;
$toUser = api_get_user_entity($to_user_id);
$toGroup = array_key_exists('iid', $groupInfo) ? api_get_group_entity($groupInfo['iid']) : null;
$user = api_get_user_entity($user_id) ?: api_get_user_entity(api_get_anonymous_id());
$session = api_get_session_entity($session_id);
// Update if possible
$set_type = '';
$startVisibleDate = empty($start_visible)
? null
: new DateTime($start_visible, new DateTimeZone('UTC'));
$endVisibleDate = empty($end_visible)
? null
: new DateTime($end_visible, new DateTimeZone('UTC'));
switch ($lastEditTypeNoFilter) {
case 'delete':
// delete = make item only visible for the platform admin.
$visibility = '2';
if (!empty($session_id)) {
// Check whether session id already exist into item_properties for updating visibility or add it.
$sql = "SELECT session_id FROM $tableItemProperty
WHERE
c_id = $course_id AND
tool = '$tool' AND
ref = $item_id AND
session_id = $session_id";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$sql = "UPDATE $tableItemProperty
SET lastedit_type = '".str_replace('_', '', ucwords($tool))."Deleted',
lastedit_date = '$time',
lastedit_user_id = $user_id,
visibility = $visibility,
session_id = $session_id $set_type
WHERE $filter";
$result = Database::query($sql);
} else {
$sql = "INSERT INTO $tableItemProperty (c_id, tool, ref, insert_date, insert_user_id, lastedit_date, lastedit_type, lastedit_user_id, $to_field, visibility, start_visible, end_visible, session_id)
VALUES ($course_id, '$tool',$item_id, '$time', $user_id, '$time', '$last_edit_type',$user_id, $toValueCondition, $visibility, $startVisible, $endVisible, $session_id)";
$result = Database::query($sql);
$id = Database::insert_id();
if ($id) {
$sql = "UPDATE $tableItemProperty SET id = iid WHERE iid = $id";
Database::query($sql);
}
}
} else {
$sql = "UPDATE $tableItemProperty
SET
lastedit_type='".str_replace('_', '', ucwords($tool))."Deleted',
lastedit_date='$time',
lastedit_user_id = $user_id,
visibility = $visibility $set_type
WHERE $filter";
$result = Database::query($sql);
}
break;
case 'visible': // Change item to visible.
$visibility = '1';
if (!empty($session_id)) {
// Check whether session id already exist into item_properties for updating visibility or add it.
$sql = "SELECT session_id FROM $tableItemProperty
WHERE
c_id = $course_id AND
tool = '$tool' AND
ref = $item_id AND
session_id = $session_id";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$sql = "UPDATE $tableItemProperty
SET
lastedit_type='".str_replace('_', '', ucwords($tool))."Visible',
lastedit_date='$time',
lastedit_user_id = $user_id,
visibility = $visibility,
session_id = $session_id $set_type
WHERE $filter";
$result = Database::query($sql);
} else {
$sql = "INSERT INTO $tableItemProperty (c_id, tool, ref, insert_date, insert_user_id, lastedit_date, lastedit_type, lastedit_user_id, $to_field, visibility, start_visible, end_visible, session_id)
VALUES ($course_id, '$tool', $item_id, '$time', $user_id, '$time', '$last_edit_type', $user_id, $toValueCondition, $visibility, $startVisible, $endVisible, $session_id)";
$result = Database::query($sql);
$id = Database::insert_id();
if ($id) {
$sql = "UPDATE $tableItemProperty SET id = iid WHERE iid = $id";
Database::query($sql);
}
}
} else {
$sql = "UPDATE $tableItemProperty
SET
lastedit_type='".str_replace('_', '', ucwords($tool))."Visible',
lastedit_date='$time',
lastedit_user_id = $user_id,
visibility = $visibility $set_type
WHERE $filter";
$result = Database::query($sql);
}
break;
case 'invisible': // Change item to invisible.
$visibility = '0';
if (!empty($session_id)) {
// Check whether session id already exist into item_properties for updating visibility or add it
$sql = "SELECT session_id FROM $tableItemProperty
WHERE
c_id = $course_id AND
tool = '$tool' AND
ref = $item_id AND
session_id = $session_id";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$sql = "UPDATE $tableItemProperty
SET
lastedit_type = '".str_replace('_', '', ucwords($tool))."Invisible',
lastedit_date = '$time',
lastedit_user_id = $user_id,
visibility = $visibility,
session_id = $session_id $set_type
WHERE $filter";
$result = Database::query($sql);
} else {
$sql = "INSERT INTO $tableItemProperty (c_id, tool, ref, insert_date, insert_user_id, lastedit_date, lastedit_type, lastedit_user_id,$to_field, visibility, start_visible, end_visible, session_id)
VALUES ($course_id, '$tool', $item_id, '$time', $user_id, '$time', '$last_edit_type', $user_id, $toValueCondition, $visibility, $startVisible, $endVisible, $session_id)";
$result = Database::query($sql);
$id = Database::insert_id();
if ($id) {
$sql = "UPDATE $tableItemProperty SET id = iid WHERE iid = $id";
Database::query($sql);
}
}
} else {
$sql = "UPDATE $tableItemProperty
SET
lastedit_type = '".str_replace('_', '', ucwords($tool))."Invisible',
lastedit_date = '$time',
lastedit_user_id = $user_id,
visibility = $visibility $set_type
WHERE $filter";
$result = Database::query($sql);
}
break;
default: // The item will be added or updated.
$set_type = ", lastedit_type = '$last_edit_type' ";
$visibility = '1';
//$filter .= $to_filter; already added
$sql = "UPDATE $tableItemProperty
SET
lastedit_date = '$time',
lastedit_user_id = $user_id $set_type
WHERE $filter";
$result = Database::query($sql);
}
// Insert if no entries are found (can only happen in case of $last_edit_type switch is 'default').
if ($result == false || Database::affected_rows($result) == 0) {
$objCourse = $em->find('ChamiloCoreBundle:Course', intval($course_id));
$objTime = new DateTime('now', new DateTimeZone('UTC'));
$objUser = api_get_user_entity($user_id);
if (empty($objUser)) {
// Use anonymous
$user_id = api_get_anonymous_id();
$objUser = api_get_user_entity($user_id);
}
$objGroup = null;
if (!empty($to_group_id)) {
$objGroup = $em->find('ChamiloCourseBundle:CGroupInfo', $to_group_id);
}
$objToUser = api_get_user_entity($to_user_id);
$objSession = $em->find('ChamiloCoreBundle:Session', intval($session_id));
$startVisibleDate = !empty($start_visible) ? new DateTime($start_visible, new DateTimeZone('UTC')) : null;
$endVisibleDate = !empty($endVisibleDate) ? new DateTime($endVisibleDate, new DateTimeZone('UTC')) : null;
$cItemProperty = new CItemProperty($objCourse);
$cItemProperty
->setTool($tool)
->setRef($item_id)
->setInsertDate($objTime)
->setInsertUser($objUser)
->setLasteditDate($objTime)
->setLasteditType($last_edit_type)
->setGroup($objGroup)
->setToUser($objToUser)
->setVisibility($visibility)
->setStartVisible($startVisibleDate)
->setEndVisible($endVisibleDate)
->setSession($objSession);
$em->persist($cItemProperty);
$em->flush();
$id = $cItemProperty->getIid();
if ($id) {
$cItemProperty->setId($id);
$em->merge($cItemProperty);
$em->flush();
return false;
}
}
$visibilityReference = [
'delete' => 2, // only site admin
'visible' => 1,
'invisible' => 0,
];
$visibility = array_key_exists($last_edit_type, $visibilityReference)
? $visibilityReference[$last_edit_type]
: 1;
$lastEditTypeFinal = array_key_exists($last_edit_type, $visibilityReference)
? sprintf('%s%s', str_replace('_', '', ucwords($tool)), ucfirst($last_edit_type))
: $last_edit_type;
/** @var CItemProperty|null $itemProperty */
$itemProperty = (
$course->getItemProperties()->matching(
Criteria::create()
->where(Criteria::expr()->eq('tool', $tool))
->andWhere(Criteria::expr()->eq('ref', $item_id))
->andWhere(Criteria::expr()->eq('session', $session))
->andWhere(
is_null($toUser)
? Criteria::expr()->eq('group', $toGroup)
: Criteria::expr()->eq('toUser', $toUser)
)
)->first() ?: (
(new CItemProperty($course))
->setTool($tool)
->setRef($item_id)
->setToUser($toUser)
->setGroup($toGroup)
->setSession($session)
)
)
->setLasteditType($lastEditTypeFinal)
->setLasteditUserId($user->getId())
->setVisibility($visibility)
->setStartVisible($startVisibleDate)
->setEndVisible($endVisibleDate);
Database::getManager()->persist($itemProperty);
Database::getManager()->flush($itemProperty);
return true;
}
@ -5263,20 +5065,11 @@ function api_get_themes($getOnlyThemeFromVirtualInstance = false)
*/
function api_max_sort_value($user_course_category, $user_id)
{
$tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$sql = "SELECT max(sort) as max_sort FROM $tbl_course_user
WHERE
user_id='".intval($user_id)."' AND
relation_type<>".COURSE_RELATION_TYPE_RRHH." AND
user_course_cat='".intval($user_course_category)."'";
$result_max = Database::query($sql);
if (Database::num_rows($result_max) == 1) {
$row_max = Database::fetch_array($result_max);
return $row_max['max_sort'];
}
/** @var User $user */
$user = User::getRepository()->find($user_id);
$userCourseCategory = UserCourseCategory::getRepository()->find($user_course_category);
return 0;
return is_null($user) ? 0 : $user->getMaxSortValue($userCourseCategory);
}
/**
@ -6620,6 +6413,18 @@ function api_get_access_url_from_user($user_id)
return $list;
}
/**
* @param int $id the access url identifier
*
* @return AccessUrl|null
*/
function api_get_access_url_entity($id = 0)
{
return Database::getManager()->getRepository('ChamiloCoreBundle:AccessUrl')->find(
$id ?: api_get_current_access_url_id()
);
}
/**
* Gets the status of a user in a course.
*

@ -48,11 +48,6 @@ class CourseManager
$hook = HookCreateCourse::create();
// Check portal limits
$accessUrlId = empty($accessUrlId)
? (api_get_multiple_access_url() ? api_get_current_access_url_id() : 1)
: $accessUrlId;
$authorId = empty($authorId) ? api_get_user_id() : (int) $authorId;
if (isset($_configuration[$accessUrlId]) && is_array($_configuration[$accessUrlId])) {
@ -76,45 +71,18 @@ class CourseManager
}
}
if (empty($params['title'])) {
return false;
}
if (empty($params['wanted_code'])) {
$params['wanted_code'] = $params['title'];
// Check whether the requested course code has already been occupied.
$substring = api_substr($params['title'], 0, self::MAX_COURSE_LENGTH_CODE);
if ($substring === false || empty($substring)) {
return false;
} else {
$params['wanted_code'] = self::generate_course_code($substring);
}
}
// Create the course keys
$keys = AddCourse::define_course_keys($params['wanted_code']);
$params['exemplary_content'] = isset($params['exemplary_content']) ? $params['exemplary_content'] : false;
if (count($keys)) {
$params['code'] = $keys['currentCourseCode'];
$params['visual_code'] = $keys['currentCourseId'];
$params['directory'] = $keys['currentCourseRepository'];
$course_info = api_get_course_info($params['code']);
if (empty($course_info)) {
$course_id = AddCourse::register_course($params, $accessUrlId);
$course_info = api_get_course_info_by_id($course_id);
if ($hook) {
$hook->setEventData(['course_info' => $course_info]);
$hook->notifyCreateCourse(HOOK_EVENT_TYPE_POST);
}
if (!empty($course_info)) {
self::fillCourse($course_info, $params, $authorId);
return $course_info;
}
$courseId = AddCourse::register_course($params, $accessUrlId);
if ($courseId) {
$courseInfo = api_get_course_info_by_id($courseId);
if ($hook) {
$hook->setEventData(['course_info' => $courseInfo]);
$hook->notifyCreateCourse(HOOK_EVENT_TYPE_POST);
}
self::fillCourse($courseInfo, $params, $authorId);
return $courseInfo;
}
return false;
@ -611,10 +579,7 @@ class CourseManager
$userId = api_get_user_id();
if (api_get_configuration_value('catalog_course_subscription_in_user_s_session')) {
/**
* @var Chamilo\UserBundle\Entity\User
*/
$user = UserManager::getRepository()->find($userId);
$user = api_get_user_entity($userId);
$sessions = $user->getCurrentlyAccessibleSessions();
if (empty($sessions)) {
// user has no accessible session
@ -1245,10 +1210,7 @@ class CourseManager
if (is_null($course)) {
return false;
}
/**
* @var \Chamilo\UserBundle\Entity\User
*/
$user = UserManager::getRepository()->find($user_id);
$user = api_get_user_entity($user_id);
if (is_null($user)) {
return false;
}
@ -7044,7 +7006,6 @@ class CourseManager
{
$authorId = empty($authorId) ? api_get_user_id() : (int) $authorId;
AddCourse::prepare_course_repository($courseInfo['directory']);
AddCourse::fill_db_course(
$courseInfo['real_id'],
$courseInfo['directory'],

@ -143,9 +143,7 @@ class UserManager
*/
public static function updatePassword($userId, $password)
{
$repository = self::getRepository();
/** @var User $user */
$user = $repository->find($userId);
$user = api_get_user_entity($userId);
$userManager = self::getManager();
$user->setPlainPassword($password);
$userManager->updateUser($user, true);
@ -737,7 +735,7 @@ class UserManager
// (extra field values of a deleted user might remain)
foreach ($itemList as $item) {
$userId = intval($item['item_id']);
$user = UserManager::getRepository()->find($userId);
$user = api_get_user_entity($userId);
if (!is_null($user)) {
if (false === $loginName) {
$loginName = $user->getUsername();
@ -1389,8 +1387,7 @@ class UserManager
}
$userManager = self::getManager();
/** @var User $user */
$user = self::getRepository()->find($user_id);
$user = api_get_user_entity($user_id);
if (empty($user)) {
return false;

@ -4,8 +4,13 @@
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ExtraFieldValues;
use Chamilo\CoreBundle\Entity\PersonalAgenda;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\SysCalendar;
use Chamilo\CourseBundle\Entity\CCalendarEvent;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\CourseBundle\Entity\CLpCategory;
use Chamilo\CourseBundle\Entity\CLpItem;
use Chamilo\CourseBundle\Entity\CNotebook;
use Chamilo\CourseBundle\Entity\Repository\CNotebookRepository;
use Chamilo\UserBundle\Entity\User;
@ -68,6 +73,10 @@ class Rest extends WebService
const USERNAME_EXIST = 'username_exist';
const GET_COURSE_QUIZ_MDL_COMPAT = 'get_course_quiz_mdl_compat';
const UPDATE_USER_PAUSE_TRAINING = 'update_user_pause_training';
const CREATE_LEARNINGPATH = 'create_learningpath';
const CREATE_USER_EVENT = 'create_user_event';
const CREATE_COURSE_EVENT = 'create_course_event';
const CREATE_GLOBAL_EVENT = 'create_global_event';
/**
* @var Session
@ -1802,8 +1811,7 @@ class Rest extends WebService
if (is_null($userId)) {
throw new Exception(get_lang('NoData'));
}
/** @var User $user */
$user = UserManager::getRepository()->find($userId);
$user = api_get_user_entity($userId);
if (empty($user)) {
throw new Exception(get_lang('CouldNotLoadUser'));
}
@ -1914,7 +1922,7 @@ class Rest extends WebService
$fieldValue = $field['field_value'];
if (!isset($fieldName) || !isset($fieldValue) ||
!UserManager::update_extra_field_value($userId, $fieldName, $fieldValue)) {
throw new Exception(get_lang('CouldNotUpdateExtraFieldValue').': '.print_r($field, true));
throw new Exception(sprintf('%s: %s', get_lang('CouldNotUpdateExtraFieldValue'), print_r($field, true)));
}
}
} else {
@ -2039,6 +2047,358 @@ class Rest extends WebService
return [$json];
}
/**
* Creates a learning path with items.
*
* @param array $spec with these keys :
* session_id
* course_code
* lp_name (learning path name)
* lp_cat_id (learning path category id)
* items, a list of items which are arrays with these keys :
* * display_order_id (position AND local item identifier, used in parent_id and prerequisite_id)
* * parent_id (references display_order_id)
* * type (c_lp_item.item_type : dir, document, quiz…)
* * name_to_find (course resource name)
* * title (learning path item title)
* * prerequisite_id (references display_order_id)
* * prerequisite_min_score
* * prerequisite_max_score
*
* @throws Exception if an item is not found by type and name or a parameter is missing
*
* @return CLp the new learning path
*/
public function createLearningPath(array $spec)
{
foreach (['course_code', 'lp_name'] as $requiredParameter) {
if (!array_key_exists($requiredParameter, $spec)) {
throw new Exception("missing parameter '$requiredParameter': ".print_r($spec, true));
}
}
$courseCode = $spec['course_code'];
$course = Course::getRepository()->findOneByCode($courseCode);
if (is_null($course)) {
throw new Exception("no course has code '$courseCode'");
}
$learningPath = (new CLp())
->setCourse($course)
->setName($spec['lp_name']);
if (array_key_exists('session_id', $spec)) {
$sessionId = $spec['session_id'];
if (0 == $sessionId) {
$learningPath->setSessionId(0);
} else {
$session = api_get_session_entity($sessionId);
if (is_null($session)) {
throw new Exception("no session has id '$sessionId'");
}
/*$learningPath->setSession($session);*/
$learningPath->setSessionId($sessionId);
}
}
if (array_key_exists('lp_cat_id', $spec)) {
$categoryId = $spec['lp_cat_id'];
if (0 == $categoryId) {
$learningPath->setCategoryId(0);
} else {
$category = CLpCategory::getRepository()->find($categoryId);
if (is_null($category)) {
throw new Exception("no category has id '$categoryId'");
}
/*$learningPath->setCategory($category);*/
$learningPath->setCategoryId($categoryId);
}
}
if (array_key_exists('items', $spec)) {
$itemSpecs = $spec['items'];
if (!is_array($itemSpecs)) {
throw new Exception('parameter "items" must be an array');
}
if (!empty($itemSpecs)) {
$parentDisplayOrders = [0 => 0];
$prerequisitesDisplayOrders = [];
foreach ($itemSpecs as $itemSpec) {
if (!array_key_exists('display_order_id', $itemSpec)) {
throw new Exception(sprintf('display_order_id missing from item spec: %s', print_r($itemSpec, true)));
}
$displayOrder = $itemSpec['display_order_id'];
$type = (array_key_exists('type', $itemSpec) ? $itemSpec['type'] : 'dir');
if (!array_key_exists('title', $itemSpec)) {
throw new Exception(sprintf('type missing from item spec: %s', print_r($itemSpec, true)));
}
$title = $itemSpec['title'];
$item = (new CLpItem())
->setLearningPath($learningPath)
->setDisplayOrder($displayOrder)
->setItemType($type)
->setTitle($title);
if (in_array($type, ['document', 'final_item', 'forum', 'link', 'quiz'])) {
if (!array_key_exists('name_to_find', $itemSpec)) {
throw new Exception(sprintf('name_to_find missing from %s spec: %s', $type, print_r($itemSpec, true)));
}
$resource = $course->findResource($type, $itemSpec['name_to_find']);
$item->setPath('forum' === $type ? $resource->getForumId() : $resource->getId());
}
if (array_key_exists($displayOrder, $parentDisplayOrders)) {
throw new Exception(sprintf('this item display order is not unique: %s', $displayOrder));
}
$parentDisplayOrders[$displayOrder] = array_key_exists('parent_id', $itemSpec)
? $itemSpec['parent_id']
: 0;
if (array_key_exists('prerequisite_id', $itemSpec)) {
$prerequisiteId = $itemSpec['prerequisite_id'];
if (!empty($prerequisiteId)) {
$prerequisitesDisplayOrders[$displayOrder] = $prerequisiteId;
if (array_key_exists('prerequisite_min_score', $itemSpec)) {
$prerequisiteMinScore = $itemSpec['prerequisite_min_score'];
if (!empty($prerequisiteMinScore)) {
$item->setPrerequisiteMinScore($prerequisiteMinScore);
}
}
if (array_key_exists('prerequisite_max_score', $itemSpec)) {
$prerequisiteMaxScore = $itemSpec['prerequisite_max_score'];
if (!empty($prerequisiteMaxScore)) {
$item->setPrerequisiteMaxScore($prerequisiteMaxScore);
}
}
}
}
}
Database::getManager()->persist($learningPath);
Database::getManager()->flush();
// now that items have real identifiers, set their parent, previous, next and prerequisite item ones
$idFromDisplayOrder = [0 => 0];
/** @var CLpItem $item */
foreach ($learningPath->getItems() as $item) {
$idFromDisplayOrder[$item->getDisplayOrder()] = $item->getId();
}
$displayOrderNumbers = array_keys($idFromDisplayOrder);
sort($displayOrderNumbers);
foreach ($learningPath->getItems() as $item) {
$displayOrder = $item->getDisplayOrder();
$item->setParentItemId($idFromDisplayOrder[$parentDisplayOrders[$displayOrder]]);
if (!empty($prerequisitesDisplayOrders[$displayOrder])) {
$item->setPrerequisite($idFromDisplayOrder[$prerequisitesDisplayOrders[$displayOrder]]);
}
}
}
}
Database::getManager()->flush();
return $learningPath;
}
/**
* Creates a new event in a user's agenda.
*
* @param array $spec with these keys :
* loginname
* eventTitle
* eventText
* eventStartDate
* eventEndDate
*
* @throws Exception
*
* @return int the new event identifier
*/
public function createUserEvent(array $spec)
{
foreach (['loginname', 'eventTitle', 'eventText', 'eventStartDate', 'eventEndDate'] as $param) {
if (!array_key_exists($param, $spec) || empty($spec[$param]) || !is_string($spec[$param])) {
throw new Exception(sprintf('Missing or invalid parameter "%s": %s.', $param, print_r($spec, true)));
}
}
$loginname = $spec['loginname'];
$user = User::getRepository()->findOneBy(['username' => $loginname]);
if (is_null($user)) {
throw new Exception('No user has id '.$loginname);
}
$utc = new DateTimeZone('utc');
$dateSpec = $spec['eventStartDate'];
try {
$date = new DateTime($dateSpec, $utc);
} catch (Exception $exception) {
try {
$date = new DateTime($dateSpec);
} catch (Exception $exception) {
throw new Exception(sprintf('invalid eventStartDate: "%s"', $dateSpec));
}
}
$endDateSpec = $spec['eventEndDate'];
try {
$endDate = new DateTime($endDateSpec, $utc);
} catch (Exception $exception) {
try {
$endDate = new DateTime($endDateSpec);
} catch (Exception $exception) {
throw new Exception(sprintf('invalid eventEndDate: "%s"', $endDateSpec));
}
}
$event = (new PersonalAgenda())
->setUser($user->getId())
->setTitle($spec['eventTitle'])
->setText($spec['eventText'])
->setDate($date)
->setEnddate($endDate)
->setAllDay(0);
Database::getManager()->persist($event);
Database::getManager()->flush($event);
return $event->getId();
}
/**
* Creates a new event in a course's agenda.
*
* @param array $spec with these keys :
* course_code
* session_id
* eventTitle
* eventText
* eventStartDate
* eventEndDate
*
* @throws Exception
*
* @return int the new event identifier
*/
public function createCourseEvent(array $spec)
{
foreach (['course_code', 'eventTitle', 'eventText', 'eventStartDate', 'eventEndDate'] as $param) {
if (!array_key_exists($param, $spec) || empty($spec[$param]) || !is_string($spec[$param])) {
throw new Exception(sprintf('Missing or invalid parameter "%s": %s.', $param, print_r($spec, true)));
}
}
$courseCode = $spec['course_code'];
$course = Course::getRepository()->findOneBy(['code' => $courseCode]);
if (is_null($course)) {
throw new Exception(sprintf('No course has code "%s"', $courseCode));
}
$sessionId = array_key_exists('session_id', $spec) ? $spec['session_id'] : 0;
if (!empty($sessionId)) {
// make sure the session id is valid (not really necessary, just safer)
$session = Session::getRepository()->find($sessionId);
if (is_null($session)) {
throw new Exception(sprintf('No session has id "%s"', $sessionId));
}
}
$utc = new DateTimeZone('utc');
$startDateSpec = $spec['eventStartDate'];
try {
$startDate = new DateTime($startDateSpec, $utc);
} catch (Exception $exception) {
try {
$startDate = new DateTime($startDateSpec);
} catch (Exception $exception) {
throw new Exception(sprintf('invalid eventStartDate: "%s"', $startDateSpec));
}
}
$endDateSpec = $spec['eventEndDate'];
try {
$endDate = new DateTime($endDateSpec, $utc);
} catch (Exception $exception) {
try {
$endDate = new DateTime($endDateSpec);
} catch (Exception $exception) {
throw new Exception(sprintf('invalid eventEndDate: "%s"', $endDateSpec));
}
}
$event = (new CCalendarEvent())
->setCId($course->getId())
->setSessionId($sessionId)
->setTitle($spec['eventTitle'])
->setContent($spec['eventText'])
->setStartDate($startDate)
->setEnddate($endDate)
->setAllDay(0);
Database::getManager()->persist($event);
Database::getManager()->flush($event);
$courseInfo = api_get_course_info_by_id($course->getId());
$userId = $this->getUser()->getId();
api_item_property_update(
$courseInfo,
TOOL_CALENDAR_EVENT,
$event->getId(),
'AgendaAdded',
$userId,
[],
null,
$startDate->format('c'),
$endDate->format('c'),
$sessionId
);
api_item_property_update(
$courseInfo,
TOOL_CALENDAR_EVENT,
$event->getId(),
'visible',
$userId,
[],
null,
$startDate->format('c'),
$endDate->format('c'),
$sessionId
);
return $event->getId();
}
/**
* Creates a new event in the global agenda.
*
* @param array $spec with these keys :
* eventTitle
* eventText
* eventStartDate
* eventEndDate
*
* @throws Exception
*
* @return int the new event identifier
*/
public function createGlobalEvent(array $spec)
{
foreach (['eventTitle', 'eventText', 'eventStartDate', 'eventEndDate'] as $param) {
if (!array_key_exists($param, $spec) || empty($spec[$param]) || !is_string($spec[$param])) {
throw new Exception(sprintf('Missing or invalid parameter "%s": %s.', $param, print_r($spec, true)));
}
}
$utc = new DateTimeZone('utc');
$startDateSpec = $spec['eventStartDate'];
try {
$startDate = new DateTime($startDateSpec, $utc);
} catch (Exception $exception) {
try {
$startDate = new DateTime($startDateSpec);
} catch (Exception $exception) {
throw new Exception(sprintf('invalid eventStartDate: "%s"', $startDateSpec));
}
}
$endDateSpec = $spec['eventEndDate'];
try {
$endDate = new DateTime($endDateSpec, $utc);
} catch (Exception $exception) {
try {
$endDate = new DateTime($endDateSpec);
} catch (Exception $exception) {
throw new Exception(sprintf('invalid eventEndDate: "%s"', $endDateSpec));
}
}
$event = (new SysCalendar())
->setTitle($spec['eventTitle'])
->setContent($spec['eventText'])
->setStartDate($startDate)
->setEnddate($endDate)
->setAllDay(0);
Database::getManager()->persist($event);
Database::getManager()->flush($event);
return $event->getId();
}
/**
* @param array $additionalParams Optional
*

@ -2,7 +2,6 @@
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Repository\CourseRepository;
use Chamilo\CoreBundle\Entity\Repository\ItemPropertyRepository;
use Chamilo\CourseBundle\Component\CourseCopy\CourseArchiver;
use Chamilo\CourseBundle\Component\CourseCopy\CourseBuilder;
@ -508,215 +507,91 @@ class learnpath
$previous = (int) $previous;
$id = (int) $id;
$max_time_allowed = htmlentities($max_time_allowed);
if (empty($max_time_allowed)) {
$max_time_allowed = 0;
}
$sql = "SELECT COUNT(iid) AS num
FROM $tbl_lp_item
WHERE
c_id = $course_id AND
lp_id = ".$this->get_id()." AND
parent_item_id = $parent ";
$res_count = Database::query($sql);
$row = Database::fetch_array($res_count);
$num = $row['num'];
$tmp_previous = 0;
$display_order = 0;
$next = 0;
if ($num > 0) {
if (empty($previous)) {
$sql = "SELECT iid, next_item_id, display_order
FROM $tbl_lp_item
WHERE
c_id = $course_id AND
lp_id = ".$this->get_id()." AND
parent_item_id = $parent AND
previous_item_id = 0 OR
previous_item_id = $parent";
$result = Database::query($sql);
$row = Database::fetch_array($result);
if ($row) {
$next = $row['iid'];
}
} else {
$previous = (int) $previous;
$sql = "SELECT iid, previous_item_id, next_item_id, display_order
FROM $tbl_lp_item
WHERE
c_id = $course_id AND
lp_id = ".$this->get_id()." AND
id = $previous";
$result = Database::query($sql);
$row = Database::fetch_array($result);
if ($row) {
$tmp_previous = $row['iid'];
$next = $row['next_item_id'];
$display_order = $row['display_order'];
}
}
}
$id = (int) $id;
$typeCleaned = Database::escape_string($type);
$max_score = 100;
if ($type === 'quiz' && $id) {
$sql = 'SELECT SUM(ponderation)
FROM '.Database::get_course_table(TABLE_QUIZ_QUESTION).' as quiz_question
INNER JOIN '.Database::get_course_table(TABLE_QUIZ_TEST_QUESTION).' as quiz_rel_question
ON
quiz_question.id = quiz_rel_question.question_id AND
quiz_question.c_id = quiz_rel_question.c_id
WHERE
quiz_rel_question.exercice_id = '.$id." AND
quiz_question.c_id = $course_id AND
quiz_rel_question.c_id = $course_id ";
$rsQuiz = Database::query($sql);
$max_score = Database::result($rsQuiz, 0, 0);
// Disabling the exercise if we add it inside a LP
$exercise = new Exercise($course_id);
$exercise->read($id);
$exercise->disable();
$exercise->save();
}
$params = [
'c_id' => $course_id,
'lp_id' => $this->get_id(),
'item_type' => $typeCleaned,
'ref' => '',
'title' => $title,
'description' => $description,
'path' => $id,
'max_score' => $max_score,
'parent_item_id' => $parent,
'previous_item_id' => $previous,
'next_item_id' => (int) $next,
'display_order' => $display_order + 1,
'prerequisite' => $prerequisites,
'max_time_allowed' => $max_time_allowed,
'min_score' => 0,
'launch_data' => '',
];
if ($prerequisites != 0) {
$params['prerequisite'] = $prerequisites;
}
$new_item_id = Database::insert($tbl_lp_item, $params);
if ($new_item_id) {
$sql = "UPDATE $tbl_lp_item SET id = iid WHERE iid = $new_item_id";
Database::query($sql);
if (!empty($next)) {
$sql = "UPDATE $tbl_lp_item
SET previous_item_id = $new_item_id
WHERE c_id = $course_id AND id = $next AND item_type != '".TOOL_LP_FINAL_ITEM."'";
Database::query($sql);
}
// Update the item that should be before the new item.
if (!empty($tmp_previous)) {
$sql = "UPDATE $tbl_lp_item
SET next_item_id = $new_item_id
WHERE c_id = $course_id AND id = $tmp_previous";
Database::query($sql);
}
// Update all the items after the new item.
$sql = "UPDATE $tbl_lp_item
SET display_order = display_order + 1
WHERE
c_id = $course_id AND
lp_id = ".$this->get_id()." AND
iid <> $new_item_id AND
parent_item_id = $parent AND
display_order > $display_order";
Database::query($sql);
// Update the item that should come after the new item.
$sql = "UPDATE $tbl_lp_item
SET ref = $new_item_id
WHERE c_id = $course_id AND iid = $new_item_id";
Database::query($sql);
$sql = "UPDATE $tbl_lp_item
SET previous_item_id = ".$this->getLastInFirstLevel()."
WHERE c_id = $course_id AND lp_id = {$this->lp_id} AND item_type = '".TOOL_LP_FINAL_ITEM."'";
Database::query($sql);
// Upload audio.
if (!empty($_FILES['mp3']['name'])) {
// Create the audio folder if it does not exist yet.
$filepath = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document/';
if (!is_dir($filepath.'audio')) {
mkdir(
$filepath.'audio',
api_get_permissions_for_new_directories()
);
$audio_id = add_document(
$_course,
'/audio',
'folder',
0,
'audio',
'',
0,
true,
null,
$sessionId,
$userId
);
api_item_property_update(
$_course,
TOOL_DOCUMENT,
$audio_id,
'FolderCreated',
$userId,
null,
null,
null,
null,
$sessionId
);
api_item_property_update(
$_course,
TOOL_DOCUMENT,
$audio_id,
'invisible',
$userId,
null,
null,
null,
null,
$sessionId
);
}
$file_path = handle_uploaded_document(
$course = api_get_course_entity($course_id);
$learningPath = api_get_lp_entity($this->get_id());
$item = (new CLpItem())
->setCourse($course)
->setLearningPath($learningPath)
->setItemType($type)
->setTitle($title)
->setDescription($description)
->setPath($id)
->setParentItemId($parent)
->setPrerequisite($prerequisites)
->setMaxTimeAllowed($max_time_allowed)
;
// Upload audio.
if (!empty($_FILES['mp3']['name'])) {
// Create the audio folder if it does not exist yet.
$filepath = api_get_path(SYS_COURSE_PATH).$_course['path'].'/document/';
if (!is_dir($filepath.'audio')) {
mkdir(
$filepath.'audio',
api_get_permissions_for_new_directories()
);
$audio_id = add_document(
$_course,
$_FILES['mp3'],
api_get_path(SYS_COURSE_PATH).$_course['path'].'/document',
'/audio',
$userId,
'',
'',
'',
'folder',
0,
'audio',
'',
false
0,
true,
null,
$sessionId,
$userId
);
api_item_property_update(
$_course,
TOOL_DOCUMENT,
$audio_id,
'FolderCreated',
$userId,
null,
null,
null,
null,
$sessionId
);
api_item_property_update(
$_course,
TOOL_DOCUMENT,
$audio_id,
'invisible',
$userId,
null,
null,
null,
null,
$sessionId
);
// Store the mp3 file in the lp_item table.
$sql = "UPDATE $tbl_lp_item SET
audio = '".Database::escape_string($file_path)."'
WHERE iid = '".intval($new_item_id)."'";
Database::query($sql);
}
$file_path = handle_uploaded_document(
$_course,
$_FILES['mp3'],
api_get_path(SYS_COURSE_PATH).$_course['path'].'/document',
'/audio',
$userId,
'',
'',
'',
'',
false
);
// Store the mp3 file in the lp_item table.
$item->setAudio($file_path);
}
return $new_item_id;
\Database::getManager()->persist($item);
\Database::getManager()->flush($item);
$learningPath->updateFinalItemsPreviousItemId();
return $item->getId();
}
/**
@ -725,13 +600,13 @@ class learnpath
* @param string $courseCode
* @param string $name
* @param string $description
* @param string $learnpath
* @param string $origin
* @param string $zipname Zip file containing the learnpath or directory containing the learnpath
* @param string $learnpath (unused)
* @param string $origin (if 'zip', this function does nothing)
* @param string $zipname (unused)
* @param string $publicated_on
* @param string $expired_on
* @param int $categoryId
* @param int $userId
* @param int $userId (unused)
*
* @return int The new learnpath ID on success, 0 on failure
*/
@ -749,138 +624,27 @@ class learnpath
) {
global $charset;
if (!empty($courseCode)) {
$courseInfo = api_get_course_info($courseCode);
$course_id = $courseInfo['real_id'];
} else {
$course_id = api_get_course_int_id();
$courseInfo = api_get_course_info();
}
if ('zip' !== $origin) {
$course_id = api_get_course_int_id($courseCode);
if ($course_id) {
$course = api_get_course_entity($course_id);
if (!is_null($course)) {
$learningPath = (new CLp())
->setCourse($course)
->setName($name)
->setDescription(api_htmlentities($description, ENT_QUOTES, $charset))
->setPublicatedOn(api_get_utc_datetime($publicated_on, true, true))
->setExpiredOn(api_get_utc_datetime($expired_on, true, true))
->setCategoryId($categoryId);
Database::getManager()->persist($learningPath);
Database::getManager()->flush();
$tbl_lp = Database::get_course_table(TABLE_LP_MAIN);
// Check course code exists.
// Check lp_name doesn't exist, otherwise append something.
$i = 0;
$categoryId = (int) $categoryId;
// Session id.
$session_id = api_get_session_id();
$userId = empty($userId) ? api_get_user_id() : $userId;
if (empty($publicated_on)) {
$publicated_on = null;
} else {
$publicated_on = Database::escape_string(api_get_utc_datetime($publicated_on));
}
if (empty($expired_on)) {
$expired_on = null;
} else {
$expired_on = Database::escape_string(api_get_utc_datetime($expired_on));
}
$check_name = "SELECT * FROM $tbl_lp
WHERE c_id = $course_id AND name = '".Database::escape_string($name)."'";
$res_name = Database::query($check_name);
while (Database::num_rows($res_name)) {
// There is already one such name, update the current one a bit.
$i++;
$name = $name.' - '.$i;
$check_name = "SELECT * FROM $tbl_lp
WHERE c_id = $course_id AND name = '".Database::escape_string($name)."' ";
$res_name = Database::query($check_name);
}
// New name does not exist yet; keep it.
// Escape description.
// Kevin: added htmlentities().
$description = Database::escape_string(api_htmlentities($description, ENT_QUOTES, $charset));
$type = 1;
switch ($learnpath) {
case 'guess':
break;
case 'dokeos':
case 'chamilo':
$type = 1;
break;
case 'aicc':
break;
}
switch ($origin) {
case 'zip':
// Check zip name string. If empty, we are currently creating a new Chamilo learnpath.
break;
case 'manual':
default:
$get_max = "SELECT MAX(display_order)
FROM $tbl_lp WHERE c_id = $course_id";
$res_max = Database::query($get_max);
if (Database::num_rows($res_max) < 1) {
$dsp = 1;
} else {
$row = Database::fetch_array($res_max);
$dsp = $row[0] + 1;
}
$params = [
'c_id' => $course_id,
'lp_type' => $type,
'name' => $name,
'description' => $description,
'path' => '',
'default_view_mod' => 'embedded',
'default_encoding' => 'UTF-8',
'display_order' => $dsp,
'content_maker' => 'Chamilo',
'content_local' => 'local',
'js_lib' => '',
'session_id' => $session_id,
'created_on' => api_get_utc_datetime(),
'modified_on' => api_get_utc_datetime(),
'publicated_on' => $publicated_on,
'expired_on' => $expired_on,
'category_id' => $categoryId,
'force_commit' => 0,
'content_license' => '',
'debug' => 0,
'theme' => '',
'preview_image' => '',
'author' => '',
'prerequisite' => 0,
'hide_toc_frame' => 0,
'seriousgame_mode' => 0,
'autolaunch' => 0,
'max_attempts' => 0,
'subscribe_users' => 0,
'accumulate_scorm_time' => 1,
];
$id = Database::insert($tbl_lp, $params);
if ($id > 0) {
$sql = "UPDATE $tbl_lp SET id = iid WHERE iid = $id";
Database::query($sql);
// Insert into item_property.
api_item_property_update(
$courseInfo,
TOOL_LEARNPATH,
$id,
'LearnpathAdded',
$userId
);
api_set_default_visibility(
$id,
TOOL_LEARNPATH,
0,
$courseInfo,
$session_id,
$userId
);
return $id;
return $learningPath->getId();
}
break;
}
}
return 0;
}
/**
@ -4658,14 +4422,12 @@ class learnpath
/** @var ItemPropertyRepository $itemRepo */
$itemRepo = $em->getRepository('ChamiloCourseBundle:CItemProperty');
/** @var CourseRepository $courseRepo */
$courseRepo = $em->getRepository('ChamiloCoreBundle:Course');
$session = null;
if (!empty($sessionId)) {
$session = $em->getRepository('ChamiloCoreBundle:Session')->find($sessionId);
$session = api_get_session_entity($sessionId);
}
$course = $courseRepo->find($courseId);
$course = api_get_course_entity($courseId);
if ($courseId != 0) {
// Subscribed groups to a LP

@ -57,10 +57,10 @@ $itemRepo = $em->getRepository('ChamiloCourseBundle:CItemProperty');
/** @var Session $session */
$session = null;
if (!empty($sessionId)) {
$session = $em->getRepository('ChamiloCoreBundle:Session')->find($sessionId);
$session = api_get_session_entity($sessionId);
}
$course = $courseRepo->find($courseId);
$course = api_get_course_entity($courseId);
$subscribedUsers = [];
// Getting subscribe users to the course.
@ -159,7 +159,7 @@ if (!empty($selectedGroupChoices)) {
}
$form->setDefaults($defaults);
$currentUser = api_get_user_entity(api_get_user_id());
$currentUser = api_get_user_entity();
if ($form->validate()) {
$values = $form->getSubmitValues();

@ -176,7 +176,7 @@ if ($formUsers->validate()) {
foreach ($users as $userId) {
$categoryUser = new CLpCategoryUser();
$user = UserManager::getRepository()->find($userId);
$user = api_get_user_entity($userId);
if ($user) {
$categoryUser->setUser($user);
$category->addUser($categoryUser);

@ -86,7 +86,7 @@ if (!$is_allowed_to_edit) {
$category = $em->getRepository('ChamiloCourseBundle:CLpCategory')->find($categoryId);
$block = false;
if ($category) {
$user = UserManager::getRepository()->find($user_id);
$user = api_get_user_entity($user_id);
$users = $category->getUsers();
if (!empty($users) && $users->count() > 0) {
if ($user && !$category->hasUserAdded($user)) {

@ -99,7 +99,7 @@ switch ($action) {
}
$view = $em->getRepository('ChamiloCourseBundle:CLpView')->find($itemView->getLpViewId());
$lp = $em->getRepository('ChamiloCourseBundle:CLp')->find($view->getLpId());
$lp = api_get_lp_entity($view->getLpId());
$duration = learnpathItem::getScormTimeFromParameter('js', $itemView->getTotalTime());
$endTime = $itemView->getStartTime() + $itemView->getTotalTime();

@ -4,7 +4,6 @@
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Repository\SequenceResourceRepository;
use Chamilo\CoreBundle\Entity\Repository\SessionRepository;
use Chamilo\CoreBundle\Entity\SequenceResource;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
@ -48,10 +47,7 @@ $table_access_url_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER
$em = Database::getManager();
$sessionInfo = api_get_session_info($sessionId);
/** @var SessionRepository $sessionRepository */
$sessionRepository = $em->getRepository('ChamiloCoreBundle:Session');
/** @var Session $session */
$session = $sessionRepository->find($sessionId);
$session = api_get_session_entity($sessionId);
$sessionCategory = $session->getCategory();
$action = isset($_GET['action']) ? $_GET['action'] : null;
@ -165,6 +161,7 @@ if ($session->getNbrCourses() === 0) {
} else {
$count = 0;
$courseItem = '';
$sessionRepository = $em->getRepository('ChamiloCoreBundle:Session');
$courses = $sessionRepository->getCoursesOrderedByPosition($session);
$allowSkills = api_get_configuration_value('allow_skill_rel_items');

@ -0,0 +1,116 @@
<?php
/* For licensing terms, see /license.txt */
require_once __DIR__.'/V2TestCase.php';
require_once __DIR__.'/../../../../vendor/autoload.php';
class CreateCourseEventTest extends V2TestCase
{
/**
* @var \Chamilo\CoreBundle\Entity\Course
*/
private static $course;
/**
* @var \Chamilo\CoreBundle\Entity\Session
*/
private static $session;
public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
self::$course = \Chamilo\CoreBundle\Entity\Course::getRepository()->findOneBy(['code' => 'TESTCOURSE']);
if (is_null(self::$course)) {
self::$course = (new \Chamilo\CoreBundle\Entity\Course())
->setCode('TESTCOURSE')
->setTitle('Test Course');
Database::getManager()->persist(self::$course);
Database::getManager()->flush();
}
self::$session = \Chamilo\CoreBundle\Entity\Session::getRepository()->findOneBy(['name' => 'Test Session']);
if (is_null(self::$session)) {
self::$session = (new \Chamilo\CoreBundle\Entity\Session())
->setName('Test Session');
Database::getManager()->persist(self::$course);
Database::getManager()->flush();
}
}
public function action()
{
return Rest::CREATE_COURSE_EVENT;
}
/**
* Creates an event for the predefined course.
*/
public function testCreateCourseEvent()
{
$eventTitle = 'A course in session meeting';
$eventText = 'Do not be late';
$timezone = new DateTimeZone('utc');
$eventStartDate = new DateTime('tomorrow', $timezone);
$eventEndDate = clone $eventStartDate;
$eventEndDate->add(new DateInterval('PT2H'));
$eventId = $this->integer(
[
'course_code' => self::$course->getCode(),
'session_id' => 0,
'eventTitle' => $eventTitle,
'eventText' => $eventText,
'eventStartDate' => $eventStartDate->format('c'),
'eventEndDate' => $eventEndDate->format('c'),
]
);
$event = Database::getManager()->getRepository('ChamiloCourseBundle:CCalendarEvent')->find($eventId);
self::assertNotNull($event, sprintf('Could not get event %d', $eventId));
self::assertEquals(self::$course->getId(), $event->getCId());
self::assertEmpty($event->getSessionId());
self::assertEquals($eventTitle, $event->getTitle());
self::assertEquals($eventText, $event->getContent());
self::assertEquals($eventStartDate, $event->getStartDate());
self::assertEquals($eventEndDate, $event->getEnddate());
}
/**
* Creates an event for the predefined course in the predefined session.
*
* @throws Exception
*/
public function testCreateCourseInSessionEvent()
{
$eventTitle = 'A course meeting';
$eventText = 'Do not be late';
$timezone = new DateTimeZone('utc');
$eventStartDate = new DateTime('tomorrow', $timezone);
$eventEndDate = clone $eventStartDate;
$eventEndDate->add(new DateInterval('PT2H'));
$eventId = $this->integer(
[
'course_code' => self::$course->getCode(),
'session_id' => self::$session->getId(),
'eventTitle' => $eventTitle,
'eventText' => $eventText,
'eventStartDate' => $eventStartDate->format('c'),
'eventEndDate' => $eventEndDate->format('c'),
]
);
$event = Database::getManager()->getRepository('ChamiloCourseBundle:CCalendarEvent')->find($eventId);
self::assertNotNull($event, sprintf('Could not get event %d', $eventId));
self::assertEquals(self::$course->getId(), $event->getCId());
self::assertEquals(self::$session->getId(), $event->getSessionId());
self::assertEquals($eventTitle, $event->getTitle());
self::assertEquals($eventText, $event->getContent());
self::assertEquals($eventStartDate, $event->getStartDate());
self::assertEquals($eventEndDate, $event->getEnddate());
}
}

@ -0,0 +1,42 @@
<?php
/* For licensing terms, see /license.txt */
require_once __DIR__.'/V2TestCase.php';
require_once __DIR__.'/../../../../vendor/autoload.php';
class CreateGlobalEventTest extends V2TestCase
{
public function action()
{
return Rest::CREATE_GLOBAL_EVENT;
}
/**
* Creates a global event.
*/
public function testCreateGlobalEvent()
{
$eventTitle = 'Summer holidays';
$eventText = 'Rest and have fun';
$timezone = new DateTimeZone('utc');
$eventStartDate = new DateTime('tomorrow', $timezone);
$eventEndDate = clone $eventStartDate;
$eventEndDate->add(new DateInterval('PT2H'));
$eventId = $this->integer(
[
'eventTitle' => $eventTitle,
'eventText' => $eventText,
'eventStartDate' => $eventStartDate->format('c'),
'eventEndDate' => $eventEndDate->format('c'),
]
);
$event = Database::getManager()->getRepository('ChamiloCoreBundle:SysCalendar')->find($eventId);
self::assertNotNull($event, sprintf('Could not get event %d', $eventId));
self::assertEquals($eventTitle, $event->getTitle());
self::assertEquals($eventText, $event->getContent());
self::assertEquals($eventStartDate, $event->getStartDate());
self::assertEquals($eventEndDate, $event->getEndDate());
}
}

@ -0,0 +1,347 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Entity\CForumForum;
use Chamilo\CourseBundle\Entity\CLink;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\CourseBundle\Entity\CLpCategory;
use Chamilo\CourseBundle\Entity\CQuiz;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Doctrine\ORM\TransactionRequiredException;
require_once __DIR__.'/V2TestCase.php';
require_once __DIR__.'/../../../../vendor/autoload.php';
/**
* Class CreateLearningPathTest
*
* CREATE_LEARNINGPATH webservice unit tests
*/
class CreateLearningPathTest extends V2TestCase
{
/** @var Session */
public static $session;
/** @var Course */
public static $course;
/** @var CLpCategory */
public static $category;
/** @var CDocument */
public static $document;
/** @var CForumForum */
public static $forum;
/** @var CLink */
public static $link;
/** @var CQuiz */
public static $quiz;
public function action()
{
return Rest::CREATE_LEARNINGPATH;
}
/**
* @inheritDoc
*
* @throws ORMException
* @throws OptimisticLockException
* @throws TransactionRequiredException
*/
public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
self::$session = Session::getRepository()->findOneByName('Test Session');
if (is_null(self::$session)) {
self::$session = (new Session())
->setName('Test Session');
Database::getManager()->persist(self::$session);
Database::getManager()->flush();
}
self::$course = Course::getRepository()->findOneByCode('TESTCOURSE');
if (is_null(self::$course)) {
self::$course = (new Course())
->setCode('TESTCOURSE')
->setTitle('Test Course');
Database::getManager()->persist(self::$course);
Database::getManager()->flush();
}
self::$category = CLpCategory::getRepository()->findOneByName('Test Category');
if (is_null(self::$category)) {
self::$category = (new CLpCategory())
->setCourse(self::$course)
->setName('Test Category');
Database::getManager()->persist(self::$category);
Database::getManager()->flush();
}
self::$document = CDocument::getRepository()->findOneByTitle('Test Document');
if (is_null(self::$document)) {
self::$document = CDocument::fromFile(
__FILE__,
self::$course,
'test_document.txt',
'Test Document'
);
Database::getManager()->persist(self::$document);
Database::getManager()->flush();
}
self::$forum = CForumForum::getRepository()->findOneByForumTitle('Test Forum');
if (is_null(self::$forum)) {
self::$forum = (new CForumForum())
->setCourse(self::$course)
->setForumTitle('Test Forum');
Database::getManager()->persist(self::$forum);
Database::getManager()->flush();
}
self::$link = Clink::getRepository()->findOneByTitle('Test Link');
if (is_null(self::$link)) {
self::$link = (new CLink())
->setCourse(self::$course)
->setTitle('Test Link ')
->setUrl('https://chamilo.org/');
Database::getManager()->persist(self::$link);
Database::getManager()->flush();
}
self::$quiz = CQuiz::getRepository()->findOneByTitle('Test Quiz');
if (is_null(self::$quiz)) {
self::$quiz = (new CQuiz())
->setCourse(self::$course)
->setTitle('Test Quiz ');
Database::getManager()->persist(self::$quiz);
Database::getManager()->flush();
}
}
/**
* creates an empty learning path
* asserts that the learning path was created for the right session and course, with the right name,
* in the right category and that it has no item
*/
public function testCreateEmptyLearningPathWithoutSessionNorCategory()
{
// call the webservice to create the learning path
$name = 'Learning Path '.time();
$learningPathId = $this->integer(
[
'session_id' => 0,
'course_code' => self::$course->getCode(),
'lp_name' => $name,
'lp_cat_id' => 0,
'items' => [],
]
);
// assert the learning path was created
/** @var CLp $learningPath */
$learningPath = api_get_lp_entity($learningPathId);
self::assertNotNull($learningPath);
// in the right course
self::assertEquals(0, $learningPath->getSessionId());
// with no session nor category
self::assertEquals(self::$course->getId(), $learningPath->getCId());
self::assertEquals(0, $learningPath->getCategoryId());
// with the right name
self::assertEquals($name, $learningPath->getName());
// with no item
self::assertEmpty($learningPath->getItems());
}
/**
* creates an empty learning path
* asserts that the learning path was created for the right session and course, with the right name,
* in the right category and that it has no item
*/
public function testCreateEmptyLearningPath()
{
// call the webservice to create the learning path
$name = 'Learning Path '.time();
$learningPathId = $this->integer(
[
'session_id' => self::$session->getId(),
'course_code' => self::$course->getCode(),
'lp_name' => $name,
'lp_cat_id' => self::$category->getId(),
'items' => [],
]
);
// assert the learning path was created
$learningPath = api_get_lp_entity($learningPathId);
self::assertNotNull($learningPath);
// in the right session, course and category
self::assertEquals(self::$session->getId(), $learningPath->getSessionId());
self::assertEquals(self::$course->getId(), $learningPath->getCId());
self::assertEquals(self::$category->getId(), $learningPath->getCategoryId());
// with the right name
self::assertEquals($name, $learningPath->getName());
// with no item
self::assertEmpty($learningPath->getItems());
}
/**
* creates a learning path with items
* asserts that the learning path items have the right properties
*/
public function testCreateLearningPathWithItems()
{
$name = 'Learning Path '.time();
$items = [
[
'display_order_id' => 10,
'parent_id' => 0,
'type' => 'document',
'name_to_find' => self::$document->getTitle(),
'title' => 'Document title '.time(),
],
[
'display_order_id' => 40,
'parent_id' => 0,
'type' => 'forum',
'name_to_find' => self::$forum->getForumTitle(),
'title' => 'Forum title '.time(),
'prerequisite_id' => 20,
'prerequisite_min_score' => 1,
'prerequisite_max_score' => 1,
],
[
'display_order_id' => 20,
'parent_id' => 0,
'type' => 'link',
'name_to_find' => self::$link->getTitle(),
'title' => 'Link title '.time(),
'prerequisite_id' => 10,
'prerequisite_min_score' => 1,
'prerequisite_max_score' => 1,
],
[
'display_order_id' => 30,
'parent_id' => 0,
'type' => 'quiz',
'name_to_find' => self::$quiz->getTitle(),
'title' => 'Quiz title '.time(),
'prerequisite_id' => 10,
'prerequisite_min_score' => 1,
'prerequisite_max_score' => 1,
],
[
'display_order_id' => 50,
'parent_id' => 0,
'type' => TOOL_LP_FINAL_ITEM,
'name_to_find' => self::$document->getTitle(),
'title' => 'Final item title '.time(),
'prerequisite_id' => 40,
'prerequisite_min_score' => 1,
'prerequisite_max_score' => 1,
],
[
'display_order_id' => 35,
'parent_id' => 0,
'type' => 'dir',
'title' => 'Chapter 1 title '.time(),
'prerequisite_id' => 10,
'prerequisite_min_score' => 1,
'prerequisite_max_score' => 1,
],
[
'display_order_id' => 1,
'parent_id' => 35,
'type' => 'student_publication',
'title' => 'Student publication title '.time(),
],
[
'display_order_id' => 2,
'parent_id' => 35,
'type' => 'student_publication',
'title' => 'Another student publication title '.time(),
'prerequisite_id' => 1,
'prerequisite_min_score' => 1,
'prerequisite_max_score' => 1,
],
[
'display_order_id' => 3,
'parent_id' => 35,
'type' => 'dir',
'title' => 'Sub-chapter of chapter 1 title '.time(),
],
[
'display_order_id' => 38,
'parent_id' => 0,
'type' => 'dir',
'title' => 'Chapter 2 title '.time(),
],
];
$learningPathId = $this->integer(
[
'session_id' => self::$session->getId(),
'course_code' => self::$course->getCode(),
'lp_name' => $name,
'lp_cat_id' => self::$category->getId(),
'items' => $items,
]
);
// assert the learning path was created as specified
/** @var CLp $learningPath */
$learningPath = api_get_lp_entity($learningPathId);
self::assertNotNull($learningPath);
self::assertEquals(self::$session->getId(), $learningPath->getSessionId());
self::assertEquals(self::$course->getId(), $learningPath->getCId());
self::assertEquals($name, $learningPath->getName());
self::assertEquals(self::$category->getId(), $learningPath->getCategoryId());
self::assertNotEmpty($learningPath->getItems());
// assert its item list matches the input specifications
$realIds = [0 => 0];
foreach ($items as $spec) {
$found = false;
foreach ($learningPath->getItems() as $item) {
if ($spec['type'] === $item->getItemType() && $spec['title'] == $item->getTitle()) {
$found = true;
$displayOrderId = $spec['display_order_id'];
$realIds[$displayOrderId] = $item->getId();
self::assertEquals($displayOrderId, $item->getDisplayOrder());
self::assertEquals(self::$course->getId(), $item->getCId());
if ($item->getItemType() === 'document') {
self::assertEquals(self::$document->getId(), $item->getPath());
} elseif ($item->getItemType() === 'link') {
self::assertEquals(self::$link->getId(), $item->getPath());
}
if (array_key_exists('prerequisite_id', $spec) && 0 != $spec['prerequisite_id']) {
self::assertEquals($spec['prerequisite_min_score'], $item->getPrerequisiteMinScore());
self::assertEquals($spec['prerequisite_max_score'], $item->getPrerequisiteMaxScore());
}
break;
}
}
self::assertTrue($found, sprintf('item not found: %s', print_r($spec, true)));
}
foreach ($items as $spec) {
foreach ($learningPath->getItems() as $item) {
if ($spec['type'] === $item->getItemType() && $spec['title'] == $item->getTitle()) {
self::assertEquals($realIds[$spec['parent_id']], $item->getParentItemId());
if (array_key_exists('prerequisite_id', $spec) && 0 != $spec['prerequisite_id']) {
self::assertEquals($realIds[$spec['prerequisite_id']], $item->getPrerequisite());
}
}
}
}
}
}

@ -53,8 +53,7 @@ class CreateSessionFromModelTest extends V2TestCase
// assert the session was created and given the returned session id
$entityManager = Database::getManager();
$repository = $entityManager->getRepository('ChamiloCoreBundle:Session');
$newSession = $repository->find($newSessionId);
$newSession = api_get_session_entity($newSessionId);
$this->assertIsObject($newSession);
// assert the new session got the right data

@ -0,0 +1,65 @@
<?php
/* For licensing terms, see /license.txt */
require_once __DIR__.'/V2TestCase.php';
require_once __DIR__.'/../../../../vendor/autoload.php';
class CreateUserEventTest extends V2TestCase
{
/**
* @var \Chamilo\UserBundle\Entity\User|null
*/
private static $user;
public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
$username = 'sebastien';
self::$user = \Chamilo\UserBundle\Entity\User::getRepository()->findOneBy(['username' => $username]);
if (is_null(self::$user)) {
self::$user = (new \Chamilo\UserBundle\Entity\User())
->setUsername($username)
->setEmail('test@test.com')
;
Database::getManager()->persist(self::$user);
Database::getManager()->flush();
}
}
public function action()
{
return Rest::CREATE_USER_EVENT;
}
/**
* Creates an event for the predefined user.
*/
public function testCreateUserEvent()
{
$eventTitle = 'An appointment';
$eventText = 'Do not be late';
$timezone = new DateTimeZone('utc');
$eventStartDate = new DateTime('tomorrow', $timezone);
$eventEndDate = clone $eventStartDate;
$eventEndDate->add(new DateInterval('PT2H'));
$eventId = $this->integer(
[
'loginname' => self::$user->getUsername(),
'eventTitle' => $eventTitle,
'eventText' => $eventText,
'eventStartDate' => $eventStartDate->format('c'),
'eventEndDate' => $eventEndDate->format('c'),
]
);
$event = Database::getManager()->getRepository('ChamiloCoreBundle:PersonalAgenda')->find($eventId);
self::assertNotNull($event, sprintf('Could not get event %d', $eventId));
self::assertEquals(self::$user->getId(), $event->getUser());
self::assertEquals($eventTitle, $event->getTitle());
self::assertEquals($eventText, $event->getText());
self::assertEquals($eventStartDate, $event->getDate());
self::assertEquals($eventEndDate, $event->getEnddate());
}
}

@ -217,9 +217,7 @@ try {
$restResponse->setData($data);
break;
case Rest::SAVE_FORUM_POST:
if (
empty($_POST['title']) || empty($_POST['text']) || empty($_POST['thread']) || empty($_POST['forum'])
) {
if (empty($_POST['title']) || empty($_POST['text']) || empty($_POST['thread']) || empty($_POST['forum'])) {
throw new Exception(get_lang('NoData'));
}
@ -310,7 +308,8 @@ try {
$_POST['sessionName'],
$_POST['startDate'],
$_POST['endDate'],
isset($_POST['extraFields']) ? $_POST['extraFields'] : []);
isset($_POST['extraFields']) ? $_POST['extraFields'] : []
);
$restResponse->setData([$newSessionId]);
break;
case Rest::SUBSCRIBE_USER_TO_SESSION_FROM_USERNAME:
@ -342,10 +341,9 @@ try {
exit;
break;
case Rest::UPDATE_USER_PAUSE_TRAINING:
$allow = api_get_plugin_setting('pausetraining', 'tool_enable') === 'true';
$allowPauseFormation = api_get_plugin_setting('pausetraining', 'allow_users_to_edit_pause_formation') === 'true';
if (false === $allow || false === $allowPauseFormation) {
if (api_get_plugin_setting('pausetraining', 'tool_enable') !== 'true'
||
api_get_plugin_setting('pausetraining', 'allow_users_to_edit_pause_formation') !== 'true') {
throw new Exception(get_lang('Plugin configured'));
}
@ -356,6 +354,22 @@ try {
$data = $plugin->updateUserPauseTraining($_POST['user_id'], $_POST);
$restResponse->setData([$data]);
break;
case Rest::CREATE_LEARNINGPATH:
$learningPath = $restApi->createLearningPath($_POST);
$restResponse->setData([$learningPath->getIid()]);
break;
case Rest::CREATE_USER_EVENT:
$eventId = $restApi->createUserEvent($_POST);
$restResponse->setData([$eventId]);
break;
case Rest::CREATE_COURSE_EVENT:
$eventId = $restApi->createCourseEvent($_POST);
$restResponse->setData([$eventId]);
break;
case Rest::CREATE_GLOBAL_EVENT:
$eventId = $restApi->createGlobalEvent($_POST);
$restResponse->setData([$eventId]);
break;
default:
throw new Exception(get_lang('InvalidAction'));
}

@ -304,8 +304,7 @@ function WSCreateUsers($params)
$original_user_id_name
);
if ($user_id > 0) {
/** @var User $user */
$user = $userRepository->find($user_id);
$user = api_get_user_entity($user_id);
if ($user && $user->isActive() == false) {
if (!is_null($password)) {
@ -532,8 +531,7 @@ function WSCreateUser($params)
$userRepository = UserManager::getRepository();
if ($user_id > 0) {
/** @var User $user */
$user = $userRepository->find($user_id);
$user = api_get_user_entity($user_id);
if ($user && $user->isActive() == false) {
if (!is_null($password)) {
$user->setPlainPassword($password);
@ -867,7 +865,7 @@ function WSCreateUsersPasswordCrypted($params)
$count_row = Database::num_rows($res);
if ($count_row > 0) {
// Check if user is not active.
$sql = "SELECT user_id FROM $table_user
$sql = "SELECT user_id FROM $table_user
WHERE user_id ='".$row[1]."' AND active= '0'";
$resu = Database::query($sql);
$r_check_user = Database::fetch_row($resu);
@ -1389,7 +1387,7 @@ function WSCreateUserPasswordCrypted($params)
phone='".Database::escape_string($phone)."',
expiration_date='".Database::escape_string($expiration_date)."',
active='1',
hr_dept_id=".intval($hr_dept_id)."
hr_dept_id=".intval($hr_dept_id)."
WHERE user_id='".$r_check_user[0]."'";
Database::query($sql);
@ -1459,7 +1457,7 @@ function WSCreateUserPasswordCrypted($params)
phone = '".Database::escape_string($phone)."',
language = '".Database::escape_string($language)."',
registration_date = '".api_get_utc_datetime()."',
roles = 'a:0:{}',
roles = 'a:0:{}',
".$queryExpirationDate."
hr_dept_id = '".Database::escape_string($hr_dept_id)."',
active = '".Database::escape_string($active)."'";
@ -1657,8 +1655,7 @@ function WSEditUserCredentials($params)
return 0;
}
/** @var User $user */
$user = $userRepository->find($user_id);
$user = api_get_user_entity($user_id);
if ($user) {
$user->setUsername($username);
if (!is_null($password)) {
@ -1787,8 +1784,7 @@ function WSEditUsers($params)
}
// Edit lastname and firstname only if not empty
/** @var User $user */
$user = $userRepository->find($user_id);
$user = api_get_user_entity($user_id);
if (!empty($lastname)) {
$user->setLastname($lastname);
@ -1968,8 +1964,7 @@ function WSEditUser($params)
return 0;
}
/** @var User $user */
$user = $userRepository->find($user_id);
$user = api_get_user_entity($user_id);
if (!empty($lastname)) {
$user->setLastname($lastname);
@ -2139,7 +2134,7 @@ function WSEditUserWithPicture($params)
}
// Check whether username already exits.
$sql = "SELECT username FROM $table_user
$sql = "SELECT username FROM $table_user
WHERE username = '$username' AND id <> $user_id";
$res_un = Database::query($sql);
$r_username = Database::fetch_row($res_un);
@ -2148,8 +2143,7 @@ function WSEditUserWithPicture($params)
return 0;
}
/** @var User $user */
$user = $userRepository->find($user_id);
$user = api_get_user_entity($user_id);
if (!empty($lastname)) {
$user->setLastname($lastname);
@ -4768,7 +4762,7 @@ function WSSubscribeUserToCourseSimple($params)
error_log('Try to register: user_id= '.$user_id.' to course: '.$course_data['code']);
}
if (!CourseManager::subscribeUser($user_id, $course_data['code'], $status, 0, false, false)) {
$result = 'User was not registered possible reasons: User already registered to the course,
$result = 'User was not registered possible reasons: User already registered to the course,
Course visibility doesnt allow user subscriptions ';
if ($debug) {
error_log($result);

@ -104,8 +104,7 @@ if ($typeUser) {
}
$form->addSelect('info_select', get_lang('User'), $selectOptions);
} elseif ($typeCourse) {
/** @var User $user */
$user = UserManager::getRepository()->find($currentUserId);
$user = api_get_user_entity($currentUserId);
$courses = $user->getCourses();
$checker = false;
foreach ($courses as $course) {
@ -123,8 +122,7 @@ if ($typeUser) {
$form->addSelect('info_select', get_lang('Course'), $selectOptions);
} elseif ($typeSession) {
$sessions = [];
/** @var User $user */
$user = UserManager::getRepository()->find($currentUserId);
$user = api_get_user_entity($currentUserId);
$userSubscriptions = $user->getSessionCourseSubscriptions();
/** @var SessionRelCourseRelUser $userSubscription */
@ -146,8 +144,7 @@ if ($typeUser) {
}
} elseif ($typeFinalLp) {
// We need here to check the current user courses first
/** @var User $user */
$user = UserManager::getRepository()->find($currentUserId);
$user = api_get_user_entity($currentUserId);
$courses = $user->getCourses();
$courseLpList = [];
$sessionLpList = [];

@ -294,10 +294,7 @@ class OAuth2 extends Plugin
private function updateUser($userId, $response)
{
/**
* @var $user Chamilo\UserBundle\Entity\User
*/
$user = UserManager::getRepository()->find($userId);
$user = api_get_user_entity($userId);
$user->setFirstname(
$this->getValueByKey($response, $this->get(
self::SETTING_RESPONSE_RESOURCE_OWNER_FIRSTNAME

@ -3,6 +3,9 @@
namespace Chamilo\CoreBundle\Entity;
use Database;
use DateTime;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
@ -25,7 +28,7 @@ class AccessUrl
/**
* @ORM\OneToMany(targetEntity="AccessUrlRelCourse", mappedBy="url", cascade={"persist"}, orphanRemoval=true)
*/
protected $course;
protected $courses;
/**
* @var string
@ -56,7 +59,7 @@ class AccessUrl
protected $createdBy;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="tms", type="datetime", nullable=true)
*/
@ -70,21 +73,31 @@ class AccessUrl
protected $urlType;
/**
* @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\SettingsCurrent", mappedBy="url", cascade={"persist"}, orphanRemoval=true)
* @ORM\OneToMany(
* targetEntity="Chamilo\CoreBundle\Entity\SettingsCurrent",
* mappedBy="url",
* cascade={"persist"},
* orphanRemoval=true
* )
*/
//protected $settings;
/**
* @ORM\OneToMany(targetEntity="Chamilo\CoreBundle\Entity\SessionCategory", mappedBy="url", cascade={"persist"}, orphanRemoval=true)
* @ORM\OneToMany(
* targetEntity="Chamilo\CoreBundle\Entity\SessionCategory",
* mappedBy="url",
* cascade={"persist"},
* orphanRemoval=true
* )
*/
protected $sessionCategory;
protected $sessionCategories;
/**
* AccessUrl constructor.
*/
public function __construct()
{
$this->tms = new \DateTime();
$this->tms = new DateTime();
$this->createdBy = 1;
}
@ -96,6 +109,14 @@ class AccessUrl
return (string) $this->getUrl();
}
/**
* @return Repository\AccessUrlRepository|EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCoreBundle:AccessUrl');
}
/**
* Get id.
*
@ -205,7 +226,7 @@ class AccessUrl
/**
* Set tms.
*
* @param \DateTime $tms
* @param DateTime $tms
*
* @return AccessUrl
*/
@ -219,7 +240,7 @@ class AccessUrl
/**
* Get tms.
*
* @return \DateTime
* @return DateTime
*/
public function getTms()
{

@ -23,13 +23,21 @@ class AccessUrlRelCourse
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Course", inversedBy="urls", cascade={"persist"})
* @ORM\ManyToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Course",
* inversedBy="urls",
* cascade={"persist", "remove"}
* )
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
/**
* @ORM\ManyToOne(targetEntity="AccessUrl", inversedBy="course", cascade={"persist"})
* @ORM\ManyToOne(
* targetEntity="Chamilo\CoreBundle\Entity\AccessUrl",
* inversedBy="courses",
* cascade={"persist", "remove"}
* )
* @ORM\JoinColumn(name="access_url_id", referencedColumnName="id")
*/
protected $url;
@ -75,11 +83,16 @@ class AccessUrlRelCourse
}
/**
* @param $course
* @param Course $course
*
* @return AccessUrlRelCourse
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getUrls()->add($this);
return $this;
}
/**

@ -3,11 +3,27 @@
namespace Chamilo\CoreBundle\Entity;
use Chamilo\CourseBundle\Entity\CCourseSetting;
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Entity\CForumForum;
use Chamilo\CourseBundle\Entity\CItemProperty;
use Chamilo\CourseBundle\Entity\CLink;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\CourseBundle\Entity\CLpCategory;
use Chamilo\CourseBundle\Entity\CLpItem;
use Chamilo\CourseBundle\Entity\CQuiz;
use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\UserBundle\Entity\User;
use CourseManager;
use Database;
use DateInterval;
use DateTime;
use DateTimeZone;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
@ -27,7 +43,6 @@ use Symfony\Component\Validator\Constraints as Assert;
* @UniqueEntity("visualCode")
* @UniqueEntity("directory")
* @ORM\Entity(repositoryClass="Chamilo\CoreBundle\Entity\Repository\CourseRepository")
* @ORM\EntityListeners({"Chamilo\CoreBundle\Entity\Listener\CourseListener"})
*/
class Course
{
@ -47,16 +62,30 @@ class Course
protected $id;
/**
* @var CourseRelUser[]|ArrayCollection
*
* "orphanRemoval" is needed to delete the CourseRelUser relation
* in the CourseAdmin class. The setUsers, getUsers, removeUsers and
* addUsers methods need to be added.
*
* @ORM\OneToMany(targetEntity="CourseRelUser", mappedBy="course", cascade={"persist"}, orphanRemoval=true)
* @ORM\OneToMany(
* targetEntity="CourseRelUser",
* mappedBy="course",
* cascade={"persist", "remove"},
* orphanRemoval=true
* )
*/
protected $users;
/**
* @ORM\OneToMany(targetEntity="AccessUrlRelCourse", mappedBy="course", cascade={"persist"}, orphanRemoval=true)
* @var AccessUrlRelCourse[]|ArrayCollection
*
* @ORM\OneToMany(
* targetEntity="AccessUrlRelCourse",
* mappedBy="course",
* cascade={"persist", "remove"},
* orphanRemoval=true
* )
*/
protected $urls;
@ -71,9 +100,15 @@ class Course
protected $sessionUserSubscriptions;
/**
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CItemProperty", mappedBy="course")
* @var ArrayCollection|CItemProperty[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CItemProperty",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
//protected $items;
protected $itemProperties;
/**
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CTool", mappedBy="course", cascade={"persist"})
@ -188,28 +223,28 @@ class Course
protected $diskQuota;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="last_visit", type="datetime", nullable=true, unique=false)
*/
protected $lastVisit;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="last_edit", type="datetime", nullable=true, unique=false)
*/
protected $lastEdit;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="creation_date", type="datetime", nullable=true, unique=false)
*/
protected $creationDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="expiration_date", type="datetime", nullable=true, unique=false)
*/
@ -282,12 +317,128 @@ class Course
*/
protected $room;
/**
* @ORM\ManyToMany(targetEntity="AccessUrl")
* @ORM\JoinTable(name="access_url_rel_course",
* joinColumns={@ORM\JoinColumn(name="c_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="access_url_id", referencedColumnName="id")}
* )
*/
protected $accessUrls;
/**
* @var ArrayCollection|CCourseSetting[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CCourseSetting",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $settings;
/**
* @var ArrayCollection|CLpCategory[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLpCategory",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $learningPathCategories;
/**
* @var ArrayCollection|CLpItem[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLpItem",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $learningPathItems;
/**
* @var ArrayCollection|CDocument[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CDocument",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $documents;
/**
* @var ArrayCollection|CForumForum[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CForumForum",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $forums;
/**
* @var ArrayCollection|CLink[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLink",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $links;
/**
* @var ArrayCollection|CQuiz[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CQuiz",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $quizzes;
/**
* @var ArrayCollection|CLp[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLp",
* mappedBy="course",
* cascade={"persist", "remove"}
* )
*/
protected $learningPaths;
/**
* Constructor.
*
* @throws Exception
*/
public function __construct()
{
$this->creationDate = new \DateTime();
$this->activateLegal = 0;
$this->addTeachersToSessionsCourses = false;
$this->creationDate = new DateTime('now', new DateTimeZone('utc'));
$this->lastVisit = null;
$this->showScore = 1;
$this->unsubscribe = false;
$this->accessUrls = new ArrayCollection();
$this->documents = new ArrayCollection();
$this->forums = new ArrayCollection();
$this->itemProperties = new ArrayCollection();
$this->learningPathCategories = new ArrayCollection();
$this->learningPathItems = new ArrayCollection();
$this->learningPaths = new ArrayCollection();
$this->links = new ArrayCollection();
$this->quizzes = new ArrayCollection();
$this->settings = new ArrayCollection();
$this->tools = new ArrayCollection();
$this->urls = new ArrayCollection();
$this->users = new ArrayCollection();
}
@ -296,7 +447,129 @@ class Course
*/
public function __toString()
{
return (string) $this->getTitle();
return sprintf('course %s ("%s")', $this->id, $this->getName());
}
/**
* @return Repository\CourseRepository|EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCoreBundle:Course');
}
/**
* Sets sane values if still unset.
* Makes directory if missing.
*
* @ORM\PrePersist
*
* @throws Exception
*/
public function prePersist()
{
if (empty($this->title)) {
throw new Exception('This course is missing a title');
}
if (empty($this->code)) {
$this->code = substr(
preg_replace('/[^A-Z0-9]/', '', strtoupper(api_replace_dangerous_char($this->title))),
0,
CourseManager::MAX_COURSE_LENGTH_CODE
);
}
$originalCode = $this->code;
$counter = 1;
while (self::getRepository()->matching(
Criteria::create()->where(
Criteria::expr()->eq('code', $this->code)
)
)->exists(function ($other) {
return $other !== $this;
})) {
$this->code = sprintf('%s_%d', $originalCode, $counter++);
}
if (empty($this->visualCode)) {
$this->visualCode = $this->code;
}
if (empty($this->directory)) {
$this->directory = $this->code;
}
$originalDirectory = $this->directory;
$counter = 1;
while (file_exists($this->getAbsolutePath())) {
$this->directory = sprintf('%s_%d', $originalDirectory, $counter++);
}
if (is_null($this->courseLanguage)) {
$this->courseLanguage = api_get_setting('platformLanguage');
}
if (is_null($this->description)) {
$this->description = get_lang('CourseDescription');
}
if (is_null($this->categoryCode)) {
$this->categoryCode = '';
}
if (is_null($this->visibility)) {
$this->visibility = api_get_setting(
'courses_default_creation_visibility'
) ?: COURSE_VISIBILITY_OPEN_PLATFORM;
} elseif ($this->visibility < 0 || $this->visibility > 4) {
throw new Exception('This course visibility in invalid:'.$this->visibility);
}
if (is_null($this->subscribe)) {
$this->subscribe = (COURSE_VISIBILITY_OPEN_PLATFORM == $this->visibility);
}
if (is_null($this->diskQuota)) {
$this->diskQuota = api_get_setting('default_document_quotum');
}
$this->lastEdit = new DateTime('now', new DateTimeZone('utc'));
if (is_null($this->expirationDate)) {
global $firstExpirationDelay;
$this->expirationDate = new DateTime('now', new DateTimeZone('utc'));
$this->expirationDate->add(new DateInterval(sprintf('PT%dS', $firstExpirationDelay)));
}
if (!empty($this->departmentUrl) && !preg_match("@^https?://@", $this->departmentUrl)) {
$this->departmentUrl = 'https://'.$this->departmentUrl;
}
if ($this->accessUrls->isEmpty()) {
$this->accessUrls->add(api_get_access_url_entity());
}
$this->prepareRepository();
$this->createTools();
$this->createSettings();
}
/**
* Removes the course's directory.
*
* @ORM\PostRemove
*
* @throws Exception
*/
public function postRemove()
{
$absolutePath = $this->getAbsolutePath();
if (!file_exists($absolutePath)) {
if (!rmdir($absolutePath)) {
error_log('Could not remove the course directory '.$absolutePath);
}
}
}
/**
* Builds the course's directory absolute path.
*
* @throws Exception on undefined directory
*
* @return string the course's directory absolute path
*/
public function getAbsolutePath()
{
if (empty($this->directory)) {
throw new Exception('this course does not have a directory yet');
}
return api_get_path(SYS_COURSE_PATH).$this->directory;
}
/**
@ -353,7 +626,7 @@ class Course
}
/**
* @return ArrayCollection
* @return AccessUrlRelCourse[]|ArrayCollection
*/
public function getUrls()
{
@ -365,8 +638,6 @@ class Course
*/
public function setUrls($urls)
{
$this->urls = new ArrayCollection();
foreach ($urls as $url) {
$this->addUrls($url);
}
@ -379,7 +650,7 @@ class Course
}
/**
* @return ArrayCollection
* @return CourseRelUser[]|ArrayCollection
*/
public function getUsers()
{
@ -430,9 +701,11 @@ class Course
}
/**
* @param User $user
*
* @return bool
*/
public function hasUser(User $user)
public function hasUser($user)
{
$criteria = Criteria::create()->where(
Criteria::expr()->eq("user", $user)
@ -442,9 +715,11 @@ class Course
}
/**
* @param User $user
*
* @return bool
*/
public function hasStudent(User $user)
public function hasStudent($user)
{
$criteria = Criteria::create()->where(
Criteria::expr()->eq("user", $user)
@ -454,9 +729,11 @@ class Course
}
/**
* @param User $user
*
* @return bool
*/
public function hasTeacher(User $user)
public function hasTeacher($user)
{
$criteria = Criteria::create()->where(
Criteria::expr()->eq("user", $user)
@ -467,8 +744,10 @@ class Course
/**
* Remove $user.
*
* @param CourseRelUser $user
*/
public function removeUsers(CourseRelUser $user)
public function removeUsers($user)
{
foreach ($this->users as $key => $value) {
if ($value->getId() == $user->getId()) {
@ -477,12 +756,18 @@ class Course
}
}
public function addTeacher(User $user)
/**
* @param User $user
*/
public function addTeacher($user)
{
$this->addUser($user, 0, "Trainer", User::COURSE_MANAGER);
}
public function addStudent(User $user)
/**
* @param User $user
*/
public function addStudent($user)
{
$this->addUser($user, 0, "", User::STUDENT);
}
@ -490,11 +775,15 @@ class Course
/**
* Set id.
*
* @return int
* @param int $id
*
* @return Course
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
@ -837,7 +1126,7 @@ class Course
/**
* Set lastVisit.
*
* @param \DateTime $lastVisit
* @param DateTime $lastVisit
*
* @return Course
*/
@ -851,7 +1140,7 @@ class Course
/**
* Get lastVisit.
*
* @return \DateTime
* @return DateTime
*/
public function getLastVisit()
{
@ -861,7 +1150,7 @@ class Course
/**
* Set lastEdit.
*
* @param \DateTime $lastEdit
* @param DateTime $lastEdit
*
* @return Course
*/
@ -875,7 +1164,7 @@ class Course
/**
* Get lastEdit.
*
* @return \DateTime
* @return DateTime
*/
public function getLastEdit()
{
@ -885,7 +1174,7 @@ class Course
/**
* Set creationDate.
*
* @param \DateTime $creationDate
* @param DateTime $creationDate
*
* @return Course
*/
@ -899,7 +1188,7 @@ class Course
/**
* Get creationDate.
*
* @return \DateTime
* @return DateTime
*/
public function getCreationDate()
{
@ -909,7 +1198,7 @@ class Course
/**
* Set expirationDate.
*
* @param \DateTime $expirationDate
* @param DateTime $expirationDate
*
* @return Course
*/
@ -923,7 +1212,7 @@ class Course
/**
* Get expirationDate.
*
* @return \DateTime
* @return DateTime
*/
public function getExpirationDate()
{
@ -1141,9 +1430,11 @@ class Course
}
/**
* @param Session $session
*
* @return $this
*/
public function setCurrentSession(Session $session)
public function setCurrentSession($session)
{
// If the session is registered in the course session list.
if ($this->getSessions()->contains($session->getId())) {
@ -1154,9 +1445,118 @@ class Course
}
/**
* @return CLpCategory[]|ArrayCollection
*/
public function getLearningPathCategories()
{
return $this->learningPathCategories;
}
/**
* @return CDocument[]|ArrayCollection
*/
public function getDocuments()
{
return $this->documents;
}
/**
* @return CForumForum[]|ArrayCollection
*/
public function getForums()
{
return $this->forums;
}
/**
* @return CQuiz[]|ArrayCollection
*/
public function getQuizzes()
{
return $this->quizzes;
}
/**
* @return CLink[]|ArrayCollection
*/
public function getLinks()
{
return $this->links;
}
/**
* @return CLp[]|ArrayCollection
*/
public function getLearningPaths()
{
return $this->learningPaths;
}
/**
* Searches and returns the resource of a specific type having a specific title.
*
* @param string $type 'dir', 'document', 'quiz'… (supported values are hardcoded in this function)
* @param string $title the title of the specific resource to find
*
* @throws Exception when not found or more than one found
*
* @return object the resource
*/
public function findResource($type, $title)
{
$collectionsAndColumns = [
// type collection column
'document' => [$this->documents, 'title'],
'final_item' => [$this->documents, 'title'],
'forum' => [$this->forums, 'forumTitle'],
'link' => [$this->links, 'title'],
'quiz' => [$this->quizzes, 'title'],
];
if (!array_key_exists($type, $collectionsAndColumns)) {
throw new Exception(sprintf('unsupported resource type "%s"', $type));
}
list($collection, $column) = $collectionsAndColumns[$type];
$resources = $collection->matching(Criteria::create()->where(Criteria::expr()->eq($column, $title)));
if (empty($resources)) {
throw new Exception(sprintf('%s "%s" not found', $type, $title));
}
if (count($resources) > 1) {
throw new Exception(sprintf('more than one %s "%s" found', $type, $title));
}
return $resources[0];
}
/**
* @return CLpItem[]|ArrayCollection
*/
public function getLearningPathItems()
{
return $this->learningPathItems;
}
/**
* @return CItemProperty[]|ArrayCollection
*/
public function getItemProperties()
{
return $this->itemProperties;
}
/**
* @return CCourseSetting[]|ArrayCollection
*/
public function getSettings()
{
return $this->settings;
}
/**
* @param CourseRelUser $subscription
*
* @return bool
*/
protected function hasSubscription(CourseRelUser $subscription)
protected function hasSubscription($subscription)
{
if ($this->getUsers()->count()) {
$criteria = Criteria::create()->where(
@ -1176,11 +1576,12 @@ class Course
}
/**
* @param User $user
* @param string $relationType
* @param string $role
* @param string $status
*/
protected function addUser(User $user, $relationType, $role, $status)
protected function addUser($user, $relationType, $role, $status)
{
$courseRelUser = new CourseRelUser();
$courseRelUser->setCourse($this);
@ -1190,4 +1591,208 @@ class Course
$courseRelUser->setStatus($status);
$this->addUsers($courseRelUser);
}
/**
* Initializes the course's file repository.
* Replaces \AddCourse::prepare_course_repository.
*
* @throws Exception
*/
private function prepareRepository()
{
$dirPermissions = api_get_permissions_for_new_directories();
$filePermissions = api_get_permissions_for_new_files();
$indexHtmlContents = '<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>Not authorized</title></head><body></body></html>';
$repositoryPath = $this->getAbsolutePath();
if (!file_exists($repositoryPath)) {
if (!mkdir($repositoryPath, $dirPermissions)) {
throw new Exception(sprintf('Could not create course repository "%s"', $repositoryPath));
}
}
foreach ([
'document',
'dropbox',
'exercises',
'group',
'page',
'scorm',
'upload',
'upload/announcements',
'upload/announcements/images',
'upload/blog',
'upload/calendar',
'upload/calendar/images',
'upload/forum',
'upload/forum/images',
'upload/learning_path',
'upload/learning_path/images',
'upload/test',
'work',
] as $relativePath) {
$subfolderPath = $repositoryPath.'/'.$relativePath;
if (!file_exists($subfolderPath)) {
if (!mkdir($subfolderPath, $dirPermissions)) {
throw new Exception(sprintf('Could not create course repository subfolder "%s"', $subfolderPath));
}
}
$indexHtmlFilePath = $subfolderPath.'/index.html';
if (!file_exists($indexHtmlFilePath)) {
$indexHtmlFile = fopen($indexHtmlFilePath, 'w');
if (false === $indexHtmlFile) {
throw new Exception(sprintf('Could not create course repository subfolder index file "%s"', $indexHtmlFilePath));
}
if (false === fwrite($indexHtmlFile, $indexHtmlContents)) {
throw new Exception(sprintf('Could not write to course repository subfolder index file "%s"', $indexHtmlFilePath));
}
if (!fclose($indexHtmlFile)) {
throw new Exception(sprintf('Could not close course repository subfolder index file "%s"', $indexHtmlFilePath));
}
if (!@chmod($indexHtmlFile, $filePermissions)) {
// never mind, on some platforms it is not possible anyway
}
}
}
// Create .htaccess in the dropbox directory.
$dropboxHtAccessFilePath = $repositoryPath.'/dropbox/.htaccess';
$dropboxHtAccessFile = fopen($dropboxHtAccessFilePath, 'w');
if (false === $dropboxHtAccessFile) {
throw new Exception(sprintf('Could not create course repository dropbox subfolder access control file "%s"', $dropboxHtAccessFilePath));
}
if (!fwrite(
$dropboxHtAccessFile,
"AuthName AllowLocalAccess
AuthType Basic
order deny,allow
deny from all
php_flag zlib.output_compression off"
)) {
throw new Exception(sprintf('Could not write to course repository dropbox subfolder access control file "%s"', $dropboxHtAccessFilePath));
}
if (!fclose($dropboxHtAccessFile)) {
throw new Exception(sprintf('Could not close course repository dropbox subfolder access control file "%s"', $dropboxHtAccessFilePath));
}
}
private function createTools()
{
$toolReference = [
[TOOL_COURSE_DESCRIPTION, 'course_description/index.php', 'info.gif', 'course_description', 'authoring'],
[TOOL_CALENDAR_EVENT, 'calendar/agenda.php', 'agenda.gif', 'agenda', 'interaction'],
[TOOL_DOCUMENT, 'document/document.php', 'folder_document.gif', 'documents', 'authoring'],
[TOOL_LEARNPATH, 'lp/lp_controller.php', 'scorms.gif', 'learning_path', 'authoring'],
[TOOL_LINK, 'link/link.php', 'links.gif', 'links', 'authoring'],
[TOOL_QUIZ, 'exercise/exercise.php', 'quiz.gif', 'quiz', 'authoring'],
[TOOL_ANNOUNCEMENT, 'announcements/announcements.php', 'valves.gif', 'announcements', 'authoring'],
[TOOL_FORUM, 'forum/index.php', 'forum.gif', 'forums', 'interaction'],
[TOOL_DROPBOX, 'dropbox/index.php', 'dropbox.gif', 'dropbox', 'interaction'],
[TOOL_USER, 'user/user.php', 'members.gif', 'users', 'interaction'],
[TOOL_GROUP, 'group/group.php', 'group.gif', 'groups', 'interaction'],
[TOOL_CHAT, 'chat/chat.php', 'chat.gif', 'chat', 'interaction'],
[TOOL_STUDENTPUBLICATION, 'work/work.php', 'works.gif', 'student_publications', 'interaction'],
[TOOL_SURVEY, 'survey/survey_list.php', 'survey.gif', 'survey', 'interaction'],
[TOOL_WIKI, 'wiki/index.php', 'wiki.gif', 'wiki', 'interaction'],
[TOOL_GRADEBOOK, 'gradebook/index.php', 'gradebook.gif', 'gradebook', 'authoring'],
[TOOL_GLOSSARY, 'glossary/index.php', 'glossary.gif', 'glossary', 'authoring'],
[TOOL_NOTEBOOK, 'notebook/index.php', 'notebook.gif', 'notebook', 'interaction'],
];
if (api_get_configuration_value('allow_portfolio_tool')) {
$toolReference[] = [TOOL_PORTFOLIO, 'portfolio/index.php', 'wiki_task.png', 'portfolio', 'interaction'];
}
$toolReference[] = [TOOL_ATTENDANCE, 'attendance/index.php', 'attendance.gif', 'attendances', 'authoring'];
$toolReference[] =
[TOOL_COURSE_PROGRESS, 'course_progress/index.php', 'course_progress.gif', 'course_progress', 'authoring'];
$counter = 1;
foreach ($toolReference as list($name, $link, $image, $key, $category)) {
(new CTool())
->setCourse($this)
->setId($counter++)
->setName($name)
->setLink($link)
->setImage($image)
->setVisibility('true' === api_get_setting('course_create_active_tools', $key))
->setCategory($category);
}
if (api_get_setting('search_enabled') === 'true') {
(new CTool())
->setCourse($this)
->setId($counter++)
->setName(TOOL_SEARCH)
->setLink('search/')
->setImage('info.gif')
->setVisibility('true' === api_get_setting('course_create_active_tools', 'enable_search'))
->setCategory('authoring')
->setAddress('search.gif');
}
(new CTool())
->setCourse($this)
->setId($counter++)
->setName(TOOL_BLOGS)
->setLink('blog/blog_admin.php')
->setImage('blog_admin.gif')
->setVisibility('true' === api_get_setting('course_create_active_tools', 'blogs'))
->setCategory('admin')
->setAdmin('1');
foreach ([
[TOOL_TRACKING, 'tracking/courseLog.php', 'statistics.gif'],
[TOOL_COURSE_SETTING, 'course_info/infocours.php', 'reference.gif'],
[TOOL_COURSE_MAINTENANCE, 'course_info/maintenance.php', 'backup.gif'],
] as list($name, $link, $image)) {
(new CTool())
->setCourse($this)
->setId($counter++)
->setName($name)
->setLink($link)
->setImage($image)
->setVisibility(false)
->setCategory('admin')
->setAdmin('1');
}
}
private function createSettings()
{
$settings = [
'email_alert_manager_on_new_doc' => ['default' => 0, 'category' => 'work'],
'email_alert_on_new_doc_dropbox' => ['default' => 0, 'category' => 'dropbox'],
'allow_user_edit_agenda' => ['default' => 0, 'category' => 'agenda'],
'allow_user_edit_announcement' => ['default' => 0, 'category' => 'announcement'],
'email_alert_manager_on_new_quiz' => [
'default' => (api_get_setting('email_alert_manager_on_new_quiz') === 'true') ? 1 : 0,
'category' => 'quiz',
],
'allow_user_image_forum' => ['default' => 1, 'category' => 'forum'],
'course_theme' => ['default' => '', 'category' => 'theme'],
'allow_learning_path_theme' => ['default' => 1, 'category' => 'theme'],
'allow_open_chat_window' => ['default' => 1, 'category' => 'chat'],
'email_alert_to_teacher_on_new_user_in_course' => ['default' => 0, 'category' => 'registration'],
'allow_user_view_user_list' => ['default' => 1, 'category' => 'user'],
'display_info_advance_inside_homecourse' => ['default' => 1, 'category' => 'thematic_advance'],
'email_alert_students_on_new_homework' => ['default' => 0, 'category' => 'work'],
'enable_lp_auto_launch' => ['default' => 0, 'category' => 'learning_path'],
'enable_exercise_auto_launch' => ['default' => 0, 'category' => 'exercise'],
'enable_document_auto_launch' => ['default' => 0, 'category' => 'document'],
'pdf_export_watermark_text' => ['default' => '', 'category' => 'learning_path'],
'allow_public_certificates' => [
'default' => api_get_setting('allow_public_certificates') === 'true' ? 1 : '',
'category' => 'certificates',
],
'documents_default_visibility' => ['default' => 'visible', 'category' => 'document'],
'show_course_in_user_language' => ['default' => 2, 'category' => null],
'email_to_teachers_on_new_work_feedback' => ['default' => 1, 'category' => null],
];
$counter = 1;
foreach ($settings as $variable => $setting) {
(new CCourseSetting())
->setId($counter++)
->setCourse($this)
->setVariable($variable)
->setValue($setting['default'])
->setCategory($setting['category']);
}
}
}

@ -4,6 +4,8 @@
namespace Chamilo\CoreBundle\Entity;
use Chamilo\UserBundle\Entity\User;
use Database;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
@ -103,6 +105,14 @@ class CourseRelUser
return (string) $this->getCourse()->getCode();
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCoreBundle:CourseRelUser');
}
/**
* @return int
*/
@ -120,11 +130,14 @@ class CourseRelUser
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse(Course $course)
public function setCourse($course)
{
$this->course = $course;
$this->course->getUsers()->add($this);
return $this;
}
@ -147,6 +160,7 @@ class CourseRelUser
public function setUser($user)
{
$this->user = $user;
$this->user->getCourses()->add($this);
return $this;
}
@ -243,10 +257,14 @@ class CourseRelUser
/**
* @param bool $tutor
*
* @return CourseRelUser
*/
public function setTutor($tutor)
{
$this->tutor = $tutor;
return $this;
}
/**

@ -1,40 +0,0 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Entity\Listener;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Tool;
use Chamilo\CourseBundle\ToolChain;
use Doctrine\ORM\Event\LifecycleEventArgs;
/**
* Class CourseListener
* Course entity listener, when a course is created the tool chain is loaded.
*
* @package Chamilo\CoreBundle\EventListener
*/
class CourseListener
{
protected $toolChain;
public function __construct(ToolChain $toolChain)
{
$this->toolChain = $toolChain;
}
/**
* new object : prePersist
* edited object: preUpdate.
*/
public function prePersist(Course $course, LifecycleEventArgs $args)
{
//$this->toolChain->addToolsInCourse($course);
/*
error_log('ddd');
$course->setDescription( ' dq sdqs dqs dqs ');
$args->getEntityManager()->persist($course);
$args->getEntityManager()->flush();*/
}
}

@ -213,7 +213,6 @@ class ItemPropertyRepository extends EntityRepository
$newUserList = []
) {
$em = $this->getEntityManager();
$user = $em->getRepository('ChamiloUserBundle:User');
$usersSubscribedToItem = $this->getUsersSubscribedToItem(
$tool,
@ -248,7 +247,7 @@ class ItemPropertyRepository extends EntityRepository
foreach ($newUserList as $userId) {
if (!in_array($userId, $alreadyAddedUsers)) {
$userObj = $user->find($userId);
$userObj = api_get_user_entity($userId);
$item = new CItemProperty($course);
$item

@ -53,19 +53,13 @@ class SequenceRepository extends EntityRepository
$resource = null;
switch ($type) {
case SequenceResource::COURSE_TYPE:
$repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:Course');
$resource = api_get_course_entity($itemId);
break;
case SequenceResource::SESSION_TYPE:
$repo = $this->getEntityManager()->getRepository('ChamiloCoreBundle:Session');
$resource = api_get_session_entity($itemId);
break;
}
if ($repo) {
$resource = $repo->find($itemId);
}
return $resource;
}

@ -132,14 +132,10 @@ class SequenceResourceRepository extends EntityRepository
$resource = null;
switch ($type) {
case SequenceResource::SESSION_TYPE:
$repo = $em->getRepository('ChamiloCoreBundle:Session');
$resource = $repo->find($vertexId);
$resource = api_get_session_entity($vertexId);
break;
case SequenceResource::COURSE_TYPE:
$repo = $em->getRepository('ChamiloCoreBundle:Course');
$resource = $repo->find($vertexId);
$resource = api_get_course_entity($vertexId);
break;
}
@ -389,10 +385,10 @@ class SequenceResourceRepository extends EntityRepository
$vertexId = $supVertex->getId();
switch ($type) {
case SequenceResource::SESSION_TYPE:
$resource = $em->getRepository('ChamiloCoreBundle:Session')->find($vertexId);
$resource = api_get_session_entity($vertexId);
break;
case SequenceResource::COURSE_TYPE:
$resource = $em->getRepository('ChamiloCoreBundle:Course')->find($vertexId);
$resource = api_get_course_entity($vertexId);
break;
}

@ -3,11 +3,17 @@
namespace Chamilo\CoreBundle\Entity;
use Chamilo\CourseBundle\Entity\CLp;
use Chamilo\CourseBundle\Entity\CStudentPublication;
use Chamilo\UserBundle\Entity\User;
use Database;
use Datetime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Exception;
//use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
//use Gedmo\Mapping\Annotation as Gedmo;
@ -60,7 +66,12 @@ class Session
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="SessionRelCourseRelUser", mappedBy="session", cascade={"persist"}, orphanRemoval=true)
* @ORM\OneToMany(
* targetEntity="SessionRelCourseRelUser",
* mappedBy="session",
* cascade={"persist"},
* orphanRemoval=true
* )
*/
protected $userCourseSubscriptions;
@ -140,42 +151,42 @@ class Session
protected $promotionId;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="display_start_date", type="datetime", nullable=true, unique=false)
*/
protected $displayStartDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="display_end_date", type="datetime", nullable=true, unique=false)
*/
protected $displayEndDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="access_start_date", type="datetime", nullable=true, unique=false)
*/
protected $accessStartDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="access_end_date", type="datetime", nullable=true, unique=false)
*/
protected $accessEndDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="coach_access_start_date", type="datetime", nullable=true, unique=false)
*/
protected $coachAccessStartDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="coach_access_end_date", type="datetime", nullable=true, unique=false)
*/
@ -191,9 +202,14 @@ class Session
//protected $position;
/**
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CItemProperty", mappedBy="session")
* @var Session[]|ArrayCollection
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CItemProperty",
* mappedBy="session",
* cascade={"persist","remove"},
* )
*/
//protected $items;
protected $itemProperties;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\UserBundle\Entity\User", inversedBy="sessionAsGeneralCoach")
@ -215,26 +231,42 @@ class Session
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CStudentPublication", mappedBy="session", cascade={"persist"}, orphanRemoval=true)
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CStudentPublication",
* mappedBy="session",
* cascade={"persist"},
* orphanRemoval=true
* )
*/
protected $studentPublications;
/**
* @var ArrayCollection|CLp[]
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLp",
* mappedBy="session",
* cascade={"persist", "remove"}
* )
*/
// protected $learningPaths;
/**
* Constructor.
*/
public function __construct()
{
$this->items = new ArrayCollection();
$this->itemProperties = new ArrayCollection();
$this->nbrClasses = 0;
$this->nbrUsers = 0;
$this->displayStartDate = new \DateTime();
$this->displayEndDate = new \DateTime();
$this->accessStartDate = new \DateTime();
$this->accessEndDate = new \DateTime();
$this->coachAccessStartDate = new \DateTime();
$this->coachAccessEndDate = new \DateTime();
$this->displayStartDate = new DateTime();
$this->displayEndDate = new DateTime();
$this->accessStartDate = new DateTime();
$this->accessEndDate = new DateTime();
$this->coachAccessStartDate = new DateTime();
$this->coachAccessEndDate = new DateTime();
$this->visibility = 1;
$this->courses = new ArrayCollection();
@ -243,6 +275,7 @@ class Session
$this->showDescription = false;
$this->category = null;
$this->studentPublications = new ArrayCollection();
$this->sendSubscriptionNotification = false;
}
/**
@ -253,6 +286,14 @@ class Session
return (string) $this->getName();
}
/**
* @return Repository\SessionRepository|EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCoreBundle:Session');
}
/**
* @return int
*/
@ -334,9 +375,10 @@ class Session
}
/**
* @param int $status
* @param int $status
* @param User $user
*/
public function addUserInSession($status, User $user)
public function addUserInSession($status, $user)
{
$sessionRelUser = new SessionRelUser();
$sessionRelUser->setSession($this);
@ -347,9 +389,11 @@ class Session
}
/**
* @param SessionRelUser $subscription
*
* @return bool
*/
public function hasUser(SessionRelUser $subscription)
public function hasUser($subscription)
{
if ($this->getUsers()->count()) {
$criteria = Criteria::create()->where(
@ -395,9 +439,11 @@ class Session
}
/**
* @param Course $course
*
* @return bool
*/
public function hasCourse(Course $course)
public function hasCourse($course)
{
if ($this->getCourses()->count()) {
$criteria = Criteria::create()->where(
@ -414,16 +460,13 @@ class Session
/**
* Check for existence of a relation (SessionRelCourse) between a course and this session.
*
* @param Course $course
*
* @return bool whether the course is related to this session
*/
public function isRelatedToCourse(Course $course)
public function isRelatedToCourse($course)
{
return !is_null(
\Database::getManager()->getRepository('ChamiloCoreBundle:SessionRelCourse')->findOneBy([
'session' => $this,
'course' => $course,
])
);
return $this->courses->contains($course);
}
/**
@ -443,8 +486,11 @@ class Session
/**
* Remove course subscription for a user.
* If user status in session is student, then decrease number of course users.
*
* @param User $user
* @param Course $course
*/
public function removeUserCourseSubscription(User $user, Course $course)
public function removeUserCourseSubscription($user, $course)
{
/** @var SessionRelCourseRelUser $courseSubscription */
foreach ($this->userCourseSubscriptions as $i => $courseSubscription) {
@ -464,12 +510,13 @@ class Session
}
/**
* @param int $status if not set it will check if the user is registered
* with any status
* @param User $user
* @param Course $course
* @param int $status if not set it will check if the user is registered with any status
*
* @return bool
*/
public function hasUserInCourse(User $user, Course $course, $status = null)
public function hasUserInCourse($user, $course, $status = null)
{
$relation = $this->getUserInCourse($user, $course, $status);
@ -477,27 +524,35 @@ class Session
}
/**
* @param User $user
* @param Course $course
*
* @return bool
*/
public function hasStudentInCourse(User $user, Course $course)
public function hasStudentInCourse($user, $course)
{
return $this->hasUserInCourse($user, $course, self::STUDENT);
}
/**
* @param User $user
* @param Course $course
*
* @return bool
*/
public function hasCoachInCourseWithStatus(User $user, Course $course)
public function hasCoachInCourseWithStatus($user, $course)
{
return $this->hasUserInCourse($user, $course, self::COACH);
}
/**
* @param User $user
* @param Course $course
* @param string $status
*
* @return \Doctrine\Common\Collections\Collection|static
* @return Collection|static
*/
public function getUserInCourse(User $user, Course $course, $status = null)
public function getUserInCourse($user, $course, $status = null)
{
$criteria = Criteria::create()->where(
Criteria::expr()->eq('course', $course)
@ -709,7 +764,7 @@ class Session
/**
* Set displayStartDate.
*
* @param \DateTime $displayStartDate
* @param DateTime $displayStartDate
*
* @return Session
*/
@ -723,7 +778,7 @@ class Session
/**
* Get displayStartDate.
*
* @return \DateTime
* @return DateTime
*/
public function getDisplayStartDate()
{
@ -733,7 +788,7 @@ class Session
/**
* Set displayEndDate.
*
* @param \DateTime $displayEndDate
* @param DateTime $displayEndDate
*
* @return Session
*/
@ -747,7 +802,7 @@ class Session
/**
* Get displayEndDate.
*
* @return \DateTime
* @return DateTime
*/
public function getDisplayEndDate()
{
@ -757,7 +812,7 @@ class Session
/**
* Set accessStartDate.
*
* @param \DateTime $accessStartDate
* @param DateTime $accessStartDate
*
* @return Session
*/
@ -771,7 +826,7 @@ class Session
/**
* Get accessStartDate.
*
* @return \DateTime
* @return DateTime
*/
public function getAccessStartDate()
{
@ -781,7 +836,7 @@ class Session
/**
* Set accessEndDate.
*
* @param \DateTime $accessEndDate
* @param DateTime $accessEndDate
*
* @return Session
*/
@ -795,7 +850,7 @@ class Session
/**
* Get accessEndDate.
*
* @return \DateTime
* @return DateTime
*/
public function getAccessEndDate()
{
@ -805,7 +860,7 @@ class Session
/**
* Set coachAccessStartDate.
*
* @param \DateTime $coachAccessStartDate
* @param DateTime $coachAccessStartDate
*
* @return Session
*/
@ -819,7 +874,7 @@ class Session
/**
* Get coachAccessStartDate.
*
* @return \DateTime
* @return DateTime
*/
public function getCoachAccessStartDate()
{
@ -829,7 +884,7 @@ class Session
/**
* Set coachAccessEndDate.
*
* @param \DateTime $coachAccessEndDate
* @param DateTime $coachAccessEndDate
*
* @return Session
*/
@ -843,7 +898,7 @@ class Session
/**
* Get coachAccessEndDate.
*
* @return \DateTime
* @return DateTime
*/
public function getCoachAccessEndDate()
{
@ -909,7 +964,7 @@ class Session
*/
public function isActive()
{
$now = new \Datetime('now');
$now = new Datetime('now');
return $now > $this->getAccessStartDate();
}
@ -923,8 +978,8 @@ class Session
public function isCurrentlyAccessible()
{
try {
$now = new \Datetime();
} catch (\Exception $exception) {
$now = new Datetime();
} catch (Exception $exception) {
return false;
}
@ -990,9 +1045,11 @@ class Session
}
/**
* @param Course $course
*
* @return SessionRelCourse
*/
public function getCourseSubscription(Course $course)
public function getCourseSubscription($course)
{
$criteria = Criteria::create()->where(
Criteria::expr()->eq('course', $course)
@ -1010,9 +1067,11 @@ class Session
* Add a user course subscription.
* If user status in session is student, then increase number of course users.
*
* @param int $status
* @param int $status
* @param User $user
* @param Course $course
*/
public function addUserInCourse($status, User $user, Course $course)
public function addUserInCourse($status, $user, $course)
{
$userRelCourseRelSession = new SessionRelCourseRelUser();
$userRelCourseRelSession->setCourse($course);
@ -1031,9 +1090,11 @@ class Session
}
/**
* @param SessionRelCourseRelUser $subscription
*
* @return bool
*/
public function hasUserCourseSubscription(SessionRelCourseRelUser $subscription)
public function hasUserCourseSubscription($subscription)
{
if ($this->getUserCourseSubscriptions()->count()) {
$criteria = Criteria::create()->where(
@ -1060,9 +1121,11 @@ class Session
}
/**
* @param Course $course
*
* @return $this
*/
public function setCurrentCourse(Course $course)
public function setCurrentCourse($course)
{
// If the session is registered in the course session list.
if ($this->getCourses()->contains($course->getId())) {
@ -1077,7 +1140,7 @@ class Session
*
* @param bool $sendNotification
*
* @return \Chamilo\CoreBundle\Entity\Session
* @return Session
*/
public function setSendSubscriptionNotification($sendNotification)
{
@ -1099,11 +1162,12 @@ class Session
/**
* Get user from course by status.
*
* @param int $status
* @param Course $course
* @param int $status
*
* @return \Doctrine\Common\Collections\ArrayCollection|\Doctrine\Common\Collections\Collection
* @return ArrayCollection|Collection
*/
public function getUserCourseSubscriptionsByStatus(Course $course, $status)
public function getUserCourseSubscriptionsByStatus($course, $status)
{
$criteria = Criteria::create()
->where(
@ -1117,9 +1181,11 @@ class Session
}
/**
* @param ArrayCollection $studentPublications
*
* @return Session
*/
public function setStudentPublications(ArrayCollection $studentPublications)
public function setStudentPublications($studentPublications)
{
$this->studentPublications = new ArrayCollection();
@ -1131,9 +1197,11 @@ class Session
}
/**
* @param CStudentPublication $studentPublication
*
* @return Session
*/
public function addStudentPublication(CStudentPublication $studentPublication)
public function addStudentPublication($studentPublication)
{
$this->studentPublications[] = $studentPublication;
@ -1151,9 +1219,11 @@ class Session
}
/**
* @param Course $course
*
* @return ArrayCollection
*/
public function getUsersSubscriptionsInCourse(Course $course)
public function getUsersSubscriptionsInCourse($course)
{
$criteria = Criteria::create()
->where(
@ -1163,6 +1233,11 @@ class Session
return $this->userCourseSubscriptions->matching($criteria);
}
public function getItemProperties()
{
return $this->itemProperties;
}
/**
* @return int
*/
@ -1182,4 +1257,12 @@ class Session
return $this;
}*/
/**
* @return CLp[]|ArrayCollection
*/
/*public function getLearningPaths()
{
return $this->learningPaths;
}*/
}

@ -14,7 +14,7 @@ use Doctrine\ORM\Mapping as ORM;
class SessionCategory
{
/**
* @ORM\ManyToOne(targetEntity="AccessUrl", inversedBy="sessionCategory", cascade={"persist"})
* @ORM\ManyToOne(targetEntity="AccessUrl", inversedBy="sessionCategories", cascade={"persist"})
* @ORM\JoinColumn(name="access_url_id", referencedColumnName="id")
*/
protected $url;

@ -10,6 +10,7 @@ use Doctrine\ORM\Mapping as ORM;
*
* @ORM\Table(name="sys_calendar")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class SysCalendar
{
@ -217,4 +218,16 @@ class SysCalendar
{
return $this->id;
}
/**
* Sets accessUrlId if missing.
*
* @ORM\PrePersist
*/
public function prePersist()
{
if (empty($this->accessUrlId)) {
$this->accessUrlId = api_get_current_access_url_id();
}
}
}

@ -3,6 +3,8 @@
namespace Chamilo\CoreBundle\Entity;
use Database;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
@ -43,6 +45,14 @@ class UserCourseCategory
*/
protected $sort;
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCoreBundle:UserCourseCategory');
}
/**
* Set userId.
*

@ -4,6 +4,7 @@
namespace Chamilo\CourseBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
/**
* CCalendarEvent.
@ -16,6 +17,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CCalendarEvent
{
@ -113,6 +115,22 @@ class CCalendarEvent
*/
protected $room;
/**
* If id is null, copies iid to id and writes again.
*
* @ORM\PostPersist
*
* @throws OptimisticLockException
*/
public function postPersist()
{
if (is_null($this->id)) { // keep this test to avoid recursion
$this->id = $this->iid;
\Database::getManager()->persist($this);
\Database::getManager()->flush($this);
}
}
/**
* Set title.
*

@ -3,6 +3,7 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Doctrine\ORM\Mapping as ORM;
/**
@ -97,6 +98,19 @@ class CCourseSetting
*/
protected $subkeytext;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="settings")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
public function __construct()
{
$this->title = '';
}
/**
* Set variable.
*
@ -316,6 +330,8 @@ class CCourseSetting
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CCourseSetting
@ -323,6 +339,7 @@ class CCourseSetting
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}
@ -336,4 +353,25 @@ class CCourseSetting
{
return $this->cId;
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getSettings()->add($this);
return $this;
}
}

@ -3,7 +3,14 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Database;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Doctrine\ORM\TransactionRequiredException;
use Exception;
/**
* CDocument.
@ -15,6 +22,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CDocument
{
@ -90,6 +98,179 @@ class CDocument
*/
protected $sessionId;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="documents")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
public function __construct()
{
$this->size = 0;
$this->readonly = false;
$this->sessionId = 0;
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CDocument');
}
/**
* Instantiates a new CDocument by copying a file to the course.
*
* @param string $filePath the source file to be copied to the course directory
* @param Course $course the course for which the document is being created
* @param string $documentPath the future document's relative path
* @param string $title a title for the document
*
* @throws ORMException
* @throws OptimisticLockException
* @throws TransactionRequiredException
* @throws Exception
*
* @return CDocument
*/
public static function fromFile($filePath, $course, $documentPath, $title)
{
$instance = (new static())
->setCourse($course)
->setPath($documentPath)
->setTitle($title);
$absolutePath = $instance->getAbsolutePath();
if (!copy($filePath, $absolutePath)) {
throw new Exception(sprintf('Could not copy course document file %s to %s', $filePath, $absolutePath));
}
return $instance;
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getDocuments()->add($this);
return $this;
}
/**
* Builds the document's absolute path from its course's own path and its (relative) path.
*
* @throws OptimisticLockException
* @throws TransactionRequiredException
* @throws ORMException
* @throws Exception
*
* @return string the document's absolute path
*/
public function getAbsolutePath()
{
if (is_null($this->course) && $this->cId) {
$this->course = api_get_course_entity($this->cId);
}
if (is_null($this->course)) {
throw new Exception('this document does not have a course yet');
}
return sprintf(
'%s/document/%s',
$this->course->getAbsolutePath(),
$this->path
);
}
/**
* Makes sure the actual file exists.
* Records the file type.
* Computes document file size if needed.
*
* @ORM\PrePersist
*
* @throws Exception
*/
public function prePersist()
{
$absolutePath = $this->getAbsolutePath();
if (!file_exists($absolutePath)) {
throw new Exception('Cannot persist a document without an existing file');
}
if (empty($this->filetype)) {
$type = filetype($absolutePath);
switch ($type) {
case 'dir':
$this->filetype = 'folder';
break;
case 'file':
case 'link':
$this->filetype = $type;
break;
default:
throw new Exception('unsupported file type: '.$type);
}
}
if (0 === $this->size && 'file' == $this->filetype) {
$this->size = filesize($absolutePath);
}
}
/**
* If id is null, copies iid to id and writes again.
*
* @ORM\PostPersist
*
* @throws Exception
*/
public function postPersist()
{
if (is_null($this->id)) { // keep this test to avoid recursion
$this->id = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush($this);
}
}
/**
* Removes the actual file, folder or link.
*
* @ORM\PostRemove
*/
public function postRemove()
{
$absolutePath = '';
try {
$absolutePath = $this->getAbsolutePath();
} catch (Exception $exception) {
error_log($exception->getMessage());
}
if (!empty($absolutePath) && file_exists($absolutePath)) {
if ('folder' === $this->filetype && is_dir($absolutePath)) {
rmdir($absolutePath);
} elseif ('file' === $this->filetype && is_file($absolutePath)) {
unlink($absolutePath);
} elseif ('link' === $this->filetype && is_link($absolutePath)) {
unlink($absolutePath);
}
}
}
/**
* Set path.
*
@ -285,6 +466,8 @@ class CDocument
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CDocument
@ -292,6 +475,7 @@ class CDocument
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}

@ -3,7 +3,12 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Database;
use DateTime;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
/**
* CForumForum.
@ -15,6 +20,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CForumForum
{
@ -168,14 +174,14 @@ class CForumForum
protected $forumImage;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="start_time", type="datetime", nullable=true)
*/
protected $startTime;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="end_time", type="datetime", nullable=true)
*/
@ -195,6 +201,66 @@ class CForumForum
*/
protected $moderated;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="forums")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
public function __construct()
{
$this->forumId = 0;
$this->locked = 0;
$this->sessionId = 0;
$this->forumImage = '';
$this->lpId = 0;
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CForumForum');
}
/**
* @ORM\PostPersist
*
* @throws OptimisticLockException
*/
public function postPersist()
{
if (is_null($this->forumId)) {
$this->forumId = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush($this);
}
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getForums()->add($this);
return $this;
}
/**
* Set forumTitle.
*
@ -626,7 +692,7 @@ class CForumForum
/**
* Set startTime.
*
* @param \DateTime $startTime
* @param DateTime $startTime
*
* @return CForumForum
*/
@ -640,7 +706,7 @@ class CForumForum
/**
* Get startTime.
*
* @return \DateTime
* @return DateTime
*/
public function getStartTime()
{
@ -650,7 +716,7 @@ class CForumForum
/**
* Set endTime.
*
* @param \DateTime $endTime
* @param DateTime $endTime
*
* @return CForumForum
*/
@ -664,7 +730,7 @@ class CForumForum
/**
* Get endTime.
*
* @return \DateTime
* @return DateTime
*/
public function getEndTime()
{
@ -698,6 +764,8 @@ class CForumForum
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CForumForum
@ -705,6 +773,7 @@ class CForumForum
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}

@ -3,6 +3,8 @@
namespace Chamilo\CourseBundle\Entity;
use Database;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
/**
@ -154,6 +156,14 @@ class CGroupInfo
*/
protected $sessionId;
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CGroupInfo');
}
/**
* @var int needed for setting['group_document_access']
*

@ -4,14 +4,23 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Repository\ItemPropertyRepository;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\UserBundle\Entity\User;
use Database;
use DateTime;
use DateTimeZone;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
use Exception;
/**
* CItemProperty.
*
* @ORM\Table(name="c_item_property", indexes={@ORM\Index(name="idx_item_property_toolref", columns={"tool", "ref"})})
* @ORM\Entity(repositoryClass="Chamilo\CoreBundle\Entity\Repository\ItemPropertyRepository")
* @ORM\HasLifecycleCallbacks
*/
class CItemProperty
{
@ -31,13 +40,19 @@ class CItemProperty
*/
protected $id;
/** //, inversedBy="users",.
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", cascade={"persist"})
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
/**
* @var Course
*
* @ORM\ManyToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Course",
* inversedBy="itemProperties",
* cascade={"persist"}
* )
* @ORM\JoinColumn(name="c_id", referencedColumnName="id", nullable=true)
*/
protected $course;
/** //, inversedBy="users",.
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CGroupInfo", cascade={"persist"})
* @ORM\JoinColumn(name="to_group_id", referencedColumnName="iid")
*/
@ -55,9 +70,15 @@ class CItemProperty
*/
protected $insertUser;
/** //, inversedBy="users",.
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Session", cascade={"persist"})
* @ORM\JoinColumn(name="session_id", referencedColumnName="id")
/**
* @var Session
*
* @ORM\ManyToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Session",
* inversedBy="itemProperties",
* cascade={"persist", "remove"}
* )
* @ORM\JoinColumn(name="session_id", referencedColumnName="id", nullable=true)
*/
protected $session;
@ -69,14 +90,14 @@ class CItemProperty
protected $tool;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="insert_date", type="datetime", nullable=false)
*/
protected $insertDate;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="lastedit_date", type="datetime", nullable=false)
*/
@ -111,14 +132,14 @@ class CItemProperty
protected $visibility;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="start_visible", type="datetime", nullable=true)
*/
protected $startVisible;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="end_visible", type="datetime", nullable=true)
*/
@ -126,13 +147,52 @@ class CItemProperty
/**
* CItemProperty constructor.
*
* @param Course $course
*
* @throws Exception
*/
public function __construct(Course $course)
public function __construct($course)
{
$this->visibility = 1;
$this->course = $course;
$this->insertDate = new \DateTime('now', new \DateTimeZone('UTC'));
$this->lasteditDate = new \DateTime('now', new \DateTimeZone('UTC'));
$this->setCourse($course);
$this->insertDate = new DateTime('now', new DateTimeZone('UTC'));
$this->lasteditDate = new DateTime('now', new DateTimeZone('UTC'));
$this->lasteditUserId = api_get_user_id() ?: api_get_anonymous_id();
}
/**
* @return ItemPropertyRepository|EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CItemProperty');
}
/**
* @ORM\PreUpdate
*
* @throws Exception
*/
public function preUpdate()
{
$this->lasteditDate = new DateTime('now', new DateTimeZone('UTC'));
}
/**
* Copies iid to id if not set yet.
*
* @ORM\PostPersist
*
* @throws OptimisticLockException
*/
public function postPersist()
{
if (is_null($this->id)) {
$this->id = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush();
}
}
/**
@ -162,7 +222,7 @@ class CItemProperty
/**
* Set insertDate.
*
* @param \DateTime $insertDate
* @param DateTime $insertDate
*
* @return CItemProperty
*/
@ -176,7 +236,7 @@ class CItemProperty
/**
* Get insertDate.
*
* @return \DateTime
* @return DateTime
*/
public function getInsertDate()
{
@ -186,9 +246,11 @@ class CItemProperty
/**
* Set lasteditDate.
*
* @param DateTime $lasteditDate
*
* @return CItemProperty
*/
public function setLasteditDate(\DateTime $lasteditDate)
public function setLasteditDate($lasteditDate)
{
$this->lasteditDate = $lasteditDate;
@ -198,7 +260,7 @@ class CItemProperty
/**
* Get lasteditDate.
*
* @return \DateTime
* @return DateTime
*/
public function getLasteditDate()
{
@ -304,11 +366,11 @@ class CItemProperty
/**
* Set startVisible.
*
* @param \DateTime $startVisible
* @param DateTime $startVisible
*
* @return CItemProperty
*/
public function setStartVisible(\DateTime $startVisible = null)
public function setStartVisible(DateTime $startVisible = null)
{
$this->startVisible = $startVisible;
@ -318,7 +380,7 @@ class CItemProperty
/**
* Get startVisible.
*
* @return \DateTime
* @return DateTime
*/
public function getStartVisible()
{
@ -328,11 +390,11 @@ class CItemProperty
/**
* Set endVisible.
*
* @param \DateTime $endVisible
* @param DateTime $endVisible
*
* @return CItemProperty
*/
public function setEndVisible(\DateTime $endVisible = null)
public function setEndVisible(DateTime $endVisible = null)
{
$this->endVisible = $endVisible;
@ -342,7 +404,7 @@ class CItemProperty
/**
* Get endVisible.
*
* @return \DateTime
* @return DateTime
*/
public function getEndVisible()
{
@ -389,6 +451,9 @@ class CItemProperty
public function setSession($session)
{
$this->session = $session;
if (!is_null($session)) {
$session->getItemProperties()->add($this);
}
return $this;
}
@ -409,6 +474,7 @@ class CItemProperty
public function setCourse($course)
{
$this->course = $course;
$this->course->getItemProperties()->add($this);
return $this;
}
@ -462,9 +528,11 @@ class CItemProperty
}
/**
* @param User $insertUser
*
* @return $this
*/
public function setInsertUser(User $insertUser)
public function setInsertUser($insertUser)
{
$this->insertUser = $insertUser;
$this->lasteditUserId = $insertUser->getId();

@ -3,7 +3,11 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Database;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
/**
* CLink.
@ -16,6 +20,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CLink
{
@ -98,6 +103,66 @@ class CLink
*/
protected $sessionId;
/**
* @var Course
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="links")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
public function __construct()
{
$this->description = '';
$this->categoryId = 0;
$this->displayOrder = 0;
$this->onHomepage = '0';
$this->target = '_self';
$this->sessionId = 0;
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CLink');
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getLinks()->add($this);
return $this;
}
/**
* @ORM\PostPersist
*
* @throws OptimisticLockException
*/
public function postPersist()
{
if (is_null($this->id)) {
$this->id = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush($this);
}
}
/**
* Set url.
*
@ -317,6 +382,8 @@ class CLink
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CLink
@ -324,6 +391,7 @@ class CLink
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}

@ -3,7 +3,16 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Database;
use DateTime;
use DateTimeZone;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
use Exception;
/**
* CLp.
@ -16,6 +25,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CLp
{
@ -232,28 +242,28 @@ class CLp
protected $subscribeUsers;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="created_on", type="datetime", nullable=false)
*/
protected $createdOn;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="modified_on", type="datetime", nullable=false)
*/
protected $modifiedOn;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="publicated_on", type="datetime", nullable=true)
*/
protected $publicatedOn;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="expired_on", type="datetime", nullable=true)
*/
@ -266,20 +276,240 @@ class CLp
*/
protected $accumulateScormTime;
/**
* @var Course
* @ORM\ManyToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Course",
* inversedBy="learningPaths",
* cascade={"persist", "remove"}
* )
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
/**
* @var Session
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Session", inversedBy="learningPaths")
* @ORM\JoinColumn(name="session_id", referencedColumnName="id")
*/
/*protected $session;*/
/**
* @var CLpCategory
*
* @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CLpCategory", inversedBy="learningPaths")
* @ORM\JoinColumn(name="category_id", referencedColumnName="iid")
*/
/*protected $category;*/
/**
* @var ArrayCollection|CLpItem[]
*
* @ORM\OneToMany(
* targetEntity="CLpItem",
* mappedBy="learningPath",
* orphanRemoval=true
* )
*/
protected $items;
/**
* Constructor.
*
* @throws Exception
*/
public function __construct()
{
$this->sessionId = api_get_session_id();
$this->categoryId = 0;
$this->defaultViewMod = 'embedded';
$this->defaultEncoding = 'UTF-8';
$this->displayOrder = 0;
$this->contentLocal = 'local';
$this->preventReinit = true;
$this->useMaxScore = 1;
$this->createdOn = new \DateTime();
$this->lpType = 1;
$this->path = '';
$this->forceCommit = false;
$this->contentMaker = 'Chamilo';
$this->contentLicense = '';
$this->jsLib = '';
$this->debug = false;
$this->theme = '';
$this->previewImage = '';
$this->author = '';
$this->prerequisite = 0;
$this->hideTocFrame = false;
$this->seriousgameMode = false;
$this->autolaunch = 0;
$this->maxAttempts = 0;
$this->subscribeUsers = 0;
$this->createdOn = new DateTime('now', new DateTimeZone('utc'));
$this->modifiedOn = new DateTime('now', new DateTimeZone('utc'));
$this->accumulateScormTime = 1;
$this->items = new ArrayCollection();
}
public function __toString()
{
return sprintf('learning path %s ("%s") of %s', $this->id, $this->name, $this->course->__toString());
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CLp');
}
/**
* If course is not yet set, take the current course.
* Appends a number to name if it is already taken by another learning path in the same course.
* Computes displayOrder if still zéro.
*
* @ORM\PrePersist
*
* @throws Exception
*/
public function prePersist()
{
if (is_null($this->course)) {
$this->course = api_get_course_entity();
if (is_null($this->course)) {
throw new Exception('cannot persist a leaning path without course');
}
}
$coursesOtherLearningPaths = $this->course->getLearningPaths()->filter(function ($lp) {
return $this !== $lp;
});
$originalName = $this->name;
$counter = 0;
while ($coursesOtherLearningPaths->exists(function ($key, $lp) {
return $lp->name === $this->name;
})) {
$counter++;
$this->name = sprintf('%s - %d', $originalName, $counter);
}
if (0 == $this->displayOrder) {
$this->displayOrder = $coursesOtherLearningPaths->isEmpty()
? 1
: (
1 + max(
$coursesOtherLearningPaths->map(
function ($lp) {
return $lp->displayOrder;
}
)->toArray()
)
);
}
}
/**
* If id is null, copies iid to id and writes again.
* Updates item properties.
*
* @throws OptimisticLockException
*
* @ORM\PostPersist
*/
public function postPersist()
{
if (is_null($this->id)) {
$this->id = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush($this);
}
$courseInfo = api_get_course_info_by_id($this->course->getId());
$userId = api_get_user_id();
api_item_property_update(
$courseInfo,
TOOL_LEARNPATH,
$this->getId(),
'LearnpathAdded',
$userId
);
api_set_default_visibility(
$this->getId(),
TOOL_LEARNPATH,
0,
$courseInfo,
$this->getSessionId(),
$userId
);
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getLearningPaths()->add($this);
return $this;
}
/**
* @return Session
*/
/*public function getSession()
{
return $this->session;
}*/
/**
* @param Session $session
*
* @return $this
*/
/*public function setSession(Session $session)
{
$this->session = $session;
if (!is_null($session)) {
$this->session->getLearningPaths()->add($this);
}
return $this;
}*/
/**
* @return CLpCategory
*/
/*public function getCategory()
{
return $this->category;
}*/
/**
* @param CLpCategory $category
*
* @return $this
*/
/*public function setCategory(CLpCategory $category)
{
$this->category = $category;
if (!is_null($category)) {
$this->category->getLearningPaths()->add($this);
}
return $this;
}*/
/**
* Set lpType.
*
@ -859,7 +1089,7 @@ class CLp
/**
* Set createdOn.
*
* @param \DateTime $createdOn
* @param DateTime $createdOn
*
* @return CLp
*/
@ -873,7 +1103,7 @@ class CLp
/**
* Get createdOn.
*
* @return \DateTime
* @return DateTime
*/
public function getCreatedOn()
{
@ -883,7 +1113,7 @@ class CLp
/**
* Set modifiedOn.
*
* @param \DateTime $modifiedOn
* @param DateTime $modifiedOn
*
* @return CLp
*/
@ -897,7 +1127,7 @@ class CLp
/**
* Get modifiedOn.
*
* @return \DateTime
* @return DateTime
*/
public function getModifiedOn()
{
@ -907,7 +1137,7 @@ class CLp
/**
* Set publicatedOn.
*
* @param \DateTime $publicatedOn
* @param DateTime $publicatedOn
*
* @return CLp
*/
@ -921,7 +1151,7 @@ class CLp
/**
* Get publicatedOn.
*
* @return \DateTime
* @return DateTime
*/
public function getPublicatedOn()
{
@ -931,7 +1161,7 @@ class CLp
/**
* Set expiredOn.
*
* @param \DateTime $expiredOn
* @param DateTime $expiredOn
*
* @return CLp
*/
@ -945,7 +1175,7 @@ class CLp
/**
* Get expiredOn.
*
* @return \DateTime
* @return DateTime
*/
public function getExpiredOn()
{
@ -979,6 +1209,8 @@ class CLp
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CLp
@ -986,6 +1218,7 @@ class CLp
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}
@ -1059,4 +1292,70 @@ class CLp
{
return $this->subscribeUsers;
}
/**
* @return ArrayCollection|CLpItem[]
*/
public function getItems()
{
return $this->items;
}
/**
* Returns this learning path's final item.
*
* @return CLpItem|null the final item
*/
public function getFinalItem()
{
foreach ($this->items as $item) {
if ($item->getItemType() == TOOL_LP_FINAL_ITEM) {
return $item;
}
}
return null;
}
/**
* Returns this learning path's last item in first level that is not the final item.
*
* @return CLpItem|null the last item
*/
public function getLastItemInFirstLevel()
{
$last = null;
foreach ($this->items as $item) {
if (0 == $item->getParentItemId() && $item->getItemType() != TOOL_LP_FINAL_ITEM) {
if (is_null($last) || $last->getDisplayOrder() < $item->getDisplayOrder()) {
$last = $item;
}
}
}
return $last;
}
/**
* Updates this learning path's final item previous item id.
* Sets it to the last item in first level.
*
* @param bool $andFlush flush after persist
*
* @throws OptimisticLockException
*/
public function updateFinalItemsPreviousItemId($andFlush = true)
{
$finalItem = $this->getFinalItem();
if (!is_null($finalItem)) {
$last = $this->getLastItemInFirstLevel();
if (!is_null($last)) {
$finalItem->setPreviousItemId($last->getId());
Database::getManager()->persist($finalItem);
if ($andFlush) {
Database::getManager()->flush($finalItem);
}
}
}
}
}

@ -3,11 +3,15 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\UserBundle\Entity\User;
use Database;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Sortable\Entity\Repository\SortableRepository;
/**
* CLpCategory.
@ -53,7 +57,12 @@ class CLpCategory
/**
* @var CLpCategoryUser[]
*
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CLpCategoryUser", mappedBy="category", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLpCategoryUser",
* mappedBy="category",
* cascade={"persist", "remove"},
* orphanRemoval=true
* )
*/
protected $users;
@ -62,18 +71,69 @@ class CLpCategory
*/
protected $sessionId;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="learningPathCategories")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
/**
* @var CLp[]|ArrayCollection
*
* @ORM\OneToMany(
* targetEntity="Chamilo\CourseBundle\Entity\CLp",
* mappedBy="category",
* cascade={"persist", "remove"}
* )
*/
/*protected $learningPaths;*/
/**
* CLpCategory constructor.
*/
public function __construct()
{
$this->users = new ArrayCollection();
/*$this->learningPaths = new ArrayCollection();*/
$this->sessionId = 0;
}
/**
* @return EntityRepository|SortableRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CLpCategory');
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getLearningPathCategories()->add($this);
return $this;
}
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CLpCategory
@ -81,6 +141,7 @@ class CLpCategory
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}
@ -211,9 +272,11 @@ class CLpCategory
}
/**
* @param CLpCategoryUser $categoryUser
*
* @return bool
*/
public function hasUser(CLpCategoryUser $categoryUser)
public function hasUser($categoryUser)
{
if ($this->getUsers()->count()) {
$criteria = Criteria::create()->where(
@ -249,12 +312,22 @@ class CLpCategory
}
/**
* @param CLpCategoryUser $user
*
* @return $this
*/
public function removeUsers(CLpCategoryUser $user)
public function removeUsers($user)
{
$this->users->removeElement($user);
return $this;
}
/**
* @return CLp[]|ArrayCollection
*/
/*public function getLearningPaths()
{
return $this->learningPaths;
}*/
}

@ -3,7 +3,12 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Database;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
use Exception;
/**
* CLpItem.
@ -17,6 +22,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class CLpItem
{
@ -197,12 +203,181 @@ class CLpItem
*/
protected $prerequisiteMaxScore;
/**
* @var CLp
*
* @ORM\ManyToOne(
* targetEntity="Chamilo\CourseBundle\Entity\CLp",
* inversedBy="items",
* cascade={"persist", "remove"}
* )
* @ORM\JoinColumn(
* name="lp_id",
* referencedColumnName="iid",
* )
*/
protected $learningPath;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="learningPathItems")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
/**
* CLpItem constructor.
*/
public function __construct()
{
$this->ref = 0;
$this->minScore = 0;
$this->maxScore = 100.0;
$this->parentItemId = 0;
$this->previousItemId = 0;
$this->nextItemId = 0;
$this->displayOrder = 0;
$this->launchData = '';
$this->path = '';
}
public function __toString()
{
return sprintf(
'item %s (%s "%s") of %s',
$this->id,
$this->itemType,
$this->title,
$this->learningPath
);
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CLpItem');
}
/**
* If id is null, copies iid to id.
* If ref is empty or zero, copies iid to ref.
* if they still equal zero, computes displayOrder, previousItemId and nextItemId.
* If pointing to an enabled quiz, disables it and updates max score.
*
* @throws OptimisticLockException
* @throws Exception on quiz not found
*
* @ORM\PostPersist
*/
public function postPersist()
{
if (is_null($this->id)) {
$this->id = $this->iid;
}
if (is_null($this->ref) || empty($this->ref) || 0 == $this->ref) {
$this->ref = $this->iid;
}
if (empty($this->maxTimeAllowed)) {
$this->maxTimeAllowed = '0';
}
if (0 == $this->displayOrder) {
foreach ($this->getSiblings() as $sibling) {
if ($this->displayOrder < $sibling->displayOrder) {
$this->displayOrder = $sibling->displayOrder;
$this->previousItemId = 0;
}
}
if (0 == $this->displayOrder) {
$this->displayOrder = 1;
}
} else {
foreach ($this->getSiblings() as $sibling) {
if ($this->displayOrder === $sibling->displayOrder) {
$sibling->displayOrder++;
Database::getManager()->persist($sibling);
}
}
}
if (0 == $this->previousItemId) {
$previousSibling = $this->getPreviousSibling();
if (!is_null($previousSibling)) {
$this->previousItemId = $previousSibling->iid;
$previousSibling->nextItemId = $this->iid;
Database::getManager()->persist($previousSibling);
}
}
if (0 == $this->nextItemId) {
$nextSibling = $this->getNextSibling();
if (!is_null($nextSibling)) {
$this->nextItemId = $nextSibling->iid;
$nextSibling->previousItemId = $this->iid;
Database::getManager()->persist($nextSibling);
}
}
if ('quiz' === $this->itemType) {
/** @var CQuiz $quiz */
$quiz = CQuiz::getRepository()->find($this->path);
if (is_null($quiz)) {
throw new Exception('no quiz has id '.$this->path);
}
$this->setMaxScore($quiz->getMaxScore());
if ($quiz->getActive()) {
$quiz->setActive(false);
Database::getManager()->persist($quiz);
}
}
Database::getManager()->persist($this);
$this->learningPath->updateFinalItemsPreviousItemId(false);
Database::getManager()->flush();
}
/**
* Computes next sibling's previousItemId and previous sibling's nextItemId.
*
* @throws OptimisticLockException
*
* @ORM\PreRemove
*/
public function preRemove()
{
$previousSibling = $this->getPreviousSibling();
$nextSibling = $this->getNextSibling();
if (is_null($previousSibling)) {
if (!is_null($nextSibling)) {
$nextSibling->previousItemId = 0;
Database::getManager()->persist($nextSibling);
Database::getManager()->flush($nextSibling);
}
} else {
if (is_null($nextSibling)) {
$previousSibling->nextItemId = 0;
Database::getManager()->persist($previousSibling);
Database::getManager()->flush($previousSibling);
} else {
$previousSibling->nextItemId = $nextSibling->iid;
Database::getManager()->persist($previousSibling);
Database::getManager()->flush($previousSibling);
$nextSibling->previousItemId = $previousSibling->iid;
Database::getManager()->persist($nextSibling);
Database::getManager()->flush($nextSibling);
}
}
}
/**
* Updates the final item's previous item id.
*
* @ORM\PostRemove
*
* @throws OptimisticLockException
*/
public function postRemove()
{
$this->learningPath->updateFinalItemsPreviousItemId();
}
/**
@ -760,6 +935,8 @@ class CLpItem
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CLpItem
@ -767,6 +944,7 @@ class CLpItem
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}
@ -780,4 +958,100 @@ class CLpItem
{
return $this->cId;
}
/**
* Sets learning path AND course (copying the learning path's).
*
* @param CLp $clp
*
* @return CLpItem
*/
public function setLearningPath($clp)
{
$this->learningPath = $clp;
$clp->getItems()->add($this);
$this->setCourse($clp->getCourse());
return $this;
}
/**
* @return CLp
*/
public function getLearningPath()
{
return $this->learningPath;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getLearningPathItems()->add($this);
return $this;
}
/**
* Retrieves the list of this instance's siblings, that is all the other children of this item's parent.
*
* @return static[]
*/
public function getSiblings()
{
$siblings = [];
foreach (self::getRepository()->findByParentItemId($this->parentItemId) as $candidate) {
if ($candidate !== $this) {
$siblings[] = $candidate;
}
}
return $siblings;
}
/**
* Returns the previous sibling according to displayOrders only (not looking at previousItemId).
*
* @return static|null
*/
public function getPreviousSibling()
{
$previousSibling = null;
foreach ($this->getSiblings() as $sibling) {
if ($sibling->displayOrder < $this->displayOrder) {
if (is_null($previousSibling)) {
$previousSibling = $sibling;
} elseif ($sibling->displayOrder > $previousSibling->displayOrder) {
$previousSibling = $sibling;
}
}
}
return $previousSibling;
}
/**
* Returns the next sibling according to displayOrders only (not looking at nextItemId).
*
* @return static|null
*/
public function getNextSibling()
{
$nextSibling = null;
foreach ($this->getSiblings() as $sibling) {
if ($sibling->displayOrder > $this->displayOrder) {
if (is_null($nextSibling)) {
$nextSibling = $sibling;
} elseif ($sibling->displayOrder < $nextSibling->displayOrder) {
$nextSibling = $sibling;
}
}
}
return $nextSibling;
}
}

@ -3,7 +3,13 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Database;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
/**
* CQuiz.
@ -16,6 +22,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CQuiz
{
@ -64,9 +71,9 @@ class CQuiz
protected $sound;
/**
* @var bool
* @var int
*
* @ORM\Column(name="type", type="boolean", nullable=false)
* @ORM\Column(name="type", type="integer", nullable=false)
*/
protected $type;
@ -113,14 +120,14 @@ class CQuiz
protected $maxAttempt;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="start_time", type="datetime", nullable=true)
*/
protected $startTime;
/**
* @var \DateTime
* @var DateTime
*
* @ORM\Column(name="end_time", type="datetime", nullable=true)
*/
@ -156,7 +163,7 @@ class CQuiz
/**
* @var bool
* @ORm\Column(name="save_correct_answers", type="boolean", nullable=false)
* @ORM\Column(name="save_correct_answers", type="boolean", nullable=false)
*/
protected $saveCorrectAnswers;
@ -216,12 +223,83 @@ class CQuiz
*/
protected $exerciseCategoryId;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="quizzes")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
/**
* @var CQuizRelQuestion[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="Chamilo\CourseBundle\Entity\CQuizRelQuestion", mappedBy="quiz"))
*/
protected $relQuestions;
/**
* CQuiz constructor.
*/
public function __construct()
{
$this->hideQuestionTitle = false;
$this->type = ONE_PER_PAGE;
$this->random = 0;
$this->randomAnswers = false;
$this->active = true;
$this->resultsDisabled = 0;
$this->maxAttempt = 1;
$this->feedbackType = 0;
$this->expiredTime = 0;
$this->propagateNeg = 0;
$this->saveCorrectAnswers = false;
$this->reviewAnswers = 0;
$this->randomByCategory = 0;
$this->displayCategoryName = 0;
}
/**
* @return EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloCourseBundle:CQuiz');
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getQuizzes()->add($this);
return $this;
}
/**
* @ORM\PostPersist
*
* @throws OptimisticLockException
*/
public function postPersist()
{
if (is_null($this->id)) {
$this->id = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush($this);
}
}
/**
@ -299,7 +377,7 @@ class CQuiz
/**
* Set type.
*
* @param bool $type
* @param int $type
*
* @return CQuiz
*/
@ -313,7 +391,7 @@ class CQuiz
/**
* Get type.
*
* @return bool
* @return int
*/
public function getType()
{
@ -467,7 +545,7 @@ class CQuiz
/**
* Set startTime.
*
* @param \DateTime $startTime
* @param DateTime $startTime
*
* @return CQuiz
*/
@ -481,7 +559,7 @@ class CQuiz
/**
* Get startTime.
*
* @return \DateTime
* @return DateTime
*/
public function getStartTime()
{
@ -491,7 +569,7 @@ class CQuiz
/**
* Set endTime.
*
* @param \DateTime $endTime
* @param DateTime $endTime
*
* @return CQuiz
*/
@ -505,7 +583,7 @@ class CQuiz
/**
* Get endTime.
*
* @return \DateTime
* @return DateTime
*/
public function getEndTime()
{
@ -775,6 +853,8 @@ class CQuiz
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CQuiz
@ -782,6 +862,7 @@ class CQuiz
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}
@ -855,4 +936,17 @@ class CQuiz
return $this;
}
/**
* @return int sum of question's ponderation
*/
public function getMaxScore()
{
$maxScore = 0;
foreach ($this->relQuestions as $relQuestion) {
$maxScore += $relQuestion->getQuestion()->getPonderation();
}
return $maxScore;
}
}

@ -57,6 +57,22 @@ class CQuizRelQuestion
*/
protected $exerciceId;
/**
* @var CQuiz
*
* @ORM\ManyToOne(targetEntity="CQuiz", inversedBy="relQuestions")
* @ORM\JoinColumn(name="exercice_id", referencedColumnName="iid")
*/
protected $quiz;
/**
* @var CQuizQuestion
*
* @ORM\ManyToOne(targetEntity="Chamilo\CourseBundle\Entity\CQuizQuestion", inversedBy="relQuiz")
* @ORM\JoinColumn(name="question_id", referencedColumnName="iid")
*/
protected $question;
/**
* Set questionOrder.
*
@ -152,4 +168,14 @@ class CQuizRelQuestion
{
return $this->exerciceId;
}
public function getQuiz()
{
return $this->quiz;
}
public function getQuestion()
{
return $this->question;
}
}

@ -3,7 +3,10 @@
namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Database;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\OptimisticLockException;
/**
* CTool.
@ -16,6 +19,7 @@ use Doctrine\ORM\Mapping as ORM;
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class CTool
{
@ -126,6 +130,39 @@ class CTool
*/
protected $customIcon;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="tools")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/
protected $course;
public function __construct()
{
$this->admin = 0;
$this->address = 'squaregrey.gif';
$this->addedTool = false;
$this->target = '_self';
$this->sessionId = 0;
}
/**
* If id is null, copies iid to id and writes again.
*
* @ORM\PostPersist
*
* @throws OptimisticLockException
*/
public function postPersist()
{
if (is_null($this->id)) { // keep this test to avoid recursion
$this->id = $this->iid;
Database::getManager()->persist($this);
Database::getManager()->flush($this);
}
}
/**
* @return int
*/
@ -413,6 +450,8 @@ class CTool
/**
* Set cId.
*
* @deprecated use setCourse wherever possible
*
* @param int $cId
*
* @return CTool
@ -420,6 +459,7 @@ class CTool
public function setCId($cId)
{
$this->cId = $cId;
$this->setCourse(api_get_course_entity($cId));
return $this;
}
@ -473,4 +513,25 @@ class CTool
return $this;
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
*
* @return $this
*/
public function setCourse($course)
{
$this->course = $course;
$this->course->getTools()->add($this);
return $this;
}
}

@ -8,8 +8,13 @@ use Chamilo\CoreBundle\Entity\ExtraFieldValues;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser;
use Chamilo\CoreBundle\Entity\Skill;
use Chamilo\CoreBundle\Entity\UserCourseCategory;
use Chamilo\CoreBundle\Entity\UsergroupRelUser;
use Chamilo\UserBundle\Repository\UserRepository;
use Database;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\GroupInterface;
@ -459,6 +464,34 @@ class User implements UserInterface //implements ParticipantInterface, ThemeUser
return $this->getUsername();
}
/**
* @return UserRepository|EntityRepository
*/
public static function getRepository()
{
return Database::getManager()->getRepository('ChamiloUserBundle:User');
}
/**
* Sets usernameCanonical from the username needed.
* Sets emailCanonical from email if needed.
* Generate a random password if needed.
*
* @ORM\PrePersist
*/
public function prePersist()
{
if (empty($this->usernameCanonical)) {
$this->usernameCanonical = strtolower(trim($this->username));
}
if (empty($this->emailCanonical)) {
$this->emailCanonical = strtolower(trim($this->email));
}
if (empty($this->password)) {
$this->password = password_hash(mt_rand(), PASSWORD_BCRYPT);
}
}
/**
* Updates the id with the user_id.
*
@ -2593,16 +2626,16 @@ class User implements UserInterface //implements ParticipantInterface, ThemeUser
}
/**
* Retreives this user's related sessions.
* Retrieves this user's related sessions.
*
* @param int $relationType \Chamilo\CoreBundle\Entity\SessionRelUser::relationTypeList key
*
* @return \Chamilo\CoreBundle\Entity\Session[]
* @return Session[]
*/
public function getSessions($relationType)
{
$sessions = [];
foreach (\Database::getManager()->getRepository('ChamiloCoreBundle:SessionRelUser')->findBy([
foreach (Database::getManager()->getRepository('ChamiloCoreBundle:SessionRelUser')->findBy([
'user' => $this,
]) as $sessionRelUser) {
if ($sessionRelUser->getRelationType() == $relationType) {
@ -2616,7 +2649,7 @@ class User implements UserInterface //implements ParticipantInterface, ThemeUser
/**
* Retreives this user's related student sessions.
*
* @return \Chamilo\CoreBundle\Entity\Session[]
* @return Session[]
*/
public function getStudentSessions()
{
@ -2626,7 +2659,7 @@ class User implements UserInterface //implements ParticipantInterface, ThemeUser
/**
* Retreives this user's related DRH sessions.
*
* @return \Chamilo\CoreBundle\Entity\Session[]
* @return Session[]
*/
public function getDRHSessions()
{
@ -2638,7 +2671,7 @@ class User implements UserInterface //implements ParticipantInterface, ThemeUser
*
* @param int $relationType \Chamilo\CoreBundle\Entity\SessionRelUser::relationTypeList key
*
* @return \Chamilo\CoreBundle\Entity\Session[]
* @return Session[]
*/
public function getCurrentlyAccessibleSessions($relationType = 0)
{
@ -2651,4 +2684,36 @@ class User implements UserInterface //implements ParticipantInterface, ThemeUser
return $sessions;
}
/**
* Find the largest sort value in a given UserCourseCategory
* This method is used when we are moving a course to a different category
* and also when a user subscribes to courses (the new course is added at the end of the main category).
*
* Used to be implemented in global function \api_max_sort_value.
* Reimplemented using the ORM cache.
*
* @param UserCourseCategory|null $userCourseCategory the user_course_category
*
* @return int|mixed
*/
public function getMaxSortValue($userCourseCategory = null)
{
$categoryCourses = $this->courses->matching(
Criteria::create()
->where(Criteria::expr()->neq('relationType', COURSE_RELATION_TYPE_RRHH))
->andWhere(Criteria::expr()->eq('userCourseCat', $userCourseCategory))
);
return $categoryCourses->isEmpty()
? 0
: max(
$categoryCourses->map(
/** @var CourseRelUser $courseRelUser */
function ($courseRelUser) {
return $courseRelUser->getSort();
}
)->toArray()
);
}
}

Loading…
Cancel
Save