chamilo /
chamilo-lms
| 1 | <?php |
||
| 2 | |||
| 3 | /* For licensing terms, see /license.txt */ |
||
| 4 | |||
| 5 | use Chamilo\CoreBundle\Entity\CourseCategory; |
||
|
0 ignored issues
–
show
|
|||
| 6 | use Chamilo\CoreBundle\Entity\Repository\CourseCategoryRepository; |
||
| 7 | |||
| 8 | $cidReset = true; |
||
| 9 | require_once __DIR__.'/../inc/global.inc.php'; |
||
| 10 | $this_section = SECTION_PLATFORM_ADMIN; |
||
| 11 | |||
| 12 | api_protect_admin_script(); |
||
| 13 | |||
| 14 | $tool_name = get_lang('AddCourse'); |
||
| 15 | $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')]; |
||
| 16 | $interbreadcrumb[] = ['url' => 'course_list.php', 'name' => get_lang('CourseList')]; |
||
| 17 | |||
| 18 | $em = Database::getManager(); |
||
| 19 | /** @var CourseCategoryRepository $courseCategoriesRepo */ |
||
| 20 | $courseCategoriesRepo = $em->getRepository('ChamiloCoreBundle:CourseCategory'); |
||
| 21 | // Get all possible teachers. |
||
| 22 | $accessUrlId = api_get_current_access_url_id(); |
||
| 23 | |||
| 24 | // Build the form. |
||
| 25 | $form = new FormValidator('update_course'); |
||
| 26 | $form->addElement('header', $tool_name); |
||
| 27 | |||
| 28 | // Title |
||
| 29 | $form->addText( |
||
| 30 | 'title', |
||
| 31 | get_lang('Title'), |
||
| 32 | true, |
||
| 33 | [ |
||
| 34 | 'aria-label' => get_lang('Title'), |
||
| 35 | ] |
||
| 36 | ); |
||
| 37 | $form->applyFilter('title', 'html_filter'); |
||
| 38 | $form->applyFilter('title', 'trim'); |
||
| 39 | |||
| 40 | // Code |
||
| 41 | if (!api_get_configuration_value('course_creation_form_hide_course_code')) { |
||
| 42 | $form->addText( |
||
| 43 | 'visual_code', |
||
| 44 | [ |
||
| 45 | get_lang('CourseCode'), |
||
| 46 | get_lang('OnlyLettersAndNumbers'), |
||
| 47 | ], |
||
| 48 | false, |
||
| 49 | [ |
||
| 50 | 'maxlength' => CourseManager::MAX_COURSE_LENGTH_CODE, |
||
| 51 | 'pattern' => '[a-zA-Z0-9]+', |
||
| 52 | 'title' => get_lang('OnlyLettersAndNumbers'), |
||
| 53 | 'id' => 'visual_code', |
||
| 54 | ] |
||
| 55 | ); |
||
| 56 | |||
| 57 | $form->applyFilter('visual_code', 'api_strtoupper'); |
||
| 58 | $form->applyFilter('visual_code', 'html_filter'); |
||
| 59 | |||
| 60 | $form->addRule( |
||
| 61 | 'visual_code', |
||
| 62 | get_lang('Max'), |
||
| 63 | 'maxlength', |
||
| 64 | CourseManager::MAX_COURSE_LENGTH_CODE |
||
| 65 | ); |
||
| 66 | } |
||
| 67 | |||
| 68 | $countCategories = $courseCategoriesRepo->countAllInAccessUrl( |
||
| 69 | $accessUrlId, |
||
| 70 | api_get_configuration_value('allow_base_course_category') |
||
| 71 | ); |
||
| 72 | |||
| 73 | if ($countCategories >= 100) { |
||
| 74 | // Category code |
||
| 75 | $url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=search_category'; |
||
| 76 | |||
| 77 | $form->addElement( |
||
| 78 | 'select_ajax', |
||
| 79 | 'category_code', |
||
| 80 | get_lang('CourseFaculty'), |
||
| 81 | null, |
||
| 82 | ['url' => $url] |
||
| 83 | ); |
||
| 84 | } else { |
||
| 85 | $categories = $courseCategoriesRepo->findAllInAccessUrl( |
||
| 86 | $accessUrlId, |
||
| 87 | api_get_configuration_value('allow_base_course_category') |
||
| 88 | ); |
||
| 89 | $categoriesOptions = [null => get_lang('None')]; |
||
| 90 | /** @var CourseCategory $category */ |
||
| 91 | foreach ($categories as $category) { |
||
| 92 | $categoriesOptions[$category->getCode()] = (string) $category; |
||
| 93 | } |
||
| 94 | $form->addSelect( |
||
| 95 | 'category_code', |
||
| 96 | get_lang('CourseFaculty'), |
||
| 97 | $categoriesOptions |
||
| 98 | ); |
||
| 99 | } |
||
| 100 | |||
| 101 | if (api_get_configuration_value('course_creation_form_set_course_category_mandatory')) { |
||
| 102 | $form->addRule('category_code', get_lang('ThisFieldIsRequired'), 'required'); |
||
| 103 | } |
||
| 104 | |||
| 105 | $currentTeacher = api_get_user_entity(api_get_user_id()); |
||
| 106 | |||
| 107 | $form->addSelectAjax( |
||
| 108 | 'course_teachers', |
||
| 109 | get_lang('CourseTeachers'), |
||
| 110 | [$currentTeacher->getId() => UserManager::formatUserFullName($currentTeacher, true)], |
||
| 111 | [ |
||
| 112 | 'url' => api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=teacher_to_basis_course', |
||
| 113 | 'id' => 'course_teachers', |
||
| 114 | 'multiple' => 'multiple', |
||
| 115 | ] |
||
| 116 | ); |
||
| 117 | $form->applyFilter('course_teachers', 'html_filter'); |
||
| 118 | |||
| 119 | // Course department |
||
| 120 | $form->addText( |
||
| 121 | 'department_name', |
||
| 122 | get_lang('CourseDepartment'), |
||
| 123 | false, |
||
| 124 | ['size' => '60', 'id' => 'department_name'] |
||
| 125 | ); |
||
| 126 | $form->applyFilter('department_name', 'html_filter'); |
||
| 127 | $form->applyFilter('department_name', 'trim'); |
||
| 128 | |||
| 129 | // Department URL |
||
| 130 | $form->addText( |
||
| 131 | 'department_url', |
||
| 132 | get_lang('CourseDepartmentURL'), |
||
| 133 | false, |
||
| 134 | ['size' => '60', 'id' => 'department_url'] |
||
| 135 | ); |
||
| 136 | $form->applyFilter('department_url', 'html_filter'); |
||
| 137 | |||
| 138 | // Course language. |
||
| 139 | $languages = api_get_languages(); |
||
| 140 | if (count($languages['name']) === 1) { |
||
| 141 | // If there's only one language available, there's no point in asking |
||
| 142 | $form->addElement('hidden', 'course_language', $languages['folder'][0]); |
||
| 143 | } else { |
||
| 144 | $form->addSelectLanguage( |
||
| 145 | 'course_language', |
||
| 146 | get_lang('Ln'), |
||
| 147 | [], |
||
| 148 | ['style' => 'width:150px'] |
||
| 149 | ); |
||
| 150 | } |
||
| 151 | |||
| 152 | if (api_get_setting('teacher_can_select_course_template') === 'true') { |
||
| 153 | $form->addElement( |
||
| 154 | 'select_ajax', |
||
| 155 | 'course_template', |
||
| 156 | [ |
||
| 157 | get_lang('CourseTemplate'), |
||
| 158 | get_lang('PickACourseAsATemplateForThisNewCourse'), |
||
| 159 | ], |
||
| 160 | null, |
||
| 161 | ['url' => api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=search_course'] |
||
| 162 | ); |
||
| 163 | } |
||
| 164 | |||
| 165 | $form->addElement('checkbox', 'exemplary_content', '', get_lang('FillWithExemplaryContent')); |
||
| 166 | |||
| 167 | $group = []; |
||
| 168 | $group[] = $form->createElement('radio', 'visibility', get_lang('CourseAccess'), get_lang('OpenToTheWorld'), COURSE_VISIBILITY_OPEN_WORLD); |
||
| 169 | $group[] = $form->createElement('radio', 'visibility', null, get_lang('OpenToThePlatform'), COURSE_VISIBILITY_OPEN_PLATFORM); |
||
| 170 | $group[] = $form->createElement('radio', 'visibility', null, get_lang('Private'), COURSE_VISIBILITY_REGISTERED); |
||
| 171 | $group[] = $form->createElement('radio', 'visibility', null, get_lang('CourseVisibilityClosed'), COURSE_VISIBILITY_CLOSED); |
||
| 172 | $group[] = $form->createElement('radio', 'visibility', null, get_lang('CourseVisibilityHidden'), COURSE_VISIBILITY_HIDDEN); |
||
| 173 | |||
| 174 | $form->addGroup($group, '', get_lang('CourseAccess')); |
||
| 175 | |||
| 176 | $group = []; |
||
| 177 | $group[] = $form->createElement('radio', 'subscribe', get_lang('Subscription'), get_lang('Allowed'), 1); |
||
| 178 | $group[] = $form->createElement('radio', 'subscribe', null, get_lang('Denied'), 0); |
||
| 179 | $form->addGroup($group, '', get_lang('Subscription')); |
||
| 180 | |||
| 181 | $group = []; |
||
| 182 | $group[] = $form->createElement('radio', 'unsubscribe', get_lang('Unsubscription'), get_lang('AllowedToUnsubscribe'), 1); |
||
| 183 | $group[] = $form->createElement('radio', 'unsubscribe', null, get_lang('NotAllowedToUnsubscribe'), 0); |
||
| 184 | $form->addGroup($group, '', get_lang('Unsubscription')); |
||
| 185 | |||
| 186 | $form->addElement('text', 'disk_quota', [get_lang('CourseQuota'), null, get_lang('MB')], [ |
||
| 187 | 'id' => 'disk_quota', |
||
| 188 | ]); |
||
| 189 | $form->addRule('disk_quota', get_lang('ThisFieldShouldBeNumeric'), 'numeric'); |
||
| 190 | |||
| 191 | $obj = new GradeModel(); |
||
| 192 | $obj->fill_grade_model_select_in_form($form); |
||
| 193 | |||
| 194 | //Extra fields |
||
| 195 | $setExtraFieldsMandatory = api_get_configuration_value('course_creation_form_set_extra_fields_mandatory'); |
||
| 196 | $fieldsRequired = []; |
||
| 197 | if (false !== $setExtraFieldsMandatory && !empty($setExtraFieldsMandatory['fields'])) { |
||
| 198 | $fieldsRequired = $setExtraFieldsMandatory['fields']; |
||
| 199 | } |
||
| 200 | $extra_field = new ExtraField('course'); |
||
| 201 | $extra = $extra_field->addElements( |
||
| 202 | $form, |
||
| 203 | 0, |
||
| 204 | [], |
||
| 205 | false, |
||
| 206 | false, |
||
| 207 | [], |
||
| 208 | [], |
||
| 209 | [], |
||
| 210 | false, |
||
| 211 | false, |
||
| 212 | [], |
||
| 213 | [], |
||
| 214 | false, |
||
| 215 | [], |
||
| 216 | $fieldsRequired |
||
| 217 | ); |
||
| 218 | |||
| 219 | if (api_get_configuration_value('allow_course_multiple_languages')) { |
||
| 220 | // Course Multiple language. |
||
| 221 | $cbMultiLanguage = $form->getElementByName('extra_multiple_language'); |
||
| 222 | if (isset($cbMultiLanguage)) { |
||
| 223 | foreach ($languages['folder'] as $langFolder) { |
||
| 224 | $cbMultiLanguage->addOption(get_lang($langFolder), $langFolder); |
||
| 225 | } |
||
| 226 | } |
||
| 227 | } |
||
| 228 | |||
| 229 | $htmlHeadXtra[] = ' |
||
| 230 | <script> |
||
| 231 | |||
| 232 | $(function() { |
||
| 233 | '.$extra['jquery_ready_content'].' |
||
| 234 | }); |
||
| 235 | </script>'; |
||
| 236 | |||
| 237 | $form->addProgress(); |
||
| 238 | $form->addButtonCreate(get_lang('CreateCourse')); |
||
| 239 | |||
| 240 | // Set some default values. |
||
| 241 | $values['course_language'] = api_get_setting('platformLanguage'); |
||
| 242 | $values['disk_quota'] = round(api_get_setting('default_document_quotum') / 1024 / 1024, 1); |
||
| 243 | |||
| 244 | $default_course_visibility = api_get_setting('courses_default_creation_visibility'); |
||
| 245 | |||
| 246 | if (isset($default_course_visibility)) { |
||
| 247 | $values['visibility'] = api_get_setting('courses_default_creation_visibility'); |
||
| 248 | } else { |
||
| 249 | $values['visibility'] = COURSE_VISIBILITY_OPEN_PLATFORM; |
||
| 250 | } |
||
| 251 | $values['subscribe'] = 1; |
||
| 252 | $values['unsubscribe'] = 0; |
||
| 253 | $values['course_teachers'] = [$currentTeacher->getId()]; |
||
| 254 | |||
| 255 | // Relation to prefill course extra field with user extra field |
||
| 256 | $fillExtraField = api_get_configuration_value('course_creation_user_course_extra_field_relation_to_prefill'); |
||
| 257 | if (false !== $fillExtraField && !empty($fillExtraField['fields'])) { |
||
| 258 | foreach ($fillExtraField['fields'] as $courseVariable => $userVariable) { |
||
| 259 | $extraValue = UserManager::get_extra_user_data_by_field(api_get_user_id(), $userVariable); |
||
| 260 | $values['extra_'.$courseVariable] = $extraValue[$userVariable]; |
||
| 261 | } |
||
| 262 | } |
||
| 263 | |||
| 264 | $form->setDefaults($values); |
||
| 265 | |||
| 266 | // Validate the form |
||
| 267 | if ($form->validate()) { |
||
| 268 | $course = $form->exportValues(); |
||
| 269 | |||
| 270 | $course_teachers = isset($course['course_teachers']) ? $course['course_teachers'] : null; |
||
| 271 | $course['disk_quota'] = $course['disk_quota'] * 1024 * 1024; |
||
| 272 | $course['exemplary_content'] = empty($course['exemplary_content']) ? false : true; |
||
| 273 | $course['teachers'] = $course_teachers; |
||
| 274 | $course['wanted_code'] = isset($course['visual_code']) ? $course['visual_code'] : ''; |
||
| 275 | $course['gradebook_model_id'] = isset($course['gradebook_model_id']) ? $course['gradebook_model_id'] : null; |
||
| 276 | // Fixing category code |
||
| 277 | $course['course_category'] = isset($course['category_code']) ? $course['category_code'] : ''; |
||
| 278 | |||
| 279 | include_once api_get_path(SYS_CODE_PATH).'lang/english/trad4all.inc.php'; |
||
| 280 | $file_to_include = api_get_path(SYS_CODE_PATH).'lang/'.$course['course_language'].'/trad4all.inc.php'; |
||
| 281 | |||
| 282 | if (file_exists($file_to_include)) { |
||
| 283 | include $file_to_include; |
||
| 284 | } |
||
| 285 | |||
| 286 | $courseInfo = CourseManager::create_course($course); |
||
| 287 | if ($courseInfo && isset($courseInfo['course_public_url'])) { |
||
| 288 | Display::addFlash( |
||
| 289 | Display::return_message( |
||
| 290 | sprintf( |
||
| 291 | get_lang('CourseXAdded'), |
||
| 292 | Display::url($courseInfo['title'], $courseInfo['course_public_url']) |
||
| 293 | ), |
||
| 294 | 'confirmation', |
||
| 295 | false |
||
| 296 | ) |
||
| 297 | ); |
||
| 298 | } |
||
| 299 | |||
| 300 | header('Location: course_list.php'); |
||
| 301 | exit; |
||
| 302 | } |
||
| 303 | |||
| 304 | // Display the form. |
||
| 305 | $content = $form->returnForm(); |
||
| 306 | |||
| 307 | $tpl = new Template($tool_name); |
||
| 308 | $tpl->assign('content', $content); |
||
| 309 | $tpl->display_one_col_template(); |
||
| 310 |
Let?s assume that you have a directory layout like this:
. |-- OtherDir | |-- Bar.php | `-- Foo.php `-- SomeDir `-- Foo.phpand let?s assume the following content of
Bar.php:If both files
OtherDir/Foo.phpandSomeDir/Foo.phpare loaded in the same runtime, you will see a PHP error such as the following:PHP Fatal error: Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.phpHowever, as
OtherDir/Foo.phpdoes not necessarily have to be loaded and the error is only triggered if it is loaded beforeOtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias: