/** * Constructor * * @param mixed $categoryId null or valid category identifier * @param mixed $userId null or valid user identifier * @return ClaroCategoriesBrowser object */ function ClaroCategoriesBrowser($categoryId = null, $userId = null) { $this->categoryId = $categoryId; $this->userId = $userId; $this->currentCategory = new claroCategory(); $this->currentCategory->load($categoryId); $this->categoriesList = claroCategory::getCategories($categoryId, 1); $this->coursesList = claroCourse::getRestrictedCourses($categoryId, $userId); }
/** * Constructor * * @param mixed $categoryId null or valid category identifier * @param mixed $userId null or valid user identifier */ public function __construct($categoryId = null, $userId = null) { $this->categoryId = $categoryId; $this->userId = $userId; $this->currentCategory = new claroCategory(); $this->currentCategory->load($categoryId); $this->categoryList = claroCategory::getCategories($categoryId, 1); $this->coursesList = claroCourse::getRestrictedCourses($categoryId, $userId); $this->viewOptions = new CourseTreeViewOptions(); }
/** * insert or update course data * * @return boolean success */ public function save() { if (empty($this->courseId)) { // Insert $keys = define_course_keys($this->officialCode, '', get_conf('dbNamePrefix')); $courseSysCode = trim($keys['currentCourseId']); $courseDbName = trim($keys['currentCourseDbName']); $courseDirectory = trim($keys['currentCourseRepository']); if (empty($courseSysCode) || empty($courseDbName) || empty($courseDirectory)) { throw new Exception("Error missing data for course {$this->officialCode}"); } if (!$this->useExpirationDate) { $this->expirationDate = 'NULL'; } // Session courses are created without categories links: // so we duplicate the source course's categories links /*if ( !is_null($this->sourceCourseId) && !empty($this->sourceCourseId) ) { $sourceCourse = new claroCourse(); $sourceCourse->load(claroCourse::getCodeFromId($this->sourceCourseId)); $this->categories = $sourceCourse->categories; }*/ if (!is_null($this->sourceCourseId) && !empty($this->sourceCourseId)) { $sourceCourse = new claroCourse(); $sourceCourse->load(claroCourse::getCodeFromId($this->sourceCourseId)); if ($sourceCourse->sourceCourseId) { throw new Exception('You cannot create a course session from another course session'); } } if (prepare_course_repository($courseDirectory, $courseSysCode) && register_course($courseSysCode, $this->officialCode, $this->sourceCourseId, $courseDirectory, $courseDbName, $this->titular, $this->email, $this->categories, $this->title, $this->language, $GLOBALS['_uid'], $this->access, $this->registration, $this->registrationKey, $this->visibility, $this->departmentName, $this->extLinkUrl, $this->publicationDate, $this->expirationDate, $this->status, $this->userLimit) && install_course_database($courseDbName) && install_course_tools($courseDbName, $this->language, $courseDirectory)) { $courseObj = new Claro_Course($courseSysCode); $courseObj->load(); $courseRegistration = new Claro_CourseUserRegistration(AuthProfileManager::getUserAuthProfile($GLOBALS['_uid']), $courseObj, null, null); $courseRegistration->ignoreRegistrationKeyCheck(); $courseRegistration->ignoreCategoryRegistrationCheck(); $courseRegistration->setCourseAdmin(); $courseRegistration->setCourseTutor(); $courseRegistration->forceSuperUser(); if ($courseRegistration->addUser()) { // Set course id $this->courseId = $courseSysCode; // Notify event manager $args['courseSysCode'] = $courseSysCode; $args['courseDbName'] = $courseDbName; $args['courseDirectory'] = $courseDirectory; $args['courseCategory'] = $this->categories; $GLOBALS['eventNotifier']->notifyEvent("course_created", $args); return true; } else { $this->backlog->failure($courseRegistration->getErrorMessage()); return false; } } else { $lastFailure = claro_failure::get_last_failure(); $this->backlog->failure('Error : ' . $lastFailure); return false; } } else { // Update $tbl_mdb_names = claro_sql_get_main_tbl(); $tbl_course = $tbl_mdb_names['course']; $tbl_cdb_names = claro_sql_get_course_tbl(); $tbl_course_properties = $tbl_cdb_names['course_properties']; if (!$this->useExpirationDate) { $this->expirationDate = null; } $sqlExpirationDate = is_null($this->expirationDate) ? 'NULL' : 'FROM_UNIXTIME(' . claro_sql_escape($this->expirationDate) . ')'; $sqlCreationDate = is_null($this->publicationDate) ? 'NULL' : 'FROM_UNIXTIME(' . claro_sql_escape($this->publicationDate) . ')'; $sql = "UPDATE `" . $tbl_course . "`\n SET `intitule` = '" . claro_sql_escape($this->title) . "',\n `titulaires` = '" . claro_sql_escape($this->titular) . "',\n `administrativeNumber` = '" . claro_sql_escape($this->officialCode) . "',\n `language` = '" . claro_sql_escape($this->language) . "',\n `extLinkName` = '" . claro_sql_escape($this->departmentName) . "',\n `extLinkUrl` = '" . claro_sql_escape($this->extLinkUrl) . "',\n `email` = '" . claro_sql_escape($this->email) . "',\n `visibility` = '" . ($this->visibility ? 'visible' : 'invisible') . "',\n `access` = '" . claro_sql_escape($this->access) . "',\n `registration` = '" . claro_sql_escape($this->registration) . "',\n `registrationKey` = '" . claro_sql_escape($this->registrationKey) . "',\n `lastEdit` = NOW(),\n `creationDate` = " . $sqlCreationDate . ",\n `expirationDate` = " . $sqlExpirationDate . ",\n `status` = '" . claro_sql_escape($this->status) . "',\n `userLimit` = '" . (int) $this->userLimit . "'\n WHERE code='" . claro_sql_escape($this->courseId) . "'"; // Handle categories // 1/ Remove all links in database $this->unlinkCategories(); // 2/ Link new categories selection $this->linkCategories($this->categories); // If it's a source course, do the same for all its session courses if ($this->isSourceCourse) { $sql2 = "SELECT cours_id FROM `" . $tbl_course . "`\n WHERE sourceCourseId = " . $this->id; $sessionCourses = claro_sql_query_fetch_all_rows($sql2); foreach ($sessionCourses as $sessionCourse) { unlink_course_categories($sessionCourse['cours_id']); link_course_categories($sessionCourse['cours_id'], $this->categories); } } return claro_sql_query($sql); } }
define('DISP_COURSE_CREATION_PROGRESS', __LINE__); $display = DISP_COURSE_CREATION_FORM; // default display $dialogBox = new DialogBox(); $cmd = isset($_REQUEST['cmd']) ? $_REQUEST['cmd'] : null; $adminContext = isset($_REQUEST['adminContext']) ? (bool) $_REQUEST['adminContext'] : null; // $sourceCourseId has a value only if we're about to create a session course; it's null otherwise $sourceCourseId = isset($_REQUEST['course_sourceCourseId']) ? (int) $_REQUEST['course_sourceCourseId'] : null; // New course object $thisUser = claro_get_current_user_data(); $course = new ClaroCourse($thisUser['firstName'], $thisUser['lastName'], $thisUser['mail']); if (!is_null($sourceCourseId)) { $course->sourceCourseId = $sourceCourseId; } if (!is_null($course->sourceCourseId) && !empty($course->sourceCourseId)) { $sourceCourse = new claroCourse(); $sourceCourse->load(claroCourse::getCodeFromId($course->sourceCourseId)); if ($sourceCourse->sourceCourseId) { claro_die(get_lang('You cannot create a course session from another course session')); } $course->categories = $sourceCourse->categories; } if ($adminContext && claro_is_platform_admin()) { // From admin, add param to form $course->addHtmlParam('adminContext', '1'); } if (claro_is_platform_admin() || get_conf('courseCreationAllowed', true)) { if ($cmd == 'exEdit') { $course->handleForm(); if ($course->validate()) { if ($course->save()) {
/** * Display form. * * @param string $cancelUrl url of the cancel button * @return string html output of form */ public function displayForm($cancelUrl = null) { $languageList = claro_get_lang_flat_list(); $categoriesList = self::getAllCategories(); $coursesList = isset($this->id) ? claroCourse::getAllCourses($this->id) : array(); // Generate HTML options list for categories $categoriesHtmlList = '<option value="0">' . get_lang("None") . '</option>'; $disabled = false; $tempLevel = null; foreach ($categoriesList as $elmt) { // Enable/disable elements in the drop down list if (!empty($elmt['id']) && $elmt['id'] == $this->id) { $disabled = true; $tempLevel = $elmt['level']; } elseif (isset($tempLevel) && $elmt['level'] > $tempLevel) { $disabled = true; } else { $disabled = false; $tempLevel = null; } $categoriesHtmlList .= '<option value="' . $elmt['id'] . '" ' . (!empty($elmt['id']) && $elmt['id'] == $this->idParent ? 'selected="selected"' : '') . ($disabled ? 'disabled="disabled"' : '') . '>' . str_repeat(' ', 4 * $elmt['level']) . $elmt['name'] . ' (' . $elmt['code'] . ') </option>'; } // Generate HTML options list for courses $coursesHtmlList = '<option value="0">' . get_lang("None") . '</option>'; foreach ($coursesList as $elmt) { // Session courses can't become category courses if (is_null($elmt['sourceCourseId'])) { $coursesHtmlList .= '<option value="' . $elmt['id'] . '" ' . (!empty($elmt['id']) && $elmt['id'] == $this->rootCourse ? 'selected="selected"' : '') . '>' . $elmt['title'] . ' (' . $elmt['sysCode'] . ')</option>'; } } // TODO use a template if (is_null($cancelUrl)) { $cancelUrl = get_path('clarolineRepositoryWeb') . 'course/index.php?cid=' . claro_htmlspecialchars($this->id); } $html = ''; $html .= '<form method="post" id="categorySettings" action="' . $_SERVER['PHP_SELF'] . '" >' . "\n" . claro_form_relay_context() . '<input type="hidden" name="cmd" value="' . (empty($this->id) ? 'exAdd' : 'exEdit') . '" />' . "\n" . '<input type="hidden" name="claroFormId" value="' . uniqid('') . '" />' . "\n"; $html .= '<fieldset>' . "\n" . '<dl>' . "\n"; // Category identifier $html .= '<input type="hidden" name="category_id" value="' . $this->id . '" />' . "\n"; // Category name $html .= '<dt>' . '<label for="category_name">' . get_lang('Category name') . (get_conf('human_label_needed') ? '<span class="required">*</span> ' : '') . '</label></dt>' . '<dd>' . '<input type="text" name="category_name" id="category_name" value="' . claro_htmlspecialchars($this->name) . '" size="30" maxlength="100" />' . (empty($this->id) ? '<br /><span class="notice">' . get_lang('e.g. <em>Sciences of Economics</em>') . '</span>' : '') . '</dd>' . "\n"; // Category code $html .= '<dt>' . '<label for="category_code">' . get_lang('Category code') . '<span class="required">*</span> ' . '</label></dt>' . '<dd><input type="text" id="category_code" name="category_code" value="' . claro_htmlspecialchars($this->code) . '" size="30" maxlength="12" />' . (empty($this->id) ? '<br /><span class="notice">' . get_lang('max. 12 characters, e.g. <em>ROM2121</em>') . '</span>' : '') . '</dd>' . "\n"; // Category's parent $html .= '<dt>' . '<label for="category_parent">' . get_lang('Parent category') . '</label></dt>' . '<dd>' . '<select id="category_parent" name="category_parent" />' . $categoriesHtmlList . '</select>' . '</dd>' . "\n"; // Category's rank $html .= '<input type="hidden" name="category_rank" value="' . (empty($this->rank) ? 0 : $this->rank) . '" />' . "\n"; // Category's visibility $html .= '<dt>' . get_lang('Category visibility') . '<span class="required">*</span>' . '</dt>' . '<dd>' . '<input type="radio" id="visible" name="category_visible" value="1" ' . ($this->visible == 1 || !isset($this->visible) ? 'checked="checked"' : null) . ' />' . ' ' . '<label for="visible">' . get_lang('Visible') . '</label><br />' . '<input type="radio" id="hidden" name="category_visible" value="0" ' . ($this->visible == 0 && isset($this->visible) ? 'checked="checked"' : null) . ' />' . ' ' . '<label for="hidden">' . get_lang('Hidden') . '</label>' . '</dd>' . "\n"; // Category's right to possess courses $html .= '<dt>' . get_lang('Can have courses') . '<span class="required">*</span>' . '</dt>' . '<dd>' . '<input type="radio" id="can_have_courses" name="category_can_have_courses" value="1" ' . ($this->canHaveCoursesChild == 1 || !isset($this->canHaveCoursesChild) ? 'checked="checked"' : '') . ' />' . ' ' . '<label for="can_have_courses">' . get_lang('Yes') . '</label><br />' . '<input type="radio" id="cant_have_courses" name="category_can_have_courses" value="0" ' . ($this->canHaveCoursesChild == 0 && isset($this->canHaveCoursesChild) ? 'checked="checked"' : '') . ' />' . ' ' . '<label for="cant_have_courses">' . get_lang('No') . '</label><br />' . '<span class="notice">' . get_lang('Authorize the category to possess courses or not (opened or closed category)') . '</span>' . '</dd>' . "\n"; // Category's dedicated course/board $html .= '<dt>' . '<label for="category_root_course">' . get_lang('Category\'s board') . '</label></dt>' . '<dd>' . '<select id="category_root_course" name="category_root_course" />' . $coursesHtmlList . '</select><br />' . '<span class="notice">' . get_lang('Dedicate a course to this category. The course has to be linked to the category first.') . '</span>' . '</dd>' . "\n"; // Form's footer $html .= '</dl></fieldset>' . "\n" . '<span class="required">*</span> ' . get_lang('Denotes required fields') . '<br />' . "\n" . '<input type="submit" value="' . get_lang('Ok') . '" />' . "\n" . claro_html_button($_SERVER['PHP_SELF'], get_lang('Cancel')) . '</form>' . "\n"; return $html; }